- 论坛徽章:
- 0
|
我在网关后架设一台虚拟服务器IP地址是192.168.1.22, 内网的其他PC IP 192.168.1.3 通过网关WAN口地址116.113.59.141来访问虚拟服务器。\r\n\r\n 这是网关的NAT表(无关的规则已经去掉):\r\nhain PREROUTING (policy ACCEPT 276 packets, 19936 bytes)\r\npkts bytes target prot opt in out source destination \r\n 13 1300 DNAT udp -- * * 0.0.0.0/0 116.113.59.141 udp dpt:9001 to:192.168.1.22 \r\nChain POSTROUTING (policy ACCEPT 4 packets, 270 bytes)\r\npkts bytes target prot opt in out source destination \r\n 70 7026 SNAT udp -- * * 192.168.1.0/24 0.0.0.0/0 to:116.113.59.141 \r\n 0 0 MASQUERADE all -- * ppp_0_0_35_1 192.168.1.0/24 0.0.0.0/0 \r\n\r\n 网关的路由表:\r\nDestination Gateway Genmask Flags Metric Ref Use Iface\r\n116.113.48.1 * 255.255.255.255 UH 0 0 0 ppp_0_0_35_1\r\n192.168.1.0 * 255.255.255.0 U 0 0 0 br0\r\n192.168.253.0 * 255.255.255.0 U 0 0 0 br1\r\ndefault 116.113.48.1 0.0.0.0 UG 0 0 0 ppp_0_0_35_1\r\n\r\n因为访问虚拟服务器是通过内嵌WEB的方式访问的,即在一外网web主页上点一个按钮来访问虚拟服务器(点这个按钮会向116.113.59.141:9001发送一定格式的UDP数据包)。\r\n\r\n例如:网关内部一PC 192.168.1.3点了这个按钮,那么它将发一个saddr:192.168.1.3, daddr:116.113.59.141的一指定格式的UDP数据包,我出现的问题是虚拟服务器收不到这个包。\r\n\r\n经过在网关wan口抓包可以看到:\r\n源地址 目的地址\r\n192.168.1.3:3015 116.113.59.141:9001 ==》经过DNAT和SNAT之后变成\r\n116.113.59.141:3015 192.168.1.22:9001\r\n这个包在虚拟服务器端是收不到的,因为经过端口映射抓包可以看到这个包发到外网去了。\r\n\r\n调试ip_input.c和route.c,ip_output.c打印信息可以看到:\r\n在PREROUTING链做了DNAT后,udp包的saddr:192.168.1.3, daddr:192.168.1.22, in_dev:br0, out_dev:ppp_0_0_35_1;\r\n发到output的时候,先做了源地址转换:saddr:116.113.59.141,daddr:192.168.1.22, out_dev:ppp_0_0_35_1, 经过路由选择后走:return dst->neighbour->output(skb);\r\n\r\n如何让saddr:116.113.59.141, daddr:192.168.1.22正常到达内部虚拟服务器而不是转到外网去?\r\n下面是我做的一些步骤:\r\n1, 断掉PPP连接,因为之前客户端web上的UDP请求还在不断的发出,这时可以正常通信,调试发现此时in_dev和out_dev都是br0;\r\n2,我将saddr:192.168.1.3, daddr:192.168.1.22的UDP包的out_dev手动改成br0,但ppp连接存在的情况下还是不通。\r\n\r\n不知道各位高手对这个问题有什么看法,先谢谢了! |
|