由于严重错误,无法恢复 iptables:未找到模块 ip_tables

由于严重错误,无法恢复 iptables:未找到模块 ip_tables

这很令人费解。

VPS 上的 Centos 6.4。

iptables -L 有效,我可以使用 iptables 命令根据需要输入规则和删除规则。我甚至可以在 sysconfig/ 中看到已保存的规则,而且它们是正确的。

但是,iptables-restore < /etc/iptables.firewall.rules 总是失败,并显示以下信息:

FATAL: Module ip_tables not found.
'ptables-restore v1.4.7: iptables-restore: unable to initialize table 'filter

Error occurred at line: 1

我的规则如下(逐字逐句)。它们是 linode 在其教程中推荐内容的副本。

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections but block (slow) brute force attempts
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
-I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
-I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 600 --hitcount 10 -j DROP

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

答案1

应该跟在单词后面的单引号filter已经迁移回行首,这让我非常怀疑规则文件^M在行尾包含了虚假字符,而这iptables实际上是在抱怨它can't initialise table 'filter^M'——但它肯定不能,因为没有这样的表。

如果事实如此,这种不打印(因此很难发现)^M可能来自您上面引用的文件的第一行*filter^M

最简单的确定方法是用vi二进制模式打开文件vi -b /etc/sysconfig/iptables(我假设这是您上面引用的文件),然后查找不应该存在的非打印字符。

我无法确定这些字符是如何出现在那里的,但我经常发现附近 Windows 框的恶意存在与虚假回车符的出现有关。

编辑:既然这似乎是问题所在,我能否就“人们可以从这一事件中学到的东西”提出一个小小的、高谈阔论的建议?那就是:在调试自由软件时,详细的异常情况非常重要。

商业软件会出于非技术原因而执行某些操作,因此通常无法从明显的异常中推断出任何原因。但免费软件往往不会这样做;例如,如果单引号出现在行首,而通常不会出现这种情况,则通常是出于技术原因 - 这对调试非常有帮助。

相关内容