我有一个通过VPN连接到服务器Y的服务器X(45.55.245.182)。 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
在tap0接口上运行服务器Y上的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
请参阅显示设置的图表:
但是,我不能看到服务器上的监听netcat获取数据(当我按下客户端上的回车键时,Y屏幕上没有任何回应)。
什么可能是一个问题?
对你的问题最可能的解释是rp_filter
,这是默认启用。 服务器Y在tap0
上接收数据包,但根据其路由表,数据包应该到达不同的接口(可能是eth0
)。
如果这确实是你的问题,那么解决scheme是禁用tap0
rp_filter
。 首先试试看看问题是否消失:
echo 0 > /proc/sys/net/ipv4/conf/tap0/rp_filter echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
一旦你得到服务器Y接受数据包。 由于来自错误的IP地址,您可能会面临客户拒绝回复的问题。 这个问题有不同的解决scheme 。
如果你select在服务器X上使用SNAT
,它将解决这两个问题。 但有两个警告。
将源地址设置为10.200.0.2,实际上数据包到达解决了问题:
iptables -t nat -A POSTROUTING -p udp --dport 35000 -j SNAT --to 10.200.0.2