因此,我让网络中的客户端通过我的计算机使用 arpspoof 连接到路由器。当我知道要停止数据包转发时,我执行:
iptables -A FORWARD -j REJECT
一切正如我预期的那样。但是当我尝试执行以下操作时:
iptables -A FORWARD -j ACCEPT
我无法让数据包像一开始那样通过。
我做错了什么吗?或者我应该使用除“接受”以外的其他论点吗?
答案1
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
自REJECT
规则出台以来前规则ACCEPT
,它会先被触发,因此不会发生转发。
因此,您需要删除该REJECT
规则,而不是添加ACCEPT
规则。要删除 REJECT 规则,请运行
iptables -D FORWARD -j REJECT
有关更多信息,请阅读 iptables 手册页。
答案2
该-A
标志告诉 iptables 将规则附加到链中,这意味着它最终会归于你的REJECT
规则之下,并且由于第一条规则匹配,所以它永远不会被使用。
你可以使用以下命令列出你的规则iptables -L FORWARD
,然后你就会亲眼看到。要删除你添加的规则,请运行
iptables -D FORWARD -j REJECT
直到链中不再存在这样的规则。
答案3
那么在规则末尾输入FORWARD
跳转到新链中的内容,其中只有一条规则。可能是ACCEPT
或REJECT
。说...
iptables -N accept-chain
iptables -A accept-chain -j ACCEPT
iptables -A FORWARD -j accept-chain
之后,你可以将这条规则accept-chain
改为
iptables -R accept-chain 1 -j REJECT
禁用或-j ACCEPT
启用流量。
另外如何打开和关闭路由
echo "0" > /proc/sys/net/ipv4/ip_forward
用于禁用数据包转发,"1"
- 用于启用。
答案4
顺序很重要。这会将您的规则插入到顶部,而不是附加到顶部。
iptables -I FORWARD 1 -j ACCEPT
-I 是插入,#1 是位置