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