![带有 openvpn 的 Docker 容器-如果它关闭了,如何重新连接到 VPN?](https://linux22.com/image/1472135/%E5%B8%A6%E6%9C%89%20openvpn%20%E7%9A%84%20Docker%20%E5%AE%B9%E5%99%A8-%E5%A6%82%E6%9E%9C%E5%AE%83%E5%85%B3%E9%97%AD%E4%BA%86%EF%BC%8C%E5%A6%82%E4%BD%95%E9%87%8D%E6%96%B0%E8%BF%9E%E6%8E%A5%E5%88%B0%20VPN%EF%BC%9F.png)
我在 LUbuntu 15.10 主机中有一个 docker 容器。
该容器正在使用 openvpn 客户端连接到 VPN.ac 帐户。
这是我运行的脚本,用于在 VPN 连接中断时重新启动它:
#! /bin/bash
while true
do
sleep 60s
ps -ef | grep -v grep | grep "/usr/sbin/openvpn --cd /etc/openvpn --config /etc/openvpn/default.conf --redirect-gateway"
if [ $? -eq 1 ] ; then
sv restart openvpn
fi
done
问题是,如果互联网连接中断,当恢复时,脚本会说无法解析 vpn 服务器主机名,我必须重新启动容器。
有一个更好的方法吗?
顺便说一句,我之所以对整个命令语句进行 grep 是因为我有另一个容器充当 VPN 服务器,如果我只是执行“grep openvpn”,那么它也会找到其他服务。
谢谢。
PS-请参阅以下 OpenVPN 配置文件的内容。
remote nl1.vpn.ac 50000 udp
dev tun
tls-client
persist-tun
persist-key
nobind
pull
redirect-gateway def1
route-delay 3
auth-user-pass pw
keepalive 10 60
verb 3
explicit-exit-notify 2
remote-cert-tls server
setenv CLIENT_CERT 0
key-direction 1
cipher AES-256-CBC
auth SHA512
<ca>
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
</ca>
<tls-auth>
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
-----END OpenVPN Static key V1-----
</tls-auth>
script-security 2
up update-resolv-conf.sh
down update-resolv-conf.sh
答案1
通常情况下,你不需要这样做:像这样的语句
keepalive 10 60
客户端配置文件中的 将在 60 秒内没有收到 ping 后自动重启客户端。每 10 秒发送一次 ping,如果错过 6 次,则客户端将重启。
或者,你可以将 openvpn 作为服务启动;在 systemd 发行版上,只需将文件复制到一个新文件,例如,然后将行/lib/systemd/system/[email protected]
/lib/systemd/system/[email protected]
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf
到
ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /path/to/client-config-file/%i.conf
最后,
问题是,如果互联网连接中断,当恢复时,脚本会说无法解析 vpn 服务器主机名,我必须重新启动容器。
意味着您已丢失 DNS 配置,如果不是所有连接都丢失的话。您没有提供足够的详细信息来解决这个问题,您可以尝试通过以下方式确定您是否丢失了连接或只是 DNS
ping -c1 8.8.8.8
如果您收到回复,则表示您丢失了 DNS 配置(很可能您的/etc/resolv.conf
文件是空的),如果没有收到回复,则表示您丢失了所有连接。
编辑:
客户端配置文件确实调用 update-resolv-conf 脚本来使用 VPN 提供商的 DNS 服务器。这可能是无法重新连接的原因吗? – Alberto
当然。你有两个选择:要么删除persist-tun
,正如 DanielB 正确指出的那样,要么使用“persist-remote-ip”。根据手册:
--persist-tun
不要关闭并重新打开 TUN/TAP 设备,也不要跨 SIGUSR1 或 --ping-restart 重启运行上/下脚本。
–persist-remote-ip
在 SIGUSR1 或 --ping-restart 重新启动时保留最近经过验证的远程 IP 地址和端口号。