程序员人生 网站导航

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

栏目:综合技术时间:2016-03-11 10:38:41

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

 

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

 

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

 

1. 问题

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

 

 

图1

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

 

我们联通3G版Ping不通客户的web服务器,同台机器用WIFI就能够,但用同1张联通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,被变址了。抓取到这个变地址的包也有多是其他人在用,毕竟环境上不是我们1台机器,收不到正常的ping包这个是肯定的

 

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

 

根据我们自己的讨论,基于“手持机-- 3G拨号上网  ---  代理VPN   ---  内蒙路政VPN ,最好这个代理VPN是联通的”这样的思路验证下,可用狂风VPN代理服务器,新注册用户能提供1个小时的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不通的时候,第2次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样,以下:
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地址,然后查看“我的装备”根木下面会多1个文件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是同1个内网地址,就不按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连接直接发包。


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

 

那为何windows和android可以,WINCE不行呢?很有多是WINCE的bug,而windows规避了这个问题,看相干描写:

 

图7

 

3. 目前问题的解决

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

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

 

根据里面提供的思路

 

图8

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

 

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

 

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



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐