한 포트에 반복적으로 연결되면 모든 트래픽을 차단하는 방법은 무엇입니까?

한 포트에 반복적으로 연결되면 모든 트래픽을 차단하는 방법은 무엇입니까?

맨페이지에는 iptables-extensions포트 139에 연결을 시도하는 IP 주소의 모든 트래픽을 차단하는 방법을 보여주는 예가 나와 있습니다.

iptables -A FORWARD -m recent --name badguy --rcheck --seconds 60 -j DROP
iptables -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name badguy --set -j DROP

누군가가 포트 22에 너무 자주 연결하면 일정 기간 동안 완전히(모든 트래픽) 차단되지만 일부 초기 연결은 허용되도록 이 설정을 수정하려고 합니다. 그러나 기존 활성 연결을 차단하고 싶지 않고 새 연결만 차단하고 싶습니다.

나는 이것을 시도했습니다 :

iptables -A INPUT -i eno3 -m state --state NEW -m recent --rcheck --seconds 300 --reap --hitcount 3 --name sshthrottle -j DROP
iptables -A INPUT -i eno3 -m state --state NEW -m recent --set --name sshthrottle -p tcp --dport 22

하지만 지금 일어나는 일은 들어오는 연결이어느포트는 차단을 트리거하므로 예를 들어 포트 80에서 세 번 연결되면 IP가 300초 동안 차단됩니다. 이 블록이 어떤 포트에 연결되어 있을 때 활성화되는 것이 아니라 포트 22에 연결될 때만 활성화되기를 바랍니다.

내가 뭘 잘못했나요?

(참고로 Google에는 SSH 트래픽을 제한하는 몇 가지 예가 있다는 것을 알고 있지만 모두 라인 --dport의 규칙을 복제합니다 --rcheck. 즉, SSH 트래픽만 차단되는 반면 Connected로 모든 포트를 차단하고 싶습니다. 내 문제는 사용에 관한 것이 아닙니다. 차단 - 트래픽이 성공적으로 차단되었습니다. 그러나 트리거를 사용하면 모든 포트가 아닌 포트 22만 차단을 트리거하기를 원합니다.

답변1

좋아요, 그게 뭔지 알아보세요. 명령줄의 매개변수 순서에 iptables따라 차이가 있다는 사실을 깨닫지 못했습니다 .

나는 이것을 가지고있다:

-m state --state NEW -m recent --set --name sshthrottle -p tcp --dport 22

이는 다음과 같이 말합니다.

  1. 상태가 NEW인 경우
  2. sshthrottle IP 목록에 SET(추가)
  3. 그런 다음 포트 22에 연결되어 있는지 확인하십시오.
  4. 아무것도 하지 않고 다음 규칙을 계속합니다.

물론 포트 22인지 확인하십시오.뒤쪽에목록에 IP가 추가되었습니다.

순서를 다음과 같이 변경하면 됩니다.

-m state --state NEW -p tcp --dport 22 -m recent --set --name sshthrottle

물론 이는 다음과 같이 해석됩니다.

  1. 상태가 NEW인 경우
  2. TCP 포트는 22입니다.
  3. 그런 다음 sshthrottle IP 목록에 SET(추가)합니다.
  4. 아무것도 하지 않고 다음 규칙을 계속합니다.

물론 중요한 점은 이 --set매개변수가 IP를 발견한 후 목록에 추가한다는 것입니다. 따라서 이 매개변수가 예상대로 작동하려면 명령줄의 마지막 매개변수 중 하나여야 합니다.

실제로 --set매개변수는 대상이어야 합니다(예: -j SETRECENT). 일반적으로 대상만 작업을 수행하기 때문에 example은 -j LOG매개변수가 아니라 대상입니다 --log.

관련 정보