답변:
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
이것은 하나의 소스 IP에서 15 이상의 연결을 거부합니다.
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT
이 160 개의 초당 새로운 연결 (패킷) 제한이 적용되기 전에 160 개의 새로운 연결 (실제로 패킷)이 허용됩니다.
-m conntrack --ctstate
대신에 사용 을 고려할 수도 있습니다 -m state --state
. conntrack은 새롭고 개선 된 상태입니다.
NEW
연결에 두 번째 규칙을 추가하는 위의 주석 -그렇게하지 마십시오-효과적으로 INPUT
체인을 기본값으로 바꿉니다 accept
!!!
iptables의 다음 규칙이 질문의 두 요구 사항에 모두 답하기를 원합니다.
iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 80 -m state \
--state RELATED,ESTABLISHED -j ACCEPT
# Adjust "--connlimit-above NN" to limit the maximum connections per IP
# that you need.
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 --connlimit-mask 32 -j DROP
# Adjust "--connlimit-above NNN" to the maximum total connections you
# want your web server to support
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 150 -j DROP
OP 요청에 따라 -I를 사용하기 때문에 역순으로해야하므로 맨 아래부터 '읽어'야합니다.
또한 --connlimit-mask NN 변경을 32에서 24로 고려하는 것이 좋습니다. 이렇게하면 전체 Class-C 네트워크 (같은 범위에서 최대 256 개의 IP 주소)가 10 개의 연결로 제한됩니다. 서비스 사용 방법에 따라 22 또는 30과 같은 다른 클래스리스 번호를 사용할 수도 있습니다.
또한 클라이언트의 동작 방식에 따라 위의 두 규칙 또는 최대 150 개의 연결에서만 "-j DROP"대신 "-j REJECT --reject-with tcp-reset"을 사용할 수 있습니다. 규칙.
연결을 거부하면 포트 80을 사용하는 브라우저 나 소프트웨어에 즉시 "사용할 수 없음"상태가 표시되지만 DROP 옵션을 사용하면 사이트를 사용할 수없는 것으로보고하기 전에 클라이언트가 몇 번 기다렸다가 다시 시도하게됩니다. 오프라인 서버보다 연결이 잘못되어 DROP에 의존하는 경향이 있습니다.
또한 다시 시도하는 동안 연결 제한이 150 (또는 10) 아래로 내려 가면 결국 서버로 전달됩니다.
DROP은 재 시도하는 동안 추가 패킷을 보내므로 REJECT 옵션을 사용하면 사이트에 대한 트래픽이 훨씬 줄어 듭니다. 아마도 그와 관련된 것은 아닙니다.
반면에 포트 80 트래픽이 클러스터의 일부인 경우 REJECT는 클러스터 컨트롤러에 다운되었음을 알리고 재시도 시간 초과 동안 트래픽 전송을 중지합니다.
관련, 성립 규칙은 기본 규칙이 모든 트래픽을 차단하는 것으로 가정합니다 (iptables -t filter -P INPUT DROP). 허용 된 연결에 속하는 추가 패킷 만 허용합니다.
또한 --syn은 TCP 연결을 설정하는 패킷에주의를 기울이거나 계산하도록 지시합니다.
connlimit
클라이언트 IP 주소 (또는 주소 블록) 당 서버로 병렬 TCP 연결 수를 제한 할 수 있는 모듈 을 사용해야합니다 .
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 -j DROP