Linux iptables 被拒绝 - 如何重新启用它?

Sni*_*ipy 8 iptables forwarding

所以我的网络中有一个客户端通过我的电脑使用 arpspoof 连接到路由器。当我知道要停止数据包转发时,我执行:

iptables -A FORWARD -j REJECT
Run Code Online (Sandbox Code Playgroud)

这就是我预期的工作方式。但是当我尝试做类似的事情时:

iptables -A FORWARD -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

我无法像一开始那样让数据包通过。

我做错了什么还是我应该使用与“接受”不同的任何其他论点?

Jen*_*y D 36

IPtables 有一个规则列表,对于每个数据包,它会按顺序检查规则列表。一旦找到匹配数据包的规则并指定策略(ACCEPT、REJECT、DROP),匹配数据包的命运就确定了;不再检查规则。

这意味着您运行命令的顺序很重要。当您使用 时iptables -A,您将规则添加到规则列表的末尾,因此您最终会得到一个如下所示的规则列表:

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited
ACCEPT     all  --  anywhere             anywhere
Run Code Online (Sandbox Code Playgroud)

由于REJECT规则来之前ACCEPT规则,它被首先触发,因此转发不会发生。

因此,您需要删除REJECT规则而不是添加ACCEPT规则。要删除 REJECT 规则,请运行

iptables -D FORWARD -j REJECT 
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读 iptables 联机帮助页。


Pet*_*r H 18

-A标志告诉 iptables 将规则附加到链中,这意味着它最终在您的REJECT规则之下,并且由于第一个规则匹配,因此从未使用过。

你列出你的规则,iptables -L FORWARD你会自己看到这个。要摆脱您添加的规则,请运行

iptables -D FORWARD -j REJECT 
Run Code Online (Sandbox Code Playgroud)

直到链中不再有这样的规则。