我在使用 iptables 时遇到了很大的问题,这是我尝试解决的问题:
PC windows (192.168.1.1) -> (192.168.1.2) PC Linux (192.168.2.1) -> (192.168.2.2) 网卡
我想将消息从 Windows 转发到卡。我写了以下规则:
iptables -t nat -A PREROUTING -d 192.168.1.2 -p udp --dport 49000 -j DNAT --to-destination 192.168.2.2:49000
iptables -t nat -A PREROUTING -d 192.168.2.1 -p udp --dport 49001 -j DNAT --to-destination 192.168.1.1:49001
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
如果我创建规则后重新启动卡,它就会起作用,这不是一个大问题。
更大的问题是,如果我删除一条规则,该规则不会出现:
iptables -t nat --list
但它仍然有效,消息继续转发......
如果我真的想删除一条规则,我需要刷新表格(iptables -t nat -F
),然后重新启动网络(/etc/init.d/networking restart
),最后重新创建我不想删除的规则......
我在论坛上发现了这一点,但就我而言,这是错误的: 我在这里找到的页面
您有什么想法吗?:)
编辑1:
net.ipv4.ip_forward=1 OK
没有比我写的 4 条更多的 iptables 规则。
编辑2:
当我删除 iptables 中的规则时,我可以在 conntrack 中看到它,因此我尝试删除该规则,我刷新了 conntrack,它是空的,但它仍然不起作用:当包到达时,规则会在 conntrack 中返回。
似乎规则被保存在某个地方,并且 conntrack 可以找到它,但我找不到...删除它的唯一方法是刷新 itables,然后重新启动网络...
答案1
这是 conntrack 问题。一旦连接被视为“已建立”,NAT 表甚至不会被查询,流量将继续通过。重新启动网络是刷新 conntrack 表的一种粗暴方式(因为当它们相关的地址被删除时,条目也会被删除);更微妙的是,有可用的 conntrack 表操作工具,但我从未使用过它们,所以我无法就此提供具体建议。
答案2
您使用 iptables 应用的任何规则都会立即生效(加载到内核中)。最有可能的是您的防火墙和/或网络配置存在逻辑问题。转储您的 iptables 规则会很有帮助。