所以,总结一下:

所以,总结一下:

当我添加以下规则时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

相关内容