我有一个在命令下面创建的列表
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
现在我正在销毁这个集合并使用上面的相同命令再次创建,以便我再次将 hashsize 均衡为 1024。然后我将以下规则添加到 iptables 并使用 hping3 发送随机包
iptables -A PREROUTING -t raw -j SET --add-set foo src
hping3 --flood --rand-source <server-ip>
虽然攻击仍在继续,但看起来 iptables 在某个时间点后无法添加更多 IP 地址。并且 hashsize 保持不变
# 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
我的问题是,这个引用的原因是什么?这是安全预防措施还是什么?
这是引言中手册
ipset
中描述的哈希表的预期行为:没有给出任何理由,但有人可能会推测,阻止防火墙可能声称无限量的内存是一件好事TM ....