从 iptables 和 ipset 命令添加 IP 地址时 ipset 的行为有所不同

从 iptables 和 ipset 命令添加 IP 地址时 ipset 的行为有所不同

我有一个使用以下命令创建的列表

ipset create foo hash:ip maxelem 40000000 timeout 180

空 foo 的样子如下

#ipset list foo
Name: foo
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 40000000 timeout 180
Size in memory: 16504
References: 0
Members:

然后我添加了一个 /16 子网,这意味着 65535 个 IP 地址。正如我们在下面的命令中看到的那样,hashsize 动态变化,并且 IP 地址添加成功。

#ipset add foo 192.168.0.0/16


#ipset list foo | head -10
Name: foo
Type: hash:ip
Revision: 1
Header: family inet hashsize 32768 maxelem 40000000 timeout 180
Size in memory: 2925208
References: 0
Members:
192.168.165.92 timeout 175
192.168.241.240 timeout 175
192.168.84.49 timeout 175

# ipset list foo | wc -l
65543

现在,我正在销毁此集合并使用上述相同命令再次创建,以便再次将哈希大小均衡为 1024。然后,我将以下规则添加到 iptables 并使用 hping3 发送随机包

iptables -A PREROUTING -t raw -j SET --add-set foo src

hping3  --flood  --rand-source <server-ip>

在攻击持续进行的同时,iptables 似乎在某个时间点之后无法添加更多 IP 地址。并且哈希大小保持不变

# ipset list foo |  wc -l
12295

# ipset list foo |  head -10
Name: foo
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 40000000 timeout 180
Size in memory: 262264
References: 1
Members:
5.125.171.17 timeout 174
92.5.220.202 timeout 174
164.124.160.24 timeout 174

如果我通过手动增加 hashsize 重复此测试,则 iptables 可以添加更多 IP 地址。

我在 CentOS 7 上进行了以下测试

kernel 3.15.9
ipset 6.19
iptables 1.4.21

我的问题是,引用此内容的原因是什么?这是出于安全预防措施还是其他原因?

答案1

似乎iptables无法在某个时间点之后添加更多 IP 地址

ipset这是哈希表的预期行为,正如手动的在引言中:

...当 iptables/ip6tables 的 SET 目标添加条目时,哈希大小是固定的并且即使无法将新条目添加到集合中,集合也不会重复。

没有给出任何理由,但有人可能会推测,防止防火墙可能索取无限量的内存是一件好事TM ......

相关内容