UDP 转发并不总是有效

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 显示主机上和虚拟机内部的eth0数据包。vmnet
  • 三个 VPN 连接正在获取eth0未路由到 的对等数据包和未路由到 的vmnet虚拟机数据包。vmneteth0
  • 与通过 netcat 发送的失败连接具有相同源端口和数据包长度的 UDP 数据包已登录eth0vmnet并且在 VM 内部一切正常。

我可以尝试找出为什么数据包没有被路由到另一个接口?

答案1

该问题分为两部分:

首先 libvirt 插入了一条防火墙规则

- j MASQUERADE --to-port 1024-65535

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

复杂的是,为什么禁用这个功能不起作用。而 conntrack 表却保留了有关源端口的信息。我猜是来自对等端的数据包(它们仍在尝试重新连接)更新了表中的条目。

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

相关内容