Contêiner do Docker com o openvpn - como reconectar a VPN se ela estiver inativa?

1

Eu tenho um contêiner docker em um host LUbuntu 15.10.

Este contêiner está usando o cliente openvpn para se conectar a uma conta VPN.ac.

Este é o script que estou executando para reiniciar a conexão vpn se estiver desativada:

#! /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

O problema é que, se a conexão com a internet cair, quando voltar, o script diz que não é possível resolver o nome do host do servidor vpn e eu tenho que reiniciar o container.

Existe uma maneira melhor de fazer isso?

BTW o motivo pelo qual estou usando a instrução de comando inteira é que eu tenho outro contêiner atuando como servidor VPN e se eu apenas fizer "grep openvpn" ele também encontrará o outro serviço.

Obrigado.

P.S - Por favor, veja abaixo o conteúdo do arquivo de configuração do 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
    
por Alberto 04.11.2015 / 08:51

1 resposta

1

Normalmente, você não precisa fazer isso da seguinte maneira: uma declaração como

    keepalive 10 60

no seu arquivo de configuração do cliente reiniciará automaticamente o cliente após 60 segundos sem a chegada de um ping. Pings são enviados a cada 10 segundos, se 6 forem perdidos, o cliente reinicia.

Como alternativa, você pode iniciar o openvpn como um serviço; nas distribuições systemd, basta copiar o arquivo /lib/systemd/system/[email protected] para um novo arquivo, digamos /lib/systemd/system/[email protected] , e mudar a linha

     ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /etc/openvpn/%i.conf

para

     ExecStart=/usr/sbin/openvpn --daemon ovpn-%i --status /run/openvpn/%i.status 10 --cd /etc/openvpn --config /path/to/client-config-file/%i.conf

Por fim,

The problem is that if the internet connection goes down, when it comes back up the script says it's unable to resolve the vpn server hostname and I have to restart the container.

significa que você perdeu sua configuração de DNS, se não toda a conectividade. Você não deu detalhes suficientes para desvendar isso, você pode tentar verificar se perdeu conectividade ou apenas o DNS por

      ping -c1 8.8.8.8

Se você receber uma resposta, você perdeu a configuração do DNS (provavelmente o arquivo /etc/resolv.conf está vazio), se você não perdeu toda a conectividade.

Editar :

The client config file does call the update-resolv-conf script to use the VPN provider's DNS servers. Could that be the reason why it fails to reconnect? – Alberto

Certamente. Você tem duas opções: deletar persist-tun , como corretamente apontado por DanielB, ou usar 'persist-remote-ip. De acordo com o Manual :

--persist-tun

Don't close and reopen TUN/TAP device or run up/down scripts across SIGUSR1 or --ping-restart restarts.

--persist-remote-ip

Preserve most recently authenticated remote IP address and port number across SIGUSR1 or --ping-restart restarts.

    
por 04.11.2015 / 09:56