使用 iptables-restore 应用 iptables 规则时出错

使用 iptables-restore 应用 iptables 规则时出错

嗨,我在 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

解决了我的问题

相关内容