openvpn 链接问题分析
到新环境熟悉内部接口,postman 去调试内部服务接口发现接口没有返回,换个电脑调用正常。初步怀疑是自己电脑问题,遂打开 wireshark 根据目标主机 ip 结合路由信息判断的走的utun1
接口出流量。
上图通过 wireshark 看到我获取 cube 接口GET
请求发出去,多次尝试依然都是http
的 response 的没有被用户进程收到,wireshark 报错tcp previos sgement not captured
。单独点开tcp segment
可以在 wireshark 中看到 response 是回来了但是没有成功的被应用层接收到 (如下图)。
换个更直观的 tcp flow 的图(忽略里面的 ECN 协商的):在 tcp 握手过完成过后,客户端发送请求,服务端返回数据,在17:48:34.242222
时间片之前丢了一个 wireshark 说没有抓到(可能是丢了),也就是说在服务端响应过后可能丢了一个包,然后看到三次握手时候的 ack 重复出现。
之后是一堆的 keeplive ack 的报文,keeplive 超时时间到了过后服务端 reset 了 tcp connection。
通过 Google 发现网络上的文章都是说存在网络链路质量问题导致丢包。但是我的环境是使用的openvpn
链接到开发环境,也就是说openvpn
提供的链路可能有问题,遂尝试点开 vpn 客户端探索一下可配置项,发现openvpn
版本是使用 v2.3.17 版本。
无脑尝试换到 2.4.3。
居然发现一切正常了。非常可能和openvpn
的版本有关系。
猜想验证 1
搜索发现一个 wireshark 的issue,猜想会不会和 mac 的enc
实现有关系?
尝试在 mac 通过sudo sysctl -w net.inet.tcp.ecn_initiate_out=0
和sudo sysctl -w net.inet.tcp.ecn_negotiate_in=0
关闭ecn
,发现 wireshakre 显示的 tcp 的握手时符合预期,但是网络时依然不通的,初步排除了 mac os tcp ecn 的可能。(rst 是我 C-c 了 curl 发出的
猜想尝试 2
打开客户端的配置文件发现openvpn
的配置模式是tun
+udp
,看上去是构建一个overlay
的网络,猜测可能是服务端和客户端的ssl
版本不兼容,在 overlay 网络数据解密的时候出现异常。如果是这样那么应该是所有走tun
设备的 tcp 流量都有问题(和之前错误的 tcp 行为一致),结合之前同事让我ssh
登录服务器也没有正常登录。
因为没有搜索到openvpn
相关的兼容性的changelog
,短时间无法验证暂时搁置。