带有 openvpn 的 Docker 容器-如果它关闭了,如何重新连接到 VPN?

带有 openvpn 的 Docker 容器-如果它关闭了,如何重新连接到 VPN?

我在 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 地址和端口号。

相关内容