iptables:POSTROUTING规则不符合标记

我有一个主机发送数据包到虚拟机说192.168.0.1/24 192.168.0.11或192.168.0.12作为目标IP。 我试图设置虚拟机作为一个NAT。 它路由的数据包,改变目的地的IP,这取决于原来的目的地IP,所以我不能只使用SNAT作为原始IP切换PREROUTING。 我一直试图使用的是–set-mark标志来标记数据包11或12,所以POSTROUTING规则将知道使用什么样的SNAT规则。 这是我的规则:

iptables -t mangle -A PREROUTING --destination 192.168.0.11 -j MARK --set-mark 11 iptables -t nat -A PREROUTING -m mark --mark 11 -i eth0 -j DNAT --to 20.0.21.11 iptables -t nat -A POSTROUTING -m mark --mark 11 -o eth1 -j SNAT --to-source 20.0.1.1 

 iptables -t mangle -A PREROUTING --destination 192.168.0.12 -j MARK --set-mark 12 iptables -t nat -A PREROUTING -m mark --mark 12 -i eth0 -j DNAT --to 20.0.21.11 iptables -t nat -A POSTROUTING -m mark --mark 12 -o eth1 -j SNAT --to-source 20.0.1.2 

如果我看iptables -t mangle / nat -nvL但是POSTROUTING规则永远不会匹配,我的前两个规则会递增。 任何想法,为什么这将是?

写这个的时候我只是想到了这个。 第一个networking是/ 24子网,然后我有第二个networking当前设置为/ 8子网。 这会以任何方式影响这个吗?

编辑

让事情更清楚一点。

第一步是主机将192.168.0.11/24或192.168.0.12/24从192.168.0.1/24发送到虚拟机。

  Destination IPs HOST ================ =============== +--* 192.168.0.11 *--+ ====== * 192.168.0.1 *--- ================ ---* VM * =============== +--* 192.168.0.12 *--+ ====== ================ 

然后,我希望虚拟机转发这些数据包,并将目标IP地址改为20.0.21.11/8。 然后将源IP更改为20.0.21.1/8或20.0.21.2/8,具体取决于原始目标IP是什么。 像这样。

  Source IPs w/ 20.0.21.11 as Destination IP ============== ====== +--* 20.0.21.1 *--+ ============ * VM *--- ============== ---* Test rig * ====== +--* 20.0.21.2 *--+ ============ ============== 

还要清楚这是一个私人networking上的NAT。 这里没有互联网连接。 Just Host <--> VM <--> Test rig

编辑2

再画一点,使其更清晰。

  Destination IPs Source IPs HOST ============== =============== Test rig ============= +--*192.168.0.11*-+ | 20.0.21.1 *--+ ============== *192.168.0.1*--- ============== +--* VM | +--* 20.0.21.11 * ============= +--*192.168.0.12*-+ | 20.0.21.2 *--+ ============== ============== =============== 

你的规则看起来是正确的,检查你是否有网桥设置,这些可以使数据包的input/输出接口混乱。 您还可以添加-j LOG规则来查看日志中匹配的内容。

你在主机上启用了IP转发吗? 如果不是那么你的第二个规则将永远不会匹配,因为转发的数据包将被内核忽略。

你可以用cat /proc/sys/net/ipv4/ip_forward 。 如果输出为零,则可以尝试echo 1 > /proc/sys/net/ipv4/ip_forward来查看是否解决了您的问题。 如果是这样, echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf将使设置幸存重启。

我想这是一个评论,但我的名声太小了。 很抱歉发布这样一个明显的答案,但这已经抓到我很多次,这是值得发布!