我在 Centos 7 上运行了 iptables,使用版本 v1.4.21,但也在 v1.6.0 上进行了测试(请注意,我没有重建内核,因为它说我不再需要进行扩展)。
我设置了一个配额并且使用它:
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
pkts bytes target prot opt in out source destination
3639 3999378 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 quota: 4000000 bytes
142 175468 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
#
然后,当我向该链中添加任何其他规则时,现有规则会“重置”字节使用情况并再次用完配额:
# iptables -I 192.168.2.5 -m quota --quota 1000 -j ACCEPT
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
pkts bytes target prot opt in out source destination
2 168 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 quota: 1000 bytes
7239 7998334 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 quota: 4000000 bytes
890 387931 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
即使没有超出,此行为也总是将配额数量添加到规则中,即使我正在影响不同的规则:
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
pkts bytes target prot opt in out source destination
379 67755 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 quota: 4000000 bytes
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
# iptables -I 192.168.2.5 -m quota --quota 1000 -j ACCEPT
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
pkts bytes target prot opt in out source destination
2 168 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 quota: 1000 bytes
379 67755 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 quota: 4000000 bytes
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
# iptables -nvx -L 192.168.2.5
Chain 192.168.2.5 (2 references)
pkts bytes target prot opt in out source destination
11 924 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 quota: 1000 bytes
4159 4066453 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 quota: 4000000 bytes
315 190056 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
这似乎是一个错误,也许与这个。
有什么想法吗?我的一个解决方法是自己捕获字节并将它们添加到新规则的配额中。当已经超出时,这种方法很有效,但如果没有,我可能会因为读取、计算、删除和添加之间的差距而错过字节。
答案1
阅读您链接并测试的其他问题后,我只能得出结论:配额模块不是很有用:只要发生变化就会重置。
这就是为什么还有一个名为quota2的模块!它不是iptables的一部分,而是xtables-addons的一部分。在Debian中,它是可用的,并且在安装时使用xtables-addons-dkms进行编译。我认为你必须在CentOS7中自己编译它。
手册页中的三个摘录(可以在这里找到:xtables-插件.8)
计数器的值可以通过procfs读取和重置,从而使该匹配成为一个极简的会计工具。
。
--name name
为计数器指定一个特定名称。必须存在此选项,
配额出现在 /proc/net/xt_quota/ 中姓名并且可读/写
--quota iq
指定此计数器的初始配额。如果计数器已存在,则不会重置。
这意味着必须使用 iptables 本身之外的一些逻辑(例如,如果必须重新启动服务器,则保存剩余配额并在启动时恢复),但这肯定能解决您的问题。