옵션 1 - 글로벌

옵션 1 - 글로벌

최대 한도를 제한할 수 있나요?기간iptablesTCP 연결?

iptables수량을 제한할 수 있어요동시에IP 주소당 TCP 연결 수, 다음을 사용하여 -m connlimitIP 주소당 TCP 연결 수를 제한할 수도 있습니다.새로운을 사용하여 시간 간격당 IP 주소당 연결 수입니다 -m hashlimit. 현재 원하는 효과를 얻기 위해 다음 규칙을 사용하고 있습니다.

iptables -A INPUT -m tcp -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP
iptables -A INPUT -m tcp -p tcp --dport 80 -m state --state NEW -m hashlimit --hashlimit-above 15/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name rtlimit -j DROP

그러나 "설정된" TCP 연결이 유지되도록 하는 방법이 있습니까?폐쇄뒤쪽에최대 n"오래 지속되는" 연결을 방지하려면 초가 필요합니까? (여전히 "활성"인지 여부)

나는 사람들이 다음과 같이 제안하는 것을 보았습니다.

iptables -A INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -m limit --limit 1/minute -j DROP

그러나 이것이 실제로 내가 원하는 효과를 달성하지는 못한다고 생각합니다. 내가 이해하는 바에 따르면 위의 규칙은 "설정된" 연결에 속하는 모든 패킷을 삭제합니다.그리고수신 속도는 분당 하나의 패킷보다 "더 빠릅니다". 1분이 지나도 연결이 닫히지 않겠죠?

실제로 이것을 달성할 수 있는 방법이 있나요 iptables?

답변1

업데이트: 내 답변에는 두 가지 문제가 있습니다. 1) 질문의 "아직 "활성"인지 여부에 관계없이"부분에 대답하지 않았습니다. 2) 질문은 iptables (netfilter) 추적에서 연결을 제거하는 것이 아니라 연결 끝점에서 소켓을 닫는 것에 관한 것입니다. 업데이트를 종료합니다.

여기에는 두 가지 옵션이 있습니다.

옵션 1 - 글로벌

적절한 전역 netfilter 변수를 수정하여 설정된 모든 연결에 대한 유휴 시간 초과 값을 제한합니다.

다음 명령을 사용하여 현재 기본값을 확인합니다.

cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established

다음 명령을 사용하여 기본값을 수정합니다(예: 600초).

echo 600 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established

옵션 2 - 세분화된

시간 초과 정책을 설정하고 iptables 명령과 함께 정책을 사용하여 특정 연결에 대해 설정된 연결의 유휴 시간 초과 값을 제한할 수 있습니다.

시간 초과 정책을 설정합니다.

nfct add timeout nam1 inet tcp established 600

iptables 규칙에 이 정책을 적용합니다.

iptables -I PREROUTING -t raw -p tcp -j CT --timeout nam1
iptables -I OUTPUT -t raw -p tcp -j CT --timeout nam1

debian/ubuntu의 동일한 이름(nfct) 패키지에서 제공되는 nfct 도구를 설치해야 할 수도 있습니다.

추가 정보

man iptables-extensionsCT 타겟에 대한 일부 정보를 표시합니다.

man nfct귀하가 요청한 정보에 가까운 예를 보여줍니다. (이름이 4글자를 넘을 경우 타임아웃 정책을 사용하는데 문제가 있을 수 있습니다.)

conntrack 도구는 연결의 다양한 이벤트(예: conntrack -E -p tcp)에서 발생하는 상황을 추적하는 데 유용합니다.

답변2

이제 다른 "해결책"을 생각해 냈습니다.

ss나는 cronjob으로 실행되고(1분에 한 번) 명령과 일부 마법을 사용하여 "설정된" 모든 연결을 파일에 덤프하는 작은 스크립트를 작성했습니다 grep. 또한 마지막 실행의 "이전" 파일도 보관했습니다. 이렇게 하면 두 파일을 연결한 다음 plus 를 사용하여 sort마지막 실행 이후 "지속"된 연결을 식별 할 수 있습니다 uniq -d. 그런 다음 이 명령을 사용하여 이러한 연결을 명시적으로 닫습니다 ss --kill. 나를 위해 일하는 것 같습니다.

(예, 정확한 시간 초과는 아니지만 아마도 내 목적에 "충분"할 것입니다)


현재 "설정된" 연결을 나열합니다.

ss -o state established

"중복" 행만 가져오기:

cat file1.txt file2.txt | sort | uniq -d

연결을 닫습니다. 예를 들면 다음과 같습니다.

s --kill -o state established "( dst ${ip} and dport = ${port} )"

관련 정보