我有一台 OpenVPN 服务器,它被设置为通过 TCP 连接与各种远程网络上的许多其他服务器建立隧道。除了其中一台远程服务器之外,其他服务器都运行得非常可靠。对于该远程服务器,大约每天一次我们无法通过 VPN 从 VPN 服务器连接到在该服务器上运行的 Web 服务器。大约 15 分钟后,远程服务器上的 OpenVPN 将在日志中显示以下消息:
read TCPv4_CLIENT [NO-INFO]: Connection timed out (code=110)
然后远程服务器将重新启动 OpenVPN 连接并正常运行。
当此问题发生时,我已经能够在远程服务器和 VPN 服务器上运行 tcpdump,并且当我从 VPN 服务器通过 telnet 连接到远程服务器上的 Web 服务器时,远程服务器上的情况如下所示。
tun0:
17:23:35.965732 IP vpn-server > remote-server.http: Flags [S], seq 1905371748, win 29200, options [mss 1460,sackOK,TS val 234388092 ecr 0,nop,wscale 7], length 0
eth0:
17:23:51.981758 IP vpn-server.51194 > remote-server.55840: Flags [P.], seq 1035:1138, ack 1, win 28288, options [nop,nop,TS val 234392096 ecr 529325214,nop,nop,sack 1 {1016:14557}], length 103
17:23:52.024782 IP remote-server.55840 > vpn-server.51194: Flags [.], ack 1138, win 1002, options [nop,nop,TS val 529365753 ecr 234392096], length 0
我手边没有远程服务器的踪迹,但在远程服务器上我可以看到 eth0 和 tun0 上的传入数据包以及 eth0 和 tun0 上的传出数据包。当问题发生时,我还可以在远程服务器上看到 OpenVPN 保持活动数据包。
所以对我来说,这看起来像是来自 telnet 的初始数据包被发送到远程服务器并且响应数据包返回,但是该响应数据包从未放在 tun0 上。
由于这种情况只发生在我们的一台远程服务器上,我假设那里的网络连接出了问题,但我不知道是什么问题。也许是一些数据包丢失了或者其他什么原因,但当我在发生此问题时在远程服务器上时,据我所知,网络连接工作正常。此外,如果它能更快地检测到这个问题并在发生这种情况时重新启动 openvpn 连接,我会非常高兴。
我在配置文件中设置了“keepalive 5 30”,但当出现此问题时,似乎 OpenVPN 保持活动数据包实际上正在 VPN 服务器和远程服务器之间来回传输。
客户端配置:
client
dev tun
proto tcp
remote remote-server 51194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca-cert.pem
cert client-cert.pem
key client-key.pem
ns-cert-type server
comp-lzo
verb 3
script-security 2
keepalive 5 30
服务器配置:
ca ca-cert.pem
cert server-cert.pem
client-config-dir clients
comp-lzo
dev tun
dh dh1024.pem
ifconfig-pool-persist ipp.txt
group nogroup
key server-key.pem
max-clients 100
persist-key
persist-tun
ping 10
port 51194
proto tcp
push "route 10.0.0.0 255.255.0.0"
server 10.242.0.0 255.255.0.0
status openvpn-status.log
topology subnet
user nobody
verb 4