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
版权声明:本文为博主原创文章,未经博主允许不得转载。