我制作了一个非常简单的 bash 脚本(在开始时回显,运行命令,在结束时回显)向 iptables 添加大约 7300 条规则,阻止中国和俄罗斯的大部分地区,但是在每次后续尝试给出以下错误之前,它都添加了大约 400 条规则向该链添加规则:
iptables: Unknown error 18446744073709551615
我什至后来尝试手动添加规则,但它不允许我添加它们(它给出了相同的错误)。
添加每个规则的命令如下所示:
/sbin/iptables -A sshguard -s x.x.x.0/x -j DROP
sshguard
是我创建的一条链,用于与sshguard守护进程,我想在那里添加规则,这样我就不会弄乱链条INPUT
。我提供的 IP 范围不应该归咎于这里,因为我提供了有效的范围来测试,并且它们遇到了相同的错误。刷新规则链并添加单个规则是可行的,但同样,在大约 400 个条目之后就不行了。
我事先做了一些谷歌搜索,但其他遇到这个问题的人似乎并没有因为与我相同的原因而遇到这个问题。
iptables 每个链是否有某种规则限制?另外,这是阻止这些范围的正确方法吗(除了错误)?
# iptables -V
iptables v1.3.5
# cat /etc/issue
CentOS release 5.8 (Final)
# uname -a
Linux domain.com 2.6.18-028stab101.1 #1 SMP Sun Jun 24 19:50:48 MSD 2012 x86_64 x86_64 x86_64 GNU/Linux
编辑:澄清一下,bash 脚本单独运行每个 iptables 命令,而不是循环遍历文件或 IP 列表。
另外,我阻止这些范围的目的是预防性的 - 我试图限制在我的一些网站上抓取、爬行或尝试创建垃圾邮件帐户的机器人数量。我已经在使用了sshguard阻止对我的服务器的暴力尝试,但这显然对其他机器人没有帮助。
答案1
好吧,我明白了。
我应该提到我的 VPS 有一个 Virtuozzo 容器。http://kb.parallels.com/en/746提到以下内容:
此外,可能需要增加 numptent 屏障值才能添加更多 iptables 规则:
~# vzctl set 101 --save --numiptent 400
仅供参考:必须重新启动容器才能生效。
这解释了为什么我达到了 400 左右的限制。如果我有 CentOS 6,我会安装模块ipset
(EPEL),iptables
而不是添加所有这些规则(因为ipset
速度很快)。
就目前而言,在 CentOS 5.9 上,我必须编译iptables
>1.4.4
和我的内核才能获得ipset
.由于这是一个 VPS 并且我的主机最终可能会升级到 CentOS 6,因此我不会追求这一点。
答案2
调试并不难,但是如果你将规则转换为纯 iptables 命令,并一一执行它们(使用 shell 脚本),你会看到错误,通常会缺少一些 ipt 模块。
首先用于iptables-save
导出当前规则,然后执行类似以下操作来逐行调试:
egrep '^(-A|-I)' ok.rules | while read x; do iptables $x || { echo failed $x; break; }; done
我用谷歌搜索了一下,这似乎是 CentOS 默认内核配置的一个错误。
答案3
RHEL 中似乎存在一个有关 iptables 的未解决错误。您可能会碰到它。 https://bugzilla.redhat.com/show_bug.cgi?id=598380
与此同时,你看过类似的东西吗denyhosts
?hosts.deny
当您受到攻击(ssh 攻击)时,它会自动添加条目
只是一个想法。