嗨,我在 VPS 上使用 Ubuntu 9.04。如果我应用 iptables 规则,就会出现错误。以下是我所做的。
1.保存现有规则
iptables-save > /etc/iptables.up.rules
创建 iptables.test.rules 并向其中添加一些规则
nano /etc/iptables.test.rulesnano /etc/iptables.test.rules
这是我添加的规则
*filter
# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
# You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
# Allows SSH connections
#
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
#
-A INPUT -p tcp -m state --state NEW --dport 22- j ACCEPT
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
编辑后,当我尝试应用规则时
iptables-restore < /etc/iptables.test.rules
我收到以下错误
iptables-restore:第 42 行失败
第 42 行是 COMMIT,我将其注释掉,得到
iptables-restore:第 43 行应为 COMMIT
我不确定问题是什么,它期望 COMMIT,但如果有 COMMIT,它就会出错。可能是因为我使用的是 VPS?我的提供商使用 OpenVZ 进行虚拟化。
答案1
此时的帖子已经很老了,但它是谷歌搜索结果中的最佳结果,所以我想用我的解决方案进行更新...
COMMIT 之后必须有一个空白行,否则 iptables-restore 将在 COMMIT 所在的行上失败并出现“未指定命令”错误。
答案2
由于工作方式的原因iptables-restore
,几乎所有错误都会被报告为错误COMMIT
。偶尔我会遇到这些错误,我会在每一行重要代码之后添加 COMMIT(或者,如果我感到可疑,则只在那些我认为可能有问题的行之后添加),然后查看哪一行出错了。
然而,简单检查一下你的规则就会发现这可能是你遇到的问题:
-A INPUT -p tcp -m state --state NEW --dport 22-j ACCEPT
22
和之间缺少空格-j
可能是造成困难的原因。“对细节的关注失败”,就像酷孩子说的那样。
编辑:有了这些信息,我敢说这是 OpenVZ 的问题(您的 VPS 提供商没有给您任何 iptables 配额来添加您自己的规则)。无论如何,我自己都会找到一个新的 VPS 提供商;VZ 就像虚拟化的费雪牌玩具。它在企业数据中心和 0.89 美元/十年的“价格敏感”市场中占有一席之地,但对于专业 VPS 托管来说,它绝对是一只黑狗。
答案3
也许是因为 COMMIT 之前的空格字符导致失败?
答案4
我知道这是一篇老帖子,但它可以解决某些人的问题。
我犯了同样的错误,这是因为我打错了。
抛出的错误是在最后一行“COMMIT”,但实际上是这个:
-A RH-Firewall-1-INPUT -p tcp -m udp --dport 161 -j ACCEPT
错误在于它在同一行中说“tcp” 然后是“udp”.因此将该行更改为:
-A RH-Firewall-1-INPUT -p udp -m udp --dport 161 -j ACCEPT
解决了我的问题