[unix] iptables로 IP 주소 당 최대 연결 수 및 초당 새로운 연결 수 제한

포트 80에 httpd가있는 Ubuntu 12.04 서버가 있으며 다음을 제한하려고합니다.

  • IP 주소 당 최대 연결 수는 httpd ~ 10
  • httpd에서 150까지의 초당 최대 새 연결

iptables로 어떻게 이것을 할 수 있습니까?



답변

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 개의 새로운 연결 (실제로 패킷)이 허용됩니다.


답변

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


답변