这很令人费解。
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 框的恶意存在与虚假回车符的出现有关。
编辑:既然这似乎是问题所在,我能否就“人们可以从这一事件中学到的东西”提出一个小小的、高谈阔论的建议?那就是:在调试自由软件时,详细的异常情况非常重要。
商业软件会出于非技术原因而执行某些操作,因此通常无法从明显的异常中推断出任何原因。但免费软件往往不会这样做;例如,如果单引号出现在行首,而通常不会出现这种情况,则通常是出于技术原因 - 这对调试非常有帮助。