요약하면 다음과 같습니다.

요약하면 다음과 같습니다.

다음 규칙을 추가하면 iptables모든 것이 예상대로 작동합니다. 위반 IP가 추가 BLACKLIST및 제거 됩니다 .

iptables -A INPUT -m recent --rsource --name BLACKLIST --update -j DROP

iptables내 규칙을 다음과 같이 나열 할 때 iptables-save:

-A INPUT -i eth0 -m recent --update --name BLACKLIST --mask 255.255.255.255 --rsource -j DROP

그러나 규칙에 다른 마스크를 명시적으로 지정하면 다음에서 변경된 마스크가 표시 iptables-save되지만 전체 서브넷을 차단하는 원하는 효과가 없습니다 .

-A INPUT -i eth0 -m recent --update --name BLACKLIST --mask 255.255.0.0 --rsource -j DROP

하지만 개별 IP가 전달되는 것을 볼 수 있습니다.

128.90.177.13
128.90.177.136
128.90.177.35

내 블랙리스트에 개별적으로 추가되었습니다.

마스크가 유효하면 첫 번째 IP 128.90.177.13이 블랙리스트에 추가되고 동일한 서브넷의 다른 IP가 차단됩니다. 그러나 그것은 진실이 아니다. 그들은 내 규칙을 따랐습니다.

iptables의 최신 --mask가 작동하지 않는 이유는 무엇입니까?

커널 4.14.274에서 iptables 모듈을 사용하고 있습니다.

요약하면 다음과 같습니다.

문제가 되는 IP를 블랙리스트에 추가하고 넷마스크를 기반으로 해당 IP의 전체 서브넷을 차단하고 싶습니다.

답변1

전체 netfilter 구성을 보지 않으면 환경에서 무슨 일이 일어나고 있는지 파악하기 어려울 수 있습니다. 그러나 여기서는 간단한 것을 조립하여 그것이 어떻게 작동하는지 확인할 수 있습니다.

빈 netfilter 규칙 세트로 시작하고 다음 규칙을 추가해 보겠습니다.

iptables -N bl_add
iptables -A bl_add -j LOG --log-prefix "BL_ADD "
iptables -A bl_add -j DROP
iptables -N bl_update
iptables -A bl_update -j LOG --log-prefix "BL_UPDATE "
iptables -A bl_update -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m recent --name BLACKLIST --update --mask 255.255.0.0 --seconds 20 -j bl_update
iptables -A INPUT -p tcp --dport 80 -m recent --name BLACKLIST -i eth0 --set -j bl_add

여기에는 패킷이 어디로 가는지 정확히 결정하는 데 사용할 수 있는 여러 로그/드롭 체인이 있습니다. 규칙 -i lo은 중요하지 않습니다. 단지 제가 발에 총을 쏘는 것을 방지하는 것뿐입니다.

내부에매뉴얼 페이지, 다음 문서를 참조하세요 --update.

       [!] --rcheck
              Check if the source address of the packet is currently in
              the list.

       [!] --update
              Like --rcheck, except it will update the "last seen"
              timestamp if it matches.

따라서 --update옵션은 "주소가 목록에 있는지 확인(즉, 일치)하고, 그렇다면 '마지막으로 본' 타임스탬프를 업데이트합니다"를 의미합니다. 이 예에서 이를 실제로 볼 수 있습니다.

192.168.122.1에서 이 호스트의 포트 80에 연결하려고 하면 journalctl -kfllog()에 다음이 표시됩니다.

[ 4152.729894] BL_ADD IN=eth0 OUT=
MAC=52:54:00:01:89:30:52:54:00:5d:a7:ff:08:00 SRC=192.168.122.1
DST=192.168.122.51 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=22836 DF PROTO=TCP
SPT=41698 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0
[ 4153.775211] BL_UPDATE IN=eth0 OUT=
MAC=52:54:00:01:89:30:52:54:00:5d:a7:ff:08:00 SRC=192.168.122.1
DST=192.168.122.51 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=22837 DF PROTO=TCP
SPT=41698 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0

첫 번째 패킷은 --update규칙을 건너뛰고(아직 블랙리스트에 등록되지 않았기 때문에) 규칙에 도달하므로 로그 출력이 --set표시됩니다 . BL_ADD다음 패킷은 규칙에서 중지되고 --update이제 블랙리스트에 있으므로 BL_UPDATE로그 출력이 표시됩니다.

이 구성을 사용하면 192.168.122.1에서 연결하면 다음과 같은 항목이 생성됩니다 /proc/net/xt_recent/BLACKLIST.

src=192.168.0.0 ttl: 64 last_seen: 4303109595 oldest_pkt: 13 4303017951, 4303018971, 4303035387, 4303035595, 4303035803, 4303036211, 4303037019, 4303038685, 4303041947, 4303048411, 4303061723, 4303108569, 4303109595

src주소는 192.168.0.0입니다. 인수 --mask는 원래 192.168.122.1소스 주소를 변환하는 데 적용됩니다.


만약 우리가제거하다규칙 --set은 다음과 같습니다.

iptables -N bl_add
iptables -A bl_add -j LOG --log-prefix "BL_ADD "
iptables -A bl_add -j DROP
iptables -N bl_update
iptables -A bl_update -j LOG --log-prefix "BL_UPDATE "
iptables -A bl_update -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m recent --name BLACKLIST --update --mask 255.255.0.0 --seconds 20 -j bl_update

192.168.122.1에서 포트 80으로 연결하면 로그 출력이 발생하지 않으며 .rule/proc/net/xt_recent/BLACKLIST--update아무것도 하지 않았다이전에 규칙을 BLACKLIST사용하여 소스 주소를 추가하지 않은 경우 .--set


유용한 경우 iptables-save출력은 다음과 같습니다.피복재구성은 다음과 같습니다.

*filter
:INPUT ACCEPT [31:2152]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [16:1520]
:bl_add - [0:0]
:bl_update - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m recent --update --seconds 20 --name BLACKLIST --mask 255.255.0.0 --rsource -j bl_update
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -m recent --set --name BLACKLIST --mask 255.255.255.255 --rsource -j bl_add
-A bl_add -j LOG --log-prefix "BL_ADD "
-A bl_add -j DROP
-A bl_update -j LOG --log-prefix "BL_UPDATE "
-A bl_update -j DROP
COMMIT

관련 정보