포트에 연결된 클라이언트(IP) 수를 제한하는 방법이 있습니까? (우분투 22)

포트에 연결된 클라이언트(IP) 수를 제한하는 방법이 있습니까? (우분투 22)

특정 포트에 연결할 수 있는 IP 수를 제한하는 방법을 찾으려고 합니다. 다음은 포트에 연결된 고유 IP 수를 반환하는 간단한 예입니다.

netstat -ntu | grep :80 | grep -v LISTEN | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | grep -v 127.0.0.1 | wc -l

또는 조건이 있는 스크립트는 위 코드가 조건을 충족할 때 새 IP로부터의 연결을 거부할 수 있습니다.

아니면 iptables로 할 수도 있겠네요

나도 이 코드 봤어

iptables -A INPUT -p tcp --syn -dport 80 -m iplimit --iplimit-above 10 -J REJECT

하지만 iplimit 또는 --iplimit-above에 대한 문서를 찾지 못했습니다.

답변1

~ 중에iptables확장하다, 이것connlimit일치는 다음을 수행할 수 있습니다.

connlimit

클라이언트 IP 주소(또는 클라이언트 주소 블록)당 서버에 대한 병렬 연결 수를 제한할 수 있습니다.

그것은원래는 호출 iplimit되었으나 이름이 변경되었습니다(2003!)connlimit:

iplimit의 이름을 connlimit로 바꿉니다.

그것은에 달려있다연결하다진행 중인 설정된 연결의 현재 상태를 추적하는 하위 시스템입니다. 따라서 이 일치 항목은 최종 노드에서 사용되는 필터/입력뿐만 아니라 필터/전달의 라우터(컨테이너 또는 VM을 호스팅하는 시스템 포함)에서도 사용할 수 있습니다.

귀하의 예는 다음과 같이 번역됩니다.

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT

기본적으로 제한사항은 소스 주소별로 적용됩니다.

--connlimit-mask접두사 길이

[...] 지정하지 않으면 해당 프로토콜의 최대 접두사 길이가 사용됩니다.

IPv4의 경우 /32, IPv6의 경우 /128을 의미합니다.

--connlimit-saddr

[...] 이것이 기본값입니다 [...]

전역 제한의 경우 --connlimit-mask 0추가 옵션을 사용할 수 있습니다.

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 0 -j REJECT

OP의 초기 명령은 127.0.0.1을 제외하므로 이러한 연결이 다음 규칙에서 고려되지 않도록 최종(최적화되지 않은) 결과를 얻으려면 앞에 예외를 삽입해야 합니다.

iptables -A INPUT -p tcp --syn --dport 80 -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 0 -j REJECT

이전 규칙을 즉시 대체하거나 소유할 -s 127.0.0.1수도 있어 모든 규칙이 공통되도록 할 수 있습니다.-i lo-i lo


-p tcp --syn --dport 80블록은 기본 시간 제한을 고려하면 다른 데이터그램 지향 프로토콜(UDP, ICMP...)에 사용할 수 있습니다 -p tcp --dport 80 -m conntrack --ctstate new. --ctstate new예를 들어, 동시에 두 개의 (전역) 진행 중인 핑(ICMP 에코 요청)에 대한 응답을 제한하려면 다음을 수행하십시오.

iptables -I INPUT -p icmp --icmp-type echo-request -m conntrack --ctstate NEW -m connlimit --connlimit-above 2 --connlimit-mask 0 -j DROP

참고: 다음과 같은연결하다ICMP를 사용하는 항목은 30초에 시간 초과되며 "슬롯"을 다시 사용할 수 있게 되기까지 30초가 걸리며 이전에 허용된 명령 두 개 중 하나가 종료된 후 새 명령이 응답을 받을 수 있게 됩니다 ping.ping

관련 정보