
포트 80에 httpd가 있는 Ubuntu 12.04 서버가 있으며 다음을 제한하려고 합니다.
- httpd에 대한 IP 주소당 최대 연결 수는 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
이 160개의 새로운 연결(실제로는 패킷)은 초당 150개의 새로운 연결(패킷) 제한이 적용되기 전에 허용됩니다.
답변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이 오프라인 서버보다 연결 상태가 좋지 않은 것처럼 행동하기 때문에 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