OpenVPN莫名其妙断线的问题及其解决分析.pdf
《OpenVPN莫名其妙断线的问题及其解决分析.pdf》由会员分享,可在线阅读,更多相关《OpenVPN莫名其妙断线的问题及其解决分析.pdf(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 OpenVPN 莫名其妙断线的问题及其解决 1.问题 不得不说,这是一个 OpenVPN 的问题,该问题几乎每个使用 OpenVPN 的人都碰到过,也有很多人在网上发问,然而一直都没有人能给出解决办法,甚至很多帖子上表示因为这个问题而放弃了使用 OpenVPN。说实话,我面临这个问题已经两年有余,自从第一次接触 OpenVPN,这个问题就一直困扰着我,去过国内外各大论坛也没有找到满意的结果。这几天终于有点闲暇,我决定自己去摸索一下,要感谢公司能给我提供一个环境!最终,我取得了突破性的进展,还是那句话,我把这个结果贴了出来,就是为了以后人们再面临这个问题时可以多一个可选的答案。顺便说一下,并不
2、能说明网上就没人解决过这个问题,因为我所能看到并理解的,只有中文或者英文的帖子或者文章,虽然日文的也在我老婆的帮忙翻译下看过一些,但是还有大量的德文,意大利文,韩文等作为母语的人写出的东西我无法找到并且理解它,因此为了通用性,我本应该用英文来写这篇文章,然而英文水平太垃圾,怕那样连中国人都不能理解了.问题是这样的,OpenVPN 在跨越公网上连接时,会莫名其妙的时不时断开,但不经常,也不绝对!由于大部分人使用 Windows 版本的作为 OpenVPN 客户端,因此起初一直一为是 Windows 本身的问题,然而当我用 Linux 客户端连接时,还是一样,这就是说,很大程度上冤枉了 Windo
3、ws(也并不是完全冤枉,起码 Linux 就没有 DHCP 租约的问题),于是既然有了环境,那就折腾一番,因此又是一个惊魂 48 小时。以下是在客户端断开时服务端的日志(频繁的断开就会有频繁的日志,现在仅仅截取一段):2013-07-24 16:53:15 MULTI:REAP range 208-224.2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:5 1 2 3 4 2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014
4、succeeded 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 1 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 WRITE 114 to 218.242.253.131:18014:P_CONTROL_V1 kid=0 pid=5 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK
5、 output sequence broken:6 5 2 3 4 2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 2 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 WRITE 114 to 218.242.253.131:1801
6、4:P_CONTROL_V1 kid=0 pid=6 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:7 5 6 3 4 2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=
7、0 3 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 WRITE 114 to 218.242.253.131:18014:P_CONTROL_V1 kid=0 pid=7 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:8 5 6 7 4 2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24
8、16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 4 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 WRITE 114 to 218.242.253.131:18014:P_CONTROL_V1 kid=0 pid=8 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence brok
9、en:9 5 6 7 8 2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 5 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 WRITE 114 to 218.242.253.131:18014:P_CONTROL_V1 kid=0
10、pid=9 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:10 9 6 7 8 2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 6 2013-07-24 16:53
11、:16 Test证 书/218.242.253.131:18014 UDPv4 WRITE 114 to 218.242.253.131:18014:P_CONTROL_V1 kid=0 pid=10 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:11 9 10 7 8 2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:16 Test证 书/
12、218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 7 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 WRITE 114 to 218.242.253.131:18014:P_CONTROL_V1 kid=0 pid=11 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:12 9 10 11 8
13、2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 9 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:12 10 11 8 2013-07-24 16:53:17 MULTI:REAP rang
14、e 240-256 2013-07-24 16:53:17 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:17 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 10 2013-07-24 16:53:17 Test 证书/218.242.253.131:18014 ACK output sequence broken:12 11 8 2013-07-24 16:53:17 GET INS
15、T BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:17 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 11 2013-07-24 16:53:17 Test 证书/218.242.253.131:18014 ACK output sequence broken:12 8 2013-07-24 16:53:18 MULTI:REAP range 0-16 2013-07-24 16:53:18 Test
16、证书/218.242.253.131:18014 TLS:tls_pre_encrypt:key_id=0 2013-07-24 16:53:18 Test 证书/218.242.253.131:18014 SENT PING 2013-07-24 16:53:18 Test 证书/218.242.253.131:18014 ACK output sequence broken:12 8 2013-07-24 16:53:18 Test证 书/218.242.253.131:18014 UDPv4 WRITE 53 to 218.242.253.131:18014:P_DATA_V1 kid=
17、0 DATA len=52 2013-07-24 16:53:18 Test 证书/218.242.253.131:18014 ACK output sequence broken:12 8.持续了 60 秒没有收到 ID 为 8 的 ACK,因此一直都是 ACK output sequence broken:12 8 2013-07-24 16:54:15 Test 证书/218.242.253.131:18014 TLS Error:TLS key negotiation failed to occur within 60 seconds(check your network connec
18、tivity)2013-07-24 16:54:15 Test 证书/218.242.253.131:18014 TLS Error:TLS handshake failed with peer 0.0.0.0 没隔一段时间就会断一次,并且重连还不一定总能重连成功!因此这里的问题有两点:a.连接正常时断开(ping-restart 的情况,上述日志没有展示)b.重连时不成功(上述日志展示的)2.分析 使用 UDP 的 OpenVPN 就是事多,为了避免重传叠加,在恶劣环境下还真得用 UDP。然而OpenVPN 实现的 UDP reliable 层是一个高度简化的“按序确认连接”层,它仅仅确保了
19、数据安序到达,并且有确认机制,和 TCP 那是没法比。不过如果看一下 TCP 最初的方案,你会发现,TCP 的精髓其实就是 OpenVPN 的 reliable 层,后来的复杂性都是针对特定情况的优化!和 TCP 的实现一样,不对 ACK 进行 ACK 对发送端提出了重传滑动窗口未确认包的要求,因为纯 ACK 可能会丢失,这里先不讨论捎带 ACK。ACK 一旦丢失,发送端肯定就要重传没有被 ACK 的包,关键是“什么时候去重传它?”,协议本身一般都有一个或者多个 Timer,Timer 到期就重传,然而我个人认为这个 Timer 不能依赖上层,而要在协议本身实现,毕竟重传这种事对上层是不可见的
20、!然而,OpenVPN 的 reliable 层在 ACK 丢失的应对方面却什么都没有实现,通过以上的日志可以看出,连续的:Test 证书/218.242.253.131:18014 ACK output sequence broken:12 8 说明 ID 为 8 的包一直都得不到重传,并且从:2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 6 2013-07-24 16:53:16 Test证 书/218.242.253.131
21、:18014 UDPv4 WRITE 114 to 218.242.253.131:18014:P_CONTROL_V1 kid=0 pid=10 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:11 9 10 7 8 2013-07-24 16:53:16 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4
22、 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 7 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 WRITE 114 to 218.242.253.131:18014:P_CONTROL_V1 kid=0 pid=11 DATA len=100 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:12 9 10 11 8 2013-07-24 16:53:16 GET INS
23、T BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:16 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 9 2013-07-24 16:53:16 Test 证书/218.242.253.131:18014 ACK output sequence broken:12 10 11 8 2013-07-24 16:53:17 MULTI:REAP range 240-256 2013-07-24 16:53:
24、17 GET INST BY REAL:218.242.253.131:18014 succeeded 2013-07-24 16:53:17 Test证 书/218.242.253.131:18014 UDPv4 READ 22 from 218.242.253.131:18014:P_ACK_V1 kid=0 10 这几行日志可以看出,确实是没有收到 ID 为 8 的包地 ACK,说明它丢失了,接下来发送的数据包将持续填充发送窗口,直到填满,ID 为 8 的包还未重传并且收到对端对其的 ACK,因此就导致了 ACK output sequence broken,通过查代码,12-8=4,而
25、 4 正是发送窗口的长度。持续了很久 ACK output sequence broken 之后,还是没有重传,直到:a.隧道建立之后的 ping-restart 过期 b.隧道建立阶段的 TLS handshake failed 实际上,正确的方式应该是,检测到窗口爆满就应该马上重传。TCP 通过三次重复 ACK 知晓丢包,而 OpenVPN 的 reliable 则通过 ACK output sequence broken 知晓 ACK 丢失,这是一个信号,应该在获取这个信号后做点什么了!3.原始方案 方案很简单,那就是在打印 ACK output sequence broken 的逻辑块
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenVPN 莫名其妙 断线 问题 及其 解决 分析
限制150内