![通过 OpenVPN 隧道的 SSH 连接问题(“TCP 上一个段丢失”)](https://linux22.com/image/749714/%E9%80%9A%E8%BF%87%20OpenVPN%20%E9%9A%A7%E9%81%93%E7%9A%84%20SSH%20%E8%BF%9E%E6%8E%A5%E9%97%AE%E9%A2%98%EF%BC%88%E2%80%9CTCP%20%E4%B8%8A%E4%B8%80%E4%B8%AA%E6%AE%B5%E4%B8%A2%E5%A4%B1%E2%80%9D%EF%BC%89.png)
我有一条通向 OpenVPN 服务器的 VPN 隧道。该 VPN 是 Sophos VPN,其底层使用 OpenVPN。我不知道服务器配置,也无法更改服务器配置。我的隧道端点在 Win 10(OpenVPN 2.4.8)上启用,其配置如下所示:
ip-win32 dynamic
client
dev tun
proto tcp
verify-x509-name "[...]"
route remote_host 255.255.255.255 net_gateway
resolv-retry infinite
nobind
persist-key
persist-tun
dev-node "OpenVPN"
pull-filter ignore redirect-gateway
route 192.168.20.0 255.255.255.0 vpn_gateway 3
<ca>
[...]
</ca>
<cert>
[...]
</cert>
<key>
[...]
</key>
auth-user-pass
cipher AES-128-CBC
auth SHA256
comp-lzo no
route-delay 4
verb 3
reneg-sec 0
remote [...] 8443
现在我遇到的问题是,通过隧道的 SSH 连接挂起debug1: SSH2_MSG_KEXINIT sent
(这是 WSL ssh):
$ ssh -vvvv 192.168.20.147
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "192.168.20.147" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to 192.168.20.147 [192.168.20.147] port 22.
debug1: Connection established.
[...]
debug1: Local version string SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
debug1: match: OpenSSH_7.6p1 Ubuntu-4ubuntu0.3 pat OpenSSH* compat 0x04000000
debug2: fd 3 setting O_NONBLOCK
[...]
debug3: send packet: type 20
debug1: SSH2_MSG_KEXINIT sent
我使用 wireshark 捕获会话并看到“TCP 上一个段丢失”:
No. Time Source Destination Protocol Info
4 2.933875 10.81.234.15 192.168.20.147 TCP 54013 > ssh [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=8
5 3.305435 192.168.20.147 10.81.234.15 TCP ssh > 54013 [SYN, ACK] Seq=0 Ack=1 Win=64480 Len=0 MSS=1240 WS=9
6 3.305511 10.81.234.15 192.168.20.147 TCP 54013 > ssh [ACK] Seq=1 Ack=1 Win=65536 Len=0
7 3.317162 10.81.234.15 192.168.20.147 SSHv2 Client Protocol: SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3\r
8 3.335238 192.168.20.147 10.81.234.15 SSHv2 Server Protocol: SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3\r
9 3.339937 10.81.234.15 192.168.20.147 TCP [TCP segment of a reassembled PDU]
10 3.339948 10.81.234.15 192.168.20.147 SSHv2 Client: Key Exchange Init
11 3.635978 192.168.20.147 10.81.234.15 TCP ssh > 54013 [ACK] Seq=42 Ack=42 Win=64512 Len=0
12 3.947955 192.168.20.147 10.81.234.15 TCP [TCP Previous segment lost] ssh > 54013 [ACK] Seq=1122 Ack=1402 Win=64512 Len=0
我认为这可能与 MTU 有关,因此我尝试在 SSH 服务器和 OpenVPN 客户端端点上设置 MTU(从默认的 1500 到 <1000 的各种值)。没有变化。
我也尝试使用ping -f -l PKTSIZE 192.168.20.147
,有趣的是,ping 直到 PKTSIZE=71 才成功,而对于 PKTSIZE > 71,我收到“请求超时”提示。
注意:在具有 Sophos VPN Endpoint 客户端但属于同一网络的另一台计算机上,一切正常。
答案1
经过长时间的调试,问题终于解决了。这是一个相当复杂的问题。
原来客户也是Bad compression stub decompression header byte: 102
这边那边反映的。
我的客户端是 OpenVPN 2.4.8,但服务器是 OpenVPN 2.3.8。似乎压缩存在错误。客户端配置有comp-lzo no
(如上所示),但需要更改为comp-lzo yes
。