免费注册 查看新帖 |

Chinaunix

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

虚拟服务器经过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来访问虚拟服务器。

  这是网关的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连接存在的情况下还是不通。

不知道各位高手对这个问题有什么看法,先谢谢了!

论坛徽章:
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
2 [报告]
发表于 2009-02-07 21:00 |只看该作者

iptables-save

论坛徽章:
0
3 [报告]
发表于 2009-02-07 21:38 |只看该作者
iptables -t nat -L -nv

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
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            116.113.59.141      tcp dpt:81 to:192.168.1.22
  324 22470 MPRE       all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  278 20016 VSPRE      all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  278 20016 RAPRE      all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  276 19936 DMZPRE     all  --  *      *       0.0.0.0/0            0.0.0.0/0           
  276 19936 REPRE      all  --  *      *       0.0.0.0/0            0.0.0.0/0           

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
   33  1584 SNAT       tcp  --  *      *       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           

VSPRE 我用上面的两条DNAT代替了,其他链MPRE,  RAPRE,  REPRE  是关于其他端口的一些规则,为了查看数据包匹配的具体情况,在masquerade前加了2条SNAT, 其他的没有保存,要明天去调试重新保存下来。

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

论坛徽章:
0
5 [报告]
发表于 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
6 [报告]
发表于 2009-02-09 09:04 |只看该作者
呵呵,不过还有另外的一个方法。对内网口做SNAT。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP