맨페이지에는 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
이는 다음과 같이 말합니다.
- 상태가 NEW인 경우
- sshthrottle IP 목록에 SET(추가)
- 그런 다음 포트 22에 연결되어 있는지 확인하십시오.
- 아무것도 하지 않고 다음 규칙을 계속합니다.
물론 포트 22인지 확인하십시오.뒤쪽에목록에 IP가 추가되었습니다.
순서를 다음과 같이 변경하면 됩니다.
-m state --state NEW -p tcp --dport 22 -m recent --set --name sshthrottle
물론 이는 다음과 같이 해석됩니다.
- 상태가 NEW인 경우
- TCP 포트는 22입니다.
- 그런 다음 sshthrottle IP 목록에 SET(추가)합니다.
- 아무것도 하지 않고 다음 규칙을 계속합니다.
물론 중요한 점은 이 --set
매개변수가 IP를 발견한 후 목록에 추가한다는 것입니다. 따라서 이 매개변수가 예상대로 작동하려면 명령줄의 마지막 매개변수 중 하나여야 합니다.
실제로 --set
매개변수는 대상이어야 합니다(예: -j SETRECENT
). 일반적으로 대상만 작업을 수행하기 때문에 example은 -j LOG
매개변수가 아니라 대상입니다 --log
.