1

У меня есть докер-контейнер на хосте LUbuntu 15.10.

Этот контейнер использует клиент 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-сервера, и мне нужно перезапустить контейнер.

Есть лучший способ сделать это?

КСТАТИ, причина, по которой я сокращаю весь оператор команды, состоит в том, что у меня есть другой контейнер, действующий как 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 ответ1

1

Обычно вам не нужно делать это так:

    keepalive 10 60

в вашем файле конфигурации клиента будет автоматически перезапущен клиент через 60 секунд без поступления пинга. Пинги отправляются каждые 10 секунд, если пропущено 6, то клиент перезагружается.

Кроме того, вы можете запустить openvpn как сервис; в системных дистрибутивах просто скопируйте файл /lib/systemd/system/openvpn@.service в новый файл, скажем /lib/systemd/system/openvpnclient@.service , и измените строку

     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 для использования DNS-серверов VPN-провайдера. Может ли это быть причиной того, что он не может восстановить соединение? Альберто

Конечно. У вас есть два варианта: либо удалить persist-tun , как правильно указал DanielB, либо использовать `persist-remote-ip. Согласно Руководству:

--persist-чан

Не закрывайте и не открывайте устройство TUN/TAP и не запускайте сценарии вверх / вниз по SIGUSR1 или перезапускам --ping-restart.

--persist-удаленного IP

Сохраните самый последний аутентифицированный удаленный IP-адрес и номер порта через SIGUSR1 или --ping-restart restarts.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .