UDP 数据包到达 VPN 接口,但未传送至进程

UDP 数据包到达 VPN 接口,但未传送至进程

我有一台服务器 X (45.55.245.182),它通过 VPN 连接到服务器 Y。X 上的 VPN 接口是 tap0,IP 为 10.200.0.2;Y 上的 VPN 接口是 tap0,IP 为 10.200.0.1。我在服务器 Y 上运行 netcat 来监听 UDP 35000:

nc -lu 10.200.0.1 35000

在服务器 X 上,端口 35000 的数据包通过以下 iptables 规则进行 DNAT:

iptables -t nat -A PREROUTING -p udp --dport 35000 -j DNAT --to-destination 10.200.0.1

在服务器 Y 的 tap0 接口上运行 tcpdump 显示数据包按预期到达:

11:54:44.000610 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.200.0.1 tell 10.200.0.2, length 28
11:54:44.000638 ARP, Ethernet (len 6), IPv4 (len 4), Reply 10.200.0.1 is-at fa:0f:00:1a:57:59 (oui Unknown), length 28
11:54:44.154702 IP (tos 0x8, ttl 47, id 52840, offset 0, flags [DF], proto UDP (17), length 34)
    hotnet-213-57-17-185.hotnet.net.il.24740 > 10.200.0.1.35000: [udp sum ok] UDP, length 6

参见设置图表: 在此处输入图片描述

但是,我看不到服务器 Y 上监听的 netcat 获取数据(当我在客户端按下回车键时,Y 的屏幕上没有任何回显)。

这会是什么问题?

答案1

您的问题最有可能的解释是rp_filter,默认情况下启用。服务器 Y 在 上接收数据包tap0,但根据其路由表,该数据包应该到达不同的接口(可能是eth0)。

如果这确实是您的问题,那么解决方案是禁用rp_filtertap0首先尝试这样做,看看问题是否消失:

echo 0 > /proc/sys/net/ipv4/conf/tap0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

一旦服务器 Y 接受了数据包。您可能会遇到客户端拒绝回复的问题,因为回复来自错误的 IP 地址。不同的解决方案解决该问题

如果您选择在服务器 X 上使用,SNAT它将解决这两个问题。但有两个注意事项。

  • 服务器 Y 将不知道客户端的 IP 地址。
  • 对客户端的回复必须经过很长的路程才能通过服务器 X 回到客户端,这可能比直接将它们路由回客户端效率更低。

答案2

将数据包实际到达的源地址设置为 10.200.0.2 解决了问题:

iptables -t nat -A POSTROUTING -p udp --dport 35000 -j SNAT --to 10.200.0.2

相关内容