포트 80에 httpd가 있는 Ubuntu 12.04 서버가 있으며 다음을 제한하려고 합니다.
- IP 주소당 httpd에 대한 최대 연결 수는 10입니다.
- 초당 httpd에 대한 최대 새 연결 수는 150입니다.
iptables를 사용하여 이를 어떻게 수행합니까?
답변1
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
초당 150개의 새 연결(패킷) 제한이 적용되기 전에는 160개의 새 연결(실제로는 패킷)이 허용됩니다.
답변2
질문의 두 요구 사항을 모두 충족하기 위해 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
-I(OP의 요청에 따라)를 사용하기 때문에 아래에서 위로 "읽기" 위해서는 역순으로 실행해야 합니다.
또한 --connlimit-mask NN을 32에서 24로 변경하는 것을 고려하는 것이 좋습니다. 이는 전체 클래스 C 네트워크(동일한 범위에서 최대 256개의 IP 주소)를 10개의 연결로 제한합니다. 서비스 사용 방법에 따라 22 또는 30과 같은 기타 분류되지 않은 번호를 사용할 수도 있습니다.
또한 고객이 어떻게 행동하기를 원하는지에 따라가능한위의 두 규칙 또는 최대 150개 연결 규칙에서 "-j DROP" 대신 "-j REJECT --reject-with tcp-reset"을 사용하고 싶었습니다.
연결을 거부하면 포트 80을 사용하는 브라우저나 소프트웨어는 즉시 "사용할 수 없음" 상태를 표시하지만 DROP 옵션을 사용하면 사이트를 사용할 수 없는 것으로 보고하기 전에 클라이언트가 여러 번 기다리고 다시 시도하게 됩니다. 나 자신도 DROP을 사용하는 경향이 있는데, 이는 오프라인 서버보다 연결 상태가 좋지 않은 것처럼 동작하기 때문입니다.
또한 재시도 중에 연결 제한이 150(또는 10) 미만으로 떨어지면 결국 서버에 도달하게 됩니다.
그러나 REJECT 옵션을 사용하면 DROP을 사용하면 재시도할 때 추가 패킷을 보내게 되므로 사이트의 트래픽이 약간 감소합니다. 아마도 그다지 관련이 없을 것입니다.
반면, 포트 80 트래픽이 클러스터의 일부인 경우 REJECT는 클러스터 컨트롤러에 다운되었음을 알리고 재시도 시간 초과 동안 트래픽 전송을 중지합니다.
RELATED,ESTABLISHED 규칙은 기본 규칙이 모든 트래픽을 차단하는 것이라고 가정합니다(iptables -t filter -P INPUT DROP). 이는 이미 허용된 연결에 속하는 추가 패킷만 허용합니다.
또한 --syn은 TCP 연결을 설정하는 패킷에 주의(또는 계산)하도록 지시합니다.
답변3
connlimit
클라이언트 IP 주소(또는 주소 블록)당 서버에 대한 병렬 TCP 연결 수를 제한할 수 있는 모듈을 사용해야 합니다 .
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 -j DROP