免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3611 | 回复: 4
打印 上一主题 下一主题

虚拟服务器经过NAT后出现路由问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-07 19:59 |只看该作者 |倒序浏览
我在网关后架设一台虚拟服务器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不知道各位高手对这个问题有什么看法,先谢谢了!

论坛徽章:
0
2 [报告]
发表于 2009-02-07 21:38 |只看该作者
iptables -t nat -L -nv\r\n\r\nhain PREROUTING (policy ACCEPT 276 packets, 19936 bytes)\r\n pkts 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\n    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            116.113.59.141      tcp dpt:81 to:192.168.1.22 \r\n  324 22470 MPRE       all  --  *      *       0.0.0.0/0            0.0.0.0/0           \r\n  278 20016 VSPRE      all  --  *      *       0.0.0.0/0            0.0.0.0/0           \r\n  278 20016 RAPRE      all  --  *      *       0.0.0.0/0            0.0.0.0/0           \r\n  276 19936 DMZPRE     all  --  *      *       0.0.0.0/0            0.0.0.0/0           \r\n  276 19936 REPRE      all  --  *      *       0.0.0.0/0            0.0.0.0/0           \r\n\r\nChain POSTROUTING (policy ACCEPT 4 packets, 270 bytes)\r\n pkts 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   33  1584 SNAT       tcp  --  *      *       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\nVSPRE 我用上面的两条DNAT代替了,其他链MPRE,  RAPRE,  REPRE  是关于其他端口的一些规则,为了查看数据包匹配的具体情况,在masquerade前加了2条SNAT, 其他的没有保存,要明天去调试重新保存下来。

论坛徽章:
0
3 [报告]
发表于 2009-02-08 12:15 |只看该作者
在经过ip_finish_output2()这个函数的时候,数据包的状态如下:\r\nsaddr:116.113.59.141 , daddr:192.168.1.22    dev->name:ppp_0_0_35_1\r\n在匹配route rule cache的时候,会走return dst->neighbour->output(skb);\r\n这个似乎匹配到了默认路由:\r\ndefault         116.113.48.1    0.0.0.0         UG    0      0        0 ppp_0_0_35_1\r\n而不是去走这条路由:\r\n192.168.1.0     *               255.255.255.0   U     0      0        0 br0\r\n这是为什么呢?我没做端口绑定啊。

论坛徽章:
0
4 [报告]
发表于 2009-02-08 16:12 |只看该作者
问题已经解决,修改路由,不从PPP过,直接通过br0做所有事情。

论坛徽章:
5
IT运维版块每日发帖之星
日期:2015-08-06 06:20:00IT运维版块每日发帖之星
日期:2015-08-10 06:20:00IT运维版块每日发帖之星
日期:2015-08-23 06:20:00IT运维版块每日发帖之星
日期:2015-08-24 06:20:00IT运维版块每日发帖之星
日期:2015-11-12 06:20:00
5 [报告]
发表于 2009-02-09 09:04 |只看该作者
呵呵,不过还有另外的一个方法。对内网口做SNAT。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP