当我添加以下规则时iptables
,一切都按预期进行。违规 IP 将被添加BLACKLIST
并删除。
iptables -A INPUT -m recent --rsource --name BLACKLIST --update -j DROP
当我iptables
用 列出我的规则时iptables-save
,我看到自动使用网络掩码 255.255.255.255 进行匹配:
-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 -kfl
) 中看到:
[ 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 的连接不会导致任何日志输出,并且/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