我有一个udp转发到规则的虚拟机
iptables -t nat -A PREROUTING -i eth0 -p udp -m udp --dport 42000:42020 -j DNAT --to-destination 192.168.1.2 iptables -t nat -A POSTROUTING -s 192.168.1.2/32 -j MASQUERADE iptables -A FORWARD -d 192.168.1.2 -p udp --dport 42000:42020 -j ACCEPT iptables -A FORWARD -s 192.168.1.2 -j ACCEPT
VM中有openvpn服务器监听这些端口。
现在我在主机上有一个奇怪的问题:有些数据包在接口之间路由,有些不是,没有明确的模式为什么。
eth0和vmnet上显示数据包。 eth0上的对等数据包,这些数据包不会路由到vmnet和vm数据包,而这些数据包不会路由到eth0 。 eth0 , vmnet和VM内部logging。 我可以尝试find为什么数据包不会路由到其他接口?
这个问题有两个部分:
首先libvirt用一个防火墙规则插入
- j MASQUERADE --to-port 1024-65535
它改变了源端口,这些端口与其他规则不匹配,导致openvpn错误。
复杂的部分是,为什么禁用这个不起作用。 那里的conntrack表保存了有关源端口的信息。 我想来自同行的数据包仍然在尝试重新连接,更新了表中的条目。
当我运行conntrack -D (小心点,这将丢弃所有跟踪的连接),数据包开始有正确的源端口。 请注意,conntrack无法确保源端口,但如果可用尝试使用原始--to-ports ,如果没有使用--to-ports参数。