Posted on 

openvpn 链接问题分析

​ 到新环境熟悉内部接口,postman 去调试内部服务接口发现接口没有返回,换个电脑调用正常。初步怀疑是自己电脑问题,遂打开 wireshark 根据目标主机 ip 结合路由信息判断的走的utun1接口出流量。

tcp-follow-all
tcp-follow-all

​ 上图通过 wireshark 看到我获取 cube 接口GET请求发出去,多次尝试依然都是http的 response 的没有被用户进程收到,wireshark 报错tcp previos sgement not captured 。单独点开tcp segment可以在 wireshark 中看到 response 是回来了但是没有成功的被应用层接收到 (如下图)。

cube-request-response-loss
cube-request-response-loss

​ 换个更直观的 tcp flow 的图(忽略里面的 ECN 协商的):在 tcp 握手过完成过后,客户端发送请求,服务端返回数据,在17:48:34.242222时间片之前丢了一个 wireshark 说没有抓到(可能是丢了),也就是说在服务端响应过后可能丢了一个包,然后看到三次握手时候的 ack 重复出现。

image-20190321190517191
image-20190321190517191

​ 之后是一堆的 keeplive ack 的报文,keeplive 超时时间到了过后服务端 reset 了 tcp connection。

image-20190321190825868
image-20190321190825868

​ 通过 Google 发现网络上的文章都是说存在网络链路质量问题导致丢包。但是我的环境是使用的openvpn链接到开发环境,也就是说openvpn提供的链路可能有问题,遂尝试点开 vpn 客户端探索一下可配置项,发现openvpn版本是使用 v2.3.17 版本。

openvpn-conf-info
openvpn-conf-info

无脑尝试换到 2.4.3。

openvpn-2.4.3-libressl
openvpn-2.4.3-libressl

居然发现一切正常了。非常可能和openvpn的版本有关系。

normal-http-req-rsp
normal-http-req-rsp

猜想验证 1

​ 搜索发现一个 wireshark 的issue,猜想会不会和 mac 的enc实现有关系?

​ 尝试在 mac 通过sudo sysctl -w net.inet.tcp.ecn_initiate_out=0sudo sysctl -w net.inet.tcp.ecn_negotiate_in=0关闭ecn,发现 wireshakre 显示的 tcp 的握手时符合预期,但是网络时依然不通的,初步排除了 mac os tcp ecn 的可能。(rst 是我 C-c 了 curl 发出的

image-20190317141133151
image-20190317141133151

猜想尝试 2

​ 打开客户端的配置文件发现openvpn的配置模式是tun+udp,看上去是构建一个overlay的网络,猜测可能是服务端和客户端的ssl版本不兼容,在 overlay 网络数据解密的时候出现异常。如果是这样那么应该是所有走tun设备的 tcp 流量都有问题(和之前错误的 tcp 行为一致),结合之前同事让我ssh登录服务器也没有正常登录。

​ 因为没有搜索到openvpn相关的兼容性的changelog,短时间无法验证暂时搁置。

TCP Previous Segment is no captured

大咖讲网络 Wireshark 的提示

tcp reset 的若干原因相对全面