当前位置: 代码迷 >> WinCE >> WINCE+联通3G拨号+vpn+拨号经常ping不通内网IP有关问题
  详细解决方案

WINCE+联通3G拨号+vpn+拨号经常ping不通内网IP有关问题

热度:500   发布时间:2016-04-28 11:50:20.0
WINCE+联通3G拨号+vpn+拨号经常ping不通内网IP问题

WINCE+联通3G拨号+vpn+拨号经常ping不通内网IP问题

 

备注:这里的VPN网关,也就是vpn服务器,是个硬件专用vpn设备,是网御星云设备Power V6000,下文个别IP担心涉密,去除掉其中一部分

 

在此之前还遇到WINCE连接不上vpn设备问题,见《WINCE6.0基于PPTP的VPN连接网御星云设备Power V6000问题》

http://blog.csdn.net/loongembedded/article/details/49098703

 

1. 问题

WINCE手持机联通版本采用的模块是SIM5360,WINCE和vpn服务器都是基于PPTP协议,先是WINCE手持机这边3G拨号成功后,WINCE的vpn客户端连接到VPN网关(也就是VPN服务器),然后ping客户内网的Web网络服务器,下面是网络拓扑图

 

 

图1

VPN网关前有个路由(VPN网关有专门的业务封装,路由只是转发寻址),这里VPN网关有两个网卡,一个对内网(有个内部IP,这里是10.XXX.XXX.114),一个对外网(有个外部IP,这里是60.XX.XX.XXX)

 

我们联通3G版Ping不通客户的web服务器,同台机器用WIFI就可以,但用同一张联通3G卡在anroid手机或是我们C4050上是正常连接和ping通的,另外我们WINCE电信版本(模块是SIM6320C)好很多,虽然也有ping丢包的,但不会出现大部分时间ping不通的情况。

还有个差异,还是WINCE联通3G版本连接其他vpn服务器,ping对应的内网IP,虽然偶尔也存在ping丢包情况,但不会出现经常ping不通的情况。

综合这些现象,问题还是WINCE联通3G版本和客户的vpn服务器兼容性不太好。

 

2. 问题的排查过程

 

2.1 vpn服务器的排查

ping包的流程:

(1) 手持机封GRE包--->VPN网关

(2) VPN网关解封装,还原ping包

(3) VPN网关把ping包转发给目的地址

 

VPN服务器抓取数据包,还原的正常的ping包是这样:

10.X.X.114--->10.X.X.102

10.X.X.102--->10.X.X.114

Ping不通时的ping包是这样:

192.X.X.10(手持机IP)--->192.X.X.1

192.X.X.10--->192.X.X.1

再后来测试有时候都抓不到这个数据包。我们ping的IP是10.X.X.102,但ping不通情况显示是192.X.X.1,被变址了。抓取到这个变地址的包也有可能是其他人在用,毕竟环境上不是我们一台机器,收不到正常的ping包这个是肯定的

 

也就是说还原后的ping包目的地址是错误的,从而判断是手持机发出的目的地址是错的。但为什么是错的呢?原因不清楚,vpn设备厂家建议我们联系3G模块厂家,看是不是3G模块这边发出去的数据包本身就有问题。

 

根据我们自己的讨论,基于“手持机-- 3G拨号上网  ---  代理VPN   ---  内蒙路政VPN ,最好这个代理VPN是联通的”这样的思路验证下,可用暴风VPN代理服务器,新注册用户能提供一个小时的VPN测试地址和账户,但是用手持机无法连接VPN,但android可以。

 

2.2 3G模块厂家的分析

我们的3G联通模块是SIM5360,在WINCE设备用DiagGrabPro工具抓3G模块发出去的数据包,这个数据包需要厂家解包采用wireshark分析数据包

 

图2

上图抓到3G模块发出去的ping包过程,这是ping通情况的,ping 10.X.X.102都被压在vpn包里,只能看到设备ip和vpn网关60.X.X.X交互。

 

根据王工抓3G模块发出去的包分析,认为发出去的时候ping目的地址也是错了,考虑到3G模块只是作为链路层不会对协议进行处理,所以建议我们查WINCE送到3G驱动之前的数据包是不是就有问题了。

 

SIMCOM研发王工用SIM5360和4G模块开发测试结果

4G模块+电信卡(找到电信4G LTE网络)+客户的VPN账号 ----vpn可以登录成功
4G模块+电信卡(找到电信3G EVDO网络)+客户的VPN账号 ----vpn可以登录成功
4G模块+联通卡(找到联通 LTE网络)+客户的VPN账号 ----vpn可以登录成功
4G模块+联通卡(强制设成3G模式,找到联通 3G WCDMA网络)+客户的VPN账号 ----vpn登录失败
3G模块+联通卡(找到联通 3G WCDMA网络)----vpn登录失败

 

2.3 WINCE设备端的分析

在抓WINCE网络logo之前,我们先来看ping包是不是没有到达目的节点(基于IT部门的建议),在ping通情况下,WINCE端通过命令行tracert 10.X.X.102来确认从手持机到目的地经过的路由信息就两个节点

ppp_peer10.X.X.114

10.X.X.102

 

Ping不通情况下:

 

图3

也就是路由不到,再次tracert,路由到下面信息:

 

图4

路由到的是192.168.255.74(本地局域网)和61.50.245.5(北京市通州区 联通),我们客户是在内蒙古调试,为什么回路由到北京联通呢,因为采用的是北京本地卡。但没有到内蒙古的VPN网关。

 

下面对Ping不通的情况,进行详细测试:

(1) Ping不通的情况下,tarcert 10.X.X.102看路由表

ping 102不通的时候,第二次tracert 114 现象还是如下:
1  *      *       *   Request time out 
2                       192.168.255.170
3                       61.50.250.217
4 *    *    *  Request time out 
5 *    *    *  Request time out 
6 *    *    *  Request time out 


30 *   *   *  Request time out 

61.50.250.217是北京联通IP 

 

(2) Ping不通的情况下,tarcert 10.X.X.114看路由表

tracert 114 现象还是和以前一样,如下:
1  *      *       *   Request time out 
2                       192.168.255.170
3                       61.50.250.217
4 *    *    *  Request time out 
5 *    *    *  Request time out 
6 *    *    *  Request time out 


30 *   *   *  Request time out 

(3) Ping不通的情况下,tarcert 60.X.X.94看路由表

 

5

102ping不通的情况下,60.X.X.94是可ping通的

 

根据上面tarcert的分析,ping包到到不了VPN网关内网卡IP地址10.X.X.114(见图1)。是什么原因呢?还是不清楚,看来只能分析WINCE送到3G驱动之前的数据包了。

 

WINCE实现抓包,必须添加对应的组件NDIS Packet Capturing DLL,如下;

 

图6

抓包步骤如下:

(1) wince cmd命令下面运行 netlogctl start

(2) ping ip地址,然后查看“我的设备\”根木下面会多一个文件netlog0.cap,这个就是数据包log.

(3) ping完成之后要运行netlogctl stop命令停止抓包

(4) 在电脑上用ms network monitor 解析.cap文件就行。

 

根据抓包,我们发现3G拨号连接成功后,如果3G拨号成功分配的IP(通过ipconfig可查看)只要是172开头的就可以ping,但如果是10开头的绝大部分是无法ping通,就算可以ping通也非常不稳定,为什么呢(注意了,我们要ping的目的地也是10开头)?而电信3G连接成功后分配的都是1开头。难道10开头的就有问题吗?我们用windows+SIM5360开发板验证,10开头也可以。那为什么下WINCE下就大部分不行呢?

 

我自己猜想,是不是联通给手持机分配的地址是10的时候,winCE会误以为和10.X.X.102是同一个内网地址,就不按VPN走了,所以导致出错

 

根据测试和WINCE端抓包分析如下:

(1) 3G获取联通ip为172段的,vpn连接成功,ping10.X.X.102比较正常

(2) 3G获取联通ip为10段的,vpn连接成功,ping10.X.X.102 这边测试没见过Ping通的,抓包分析,此时使用3G的ip给10.X.X.102发包,感觉是绕过了vpn连接直接发包。


这种情况有两种可能:一种是vpn连接已断(但并没有提示端),另一种可能是wince发现目标地址是10开头,本地3G连接也是10,认为是局域网,绕过vpn直接发。这也解释了上面用的北京的卡,先找到的联通网关的现象。

 

那为什么windows和android可以,WINCE不行呢?很有可能是WINCE的bug,而windows规避了这个问题,看相关描述:

 

图7

 

3. 目前问题的解决

主要方向明确了,怎么解决呢?我们找到一篇博文《在Window Embedded CE(Wince)下使用OpenNETCF进行路由表的开发 》,给我们很大提示,根据里面提供的思路

http://www.cnblogs.com/procoder/archive/2009/12/23/Windows-Embedded-CE-Routing-Table.html

 

根据里面提供的思路

 

图8

开发了一个程序,原理是:找到0.0.0.0的默认路由,且interface是192开头,把前面两列替换成10.0.0.0 和255.0.0.0,同时把开销置成1,保证比默认的小,然后增加到路由表中。把10.0.0.0的路由指定有vpn的连接走,开销设置成1,比他下面那一条10.0.0.0的小,要ping的地址10开头,其实就10.0.0.0的那条起作用

 

同时根据一位朋友的反馈“看来3G拨号跟PPPOE拨号一样的BUG啊。PPPoE也要自己家路由表”

 

windows本地连接的DNS和VPN连接DNS的优先级

http://www.safexjt.com/archives/12.html

DNS Over PPTP VPN 的问题 

http://itquestion.blog.51cto.com/756628/153940

版权声明:本文为博主原创文章,未经博主允许不得转载。