我有一台服务器 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 获取数据(当我在客户端上按 enter 时,Y 的屏幕上没有任何回声)。
有什么问题?
对您的问题最有可能的解释是
rp_filter
,默认情况下已启用。服务器 Y 在 上接收数据包tap0
,但根据其路由表,数据包应该到达不同的接口(可能eth0
)。如果这确实是您的问题,那么解决方案是禁用
rp_filter
fortap0
。首先试试这个,看看问题是否消失:一旦你让服务器 Y 接受数据包。由于来自错误的 IP 地址,您可能会遇到客户端拒绝回复的问题。这个问题有不同的解决方案。
如果您选择
SNAT
在服务器 X 上使用,它将解决这两个问题。但是有两个警告。将源地址设置为数据包实际到达的 10.200.0.2 解决了问题: