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


37

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

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

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

답변:


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


1
위의 포트는 포트 80이 아닌 모든 포트에서 작동하도록 설정할 수 있습니까?
EminezArtus

1
이것이 IP 당입니까?
LatinSuD

2
모든 포트에 대해이 규칙을 설정하려면 --dport 80을 제거하십시오.
Dan Pritts

5
두 번째 규칙은 "새 연결"에서 작동하지 않습니다. 기존 ( "ESTABLISHED") 연결에 명시 적으로 영향을줍니다. 새로운 연결을하려면 --state NEW를 원할 것입니다. -m conntrack --ctstate대신에 사용 을 고려할 수도 있습니다 -m state --state. conntrack은 새롭고 개선 된 상태입니다.
Dan Pritts 2016 년

2
NEW연결에 두 번째 규칙을 추가하는 위의 주석 -그렇게하지 마십시오-효과적으로 INPUT체인을 기본값으로 바꿉니다 accept!!!
스튜어트 Cardall

8

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 연결을 설정하는 패킷에주의를 기울이거나 계산하도록 지시합니다.


이러한 명령을 최소화 해 주셔서 감사합니다.
txyoji

전체 범위가 아닌 특정 IP 주소 만 차단하기 위해 --connlimit-mask를 사용할 수 있습니까?
Analog

--connlimit-mask 32 단일 주소 제한입니다. 즉, / 32 넷 마스크와 같습니다. 24와 같이 작은 것은 / 24 넷 마스크와 같으며 하위 8 비트는 무시합니다.
Ian Macintosh

5

connlimit클라이언트 IP 주소 (또는 주소 블록) 당 서버로 병렬 TCP 연결 수를 제한 할 수 있는 모듈 을 사용해야합니다 .

/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
      --connlimit-above 10 -j DROP

귀하의 답변을 업데이트했지만 여전히 괜찮기를 바랍니다 ( "--syn"이 필요한 이유는 무엇입니까?). "초당 최대 연결 수 (포트 80, TCP)에서 150까지"는 어떻습니까? 감사합니다!
evachristine

--syn은 규칙이 syn 플래그를 사용하여 TCP 패킷 만 확인한다는 것을 의미하며 이는 새로운 연결을 의미합니다. -m state --state NEW와 거의 동일하게 수행 할 수 있지만 아마도 더 빠를 것입니다.
Dan Pritts 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.