UDP转发不总是工作

我有一个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服务器监听这些端口。

现在我在主机上有一个奇怪的问题:有些数据包在接口之间路由,有些不是,没有明确的模式为什么。

  • 一个VPN连接工作得很好。 tcpdump在主机上和虚拟机内的eth0vmnet上显示数据包。
  • 三个VPN连接正在获取eth0上的对等数据包,这些数据包不会路由到vmnet和vm数据包,而这些数据包不会路由到eth0
  • 具有与通过netcat发送的失败连接相同的源端口和包长度的UDP数据包将在eth0vmnet和VM内部logging。

我可以尝试find为什么数据包不会路由到其他接口?

这个问题有两个部分:

首先libvirt用一个防火墙规则插入

 - j MASQUERADE --to-port 1024-65535 

它改变了源端口,这些端口与其他规则不匹配,导致openvpn错误。

复杂的部分是,为什么禁用这个不起作用。 那里的conntrack表保存了有关源端口的信息。 我想来自同行的数据包仍然在尝试重新连接,更新了表中的条目。

当我运行conntrack -D (小心点,这将丢弃所有跟踪的连接),数据包开始有正确的源端口。 请注意,conntrack无法确保源端口,但如果可用尝试使用原始--to-ports ,如果没有使用--to-ports参数。