目前,我正尝试通过运行 Debian Linux 的网关路由我的流量,该网关通过 VPN 连接转发所有传入流量(客户端 -> 带有 OpenVPN 客户端的网关 -> VPN 服务器 -> 互联网)。这工作正常,但它有时会丢失连接,并且由于 nslookup 超时而无法重新连接。这种情况每隔几天就会发生一次,大多是在晚上(据我所知,如果长时间没有发送流量,某些服务器会终止会话)。
发生这种情况时,我会尝试通过 SSH 连接,但输入用户名后,服务器会等待大约 20 秒才要求输入密码,这也很奇怪。通常它会立即要求输入密码。
查看系统日志时出现以下情况:
Jul 20 00:50:11 gateway ovpn-cyberghost[23893]: RESOLVE: Cannot resolve host address: 5-nl.cg-dialup.net: Temporary failure in name resolution
ifconfig 和 route 显示 VPN 接口仍然处于运行状态,但似乎已挂断。
root@gateway:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.129.57.169 128.0.0.0 UG 0 0 0 tun0
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth2
10.129.57.169 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
93.190.138.125 192.168.0.1 255.255.255.255 UGH 0 0 0 eth2
128.0.0.0 10.129.57.169 128.0.0.0 UG 0 0 0 tun0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2
217.23.12.229 192.168.0.1 255.255.255.255 UGH 0 0 0 eth2
这是我的 OpenVPN 配置:
client
remote 5-nl.cg-dialup.net 443
dev tun
proto udp
auth-user-pass /etc/openvpn/auth.txt
route-nopull
resolv-retry infinite
redirect-gateway def1
persist-key
persist-tun
writepid /run/openvpn.pid
nobind
cipher AES-256-CBC
auth MD5
ping 5
ping-restart 20
persist-local-ip
ping-timer-rem
explicit-exit-notify 2
script-security 2
remote-cert-tls server
route-delay 5
tun-mtu 1500
fragment 1300
mssfix 1300
verb 1
comp-lzo
这是我的 resolv.conf:
root@gateway:~# cat /etc/resolv.conf
nameserver 85.214.20.141
nameserver 213.73.91.35
更改名称服务器,例如更改为 127.0.0.1(bind9 正确安装为 DNS 解析器),并没有解决任何问题,但我不希望在这里找到问题。
我猜,原因如下:由于客户端不活动,服务器关闭了会话,因此客户端尝试重新连接。在重新连接的过程中,OpenVPN 解析了 VPN 服务器的主机名,但它使用损坏的 VPN 接口(该接口被设置为默认网关,而不是正确的默认网关)。没有进行清理(删除 tun0 接口并删除路由),这也许可以解决问题。此外,我认为有两个默认网关可能会有问题,但我不确定。
手动终止 OpenVPN 进程并重新启动后,一切都正常运行,就像什么都没发生过一样。
我不知道如何告诉 OpenVPN 使用 eth2 接口进行初始 nslookup 或让 OpenVPN 清理路由。我是不是忘了在配置文件中添加某些内容(我在手册页中没有找到任何有用的命令)?
答案1
https://askubuntu.com/questions/28733/how-do-i-run-a-script-after-openvpn-has-connected-successfully告诉如何在连接建立或断开后执行自定义脚本。
因此,您应该创建一个关闭脚本,它将清理路由并让 OpenVPN 在连接断开时执行该脚本。