Ubuntu 18.04 нет разрешения DNS при подключении к OpenVPN

Когда я подключаюсь к сети VPN через Gnome Network-manager, я теряю разрешение DNS, и на практике я не могу получить доступ к ресурсам внутри сети VPN или снаружи.

Когда я использовал Ubuntu 16.04 и использовал VPN, "/etc/resolv.conf/" файл будет содержать DNS-серверы сети (VPN), к которой я подключился. Теперь он всегда содержит следующие записи:

nameserver 127.0.0.53search myprovider.com

Из того, что я понял 127.0.0.53 является ли адрес заглушки DNS, используемой system-resolved.

Я подозреваю, что это ошибка, потому что VPN нормально работал в Ubuntu 16.04. Есть ли какой-либо способ, которым я могу настроить DNS-серверы своей сети, когда я использую VPN-сервис?

Обновление:

Я попытался подключиться к сети OpenVPN с помощью файла конфигурации, прикрепленного в конце сообщения, но я получаю следующую ошибку:

 Authenticate/Decrypt packet error: cipher final failed

Я убедился, что сервер использует сжатие lzo, и я также включил его. Соединение остается активным, но я не могу перейти ни на одну страницу внутри или за пределами VPN.

В конфигурационный файл, указанный ниже, я включил решения, опубликованные в ответах

 client dev tun proto udp remote openvpn.bibsys.no 1194 remote my-server-2 1194 resolv-retry infinite nobind user myuser group myuser persist-key persist-tun ca ca-cert.pem cert openvpn.crt key openvpn.key cipher AES-256-CBC comp-lzo yes script-security 2 up /etc/openvpn/scripts/update-systemd-resolved down /etc/openvpn/scripts/update-systemd-resolved down-pre

Проблема

Файл /etc/resolv.conf не обновляется с помощью /etc/openvpn/update-resolv-conf сценарий, потому что resolvconf не установлен по умолчанию в ubuntu 18.04.

На самом деле, одна из первых строк этого скрипта проверяет наличие /sbin/resolvconf выполнимый:

[ -x /sbin/resolvconf ] || exit 0

Установка resolvconf через apt-get не является решением, поскольку /etc/openvpn/update-resolv-conf сценарий обновляет /etc/resolv.conf файл с отправленной записью DNS, но устройство tun, похоже, игнорирует его.

Решение

  1. Ubuntu 18.04 использует systemd-resolved, так что все, что вам нужно сделать, это установить вспомогательный скрипт openvpn для systemd-resolved через

    sudo apt install openvpn-systemd-resolved

    или с эти инструкции на GitHub

  2. Обновите свой config.ovpn файл, добавляющий эти строки:

    script-security 2up /etc/openvpn/update-systemd-resolveddown /etc/openvpn/update-systemd-resolveddown-pre

    Что вместо того, чтобы складывать вверх и вниз по /etc/openvpn/update-resolv-conf на конференцию.

  3. Чтобы предотвратить утечку DNS, вы должны добавить эту строку в конец config.ovpn файл (в соответствии с этот комментарий к проблеме systemd):

    dhcp-option DOMAIN-ROUTE .

Я нашел решение на это сообщение в блоге. Хотя есть два упомянутых решения, я предпочитаю использовать второе, потому что это означает, что мой DNS устанавливается сервером OpenVPN (первое решение означает, что я использую одни и те же DNS-серверы независимо от того, подключен я к серверу OpenVPN или нет).

Короче говоря:

  • sudo mkdir -p /etc/openvpn/scripts
  • sudo wget https://raw.githubusercontent.com/jonathanio/update-systemd-resolved/master/update-systemd-resolved -P /etc/openvpn/scripts/
  • sudo chmod +x /etc/openvpn/scripts/update-systemd-resolved

Затем отредактируйте свой файл клиента OpenVPN (например, client.ovpn), изменив скрипты up/down на:

script-security 2# up /etc/openvpn/update-resolv-conf# down /etc/openvpn/update-resolv-confup /etc/openvpn/scripts/update-systemd-resolveddown /etc/openvpn/scripts/update-systemd-resolved

(Я закомментировал исходные настройки вверх / вниз).

На самом деле, есть гораздо более простое решение этой проблемы. Проблема связана с DNS-трафиком и тем, как Ubuntu 18 управляет им. По умолчанию переадресация IP-адресов отключена, что необходимо OpenVPN для обеспечения надлежащей работы сети. Все, что вам нужно сделать, это выполнить следующую команду:

sudo nano /etc/sysctl.conf

Как только вы откроете этот файл, найдите строку, содержащую net.ipv4.ip_forward. Если эта строка закомментирована, удалите знак # в начале строки (если она не закомментирована, значит, у вас другая проблема). Сохраните файл, а затем перезапустите экземпляр сервера OpenVPN.

Это исправление не требует каких-либо изменений в коде клиента или OpenVPN после обновления до Ubuntu 18. Протестировано и подтверждено работоспособность.

Однако для этого, очевидно, требуется, чтобы вы могли администрировать сервер. И, к сожалению, ошибка существует для многих, кто просто подключается с помощью 18.04 к серверу OpenVPN, который администрируется кем-то другим...

Протестировано на Ubuntu 18.04 13 сентября 2018 года

Существует еще одна полезная команда для настройки того, что вам нужно, через командную строку. Вы можете управлять своим VPN-соединением как с помощью командной строки, так и с помощью графического интерфейса.

sudo nmcli connection add type vpn vpn-type openvpn con-name la.vpn.contoso.com ifname --

ifname -- является обязательным по умолчанию, но ни на что не влияет

sudo nmcli connection modify la.vpn.contoso.com ipv4.dns 172.16.27.1sudo nmcli connection modify la.vpn.contoso.com ipv4.dns-search int.contoso.comsudo nmcli connection modify la.vpn.contoso.com ipv4.never-default yes

never-default не следует использовать удаленный шлюз в качестве маршрута по умолчанию

И гораздо более интересный последний штрих:

nmcli connection modify la.vpn.contoso.com vpn.data 'ca = /tmp/la.vpn.contoso.com/you/ca.crt, key = /tmp/you.key, dev = tun, cert = /tmp/you.crt, cert-pass-flags = 1, comp-lzo = adaptive, remote = la.vpn.contoso.com:1194, connection-type = tls'

После этого вы можете управлять vpn с помощью графического интерфейса или использовать следующие команды:

sudo nmcli --ask connection up la.vpn.contoso.comsudo nmcli connection down la.vpn.contoso.com

На меня это тоже повлияло. В моем случае я использую OpenVPN с внутренним сервером имен (который находится внутри VPN). Это работало до Ubuntu 17.10 (с hosts: files dns в /etc/nsswitch.conf).

/etc/resolv.conf был корректно обновлен скриптами openvpn (посредством вызовов /etc/openvpn/update-resolv-conf в файле конфигурации клиента openvpn).

Однако разрешение имен для хостов внутри VPN больше не работало (или, по крайней мере, эпизодически... Я предполагаю, что локальный DNS-кэш выбирал имена, но спустя довольно долгое время).

Что, по-видимому, поможет или даже решит проблему (хотя об этом еще слишком рано говорить), так это установка приведенного ниже пакета:

sudo apt install openvpn-systemd-resolved

Если ваша система использует NetworkManager, то вам может потребоваться только изменить приоритет DNS соединения, согласно этот ответ:

nmcli -p connection modify VPN_CONNECTION_NAME ipv4.dns-priority -1

В моем случае DNS обновлялся, но игнорировался, поскольку существующие DNS-серверы имели приоритет. Вам может понадобиться root/sudo. Если это не сработает, попробуйте ipv6.dns-priority.

Ни одно из предложенных CLI-ориентированных (не связанных с NetworkManager) решений не сработало для меня (у меня даже нет up и down линии в myconfig.ovpn).

Однако я обнаружил, что NetworkManager VPN, похоже, снова работает (год или два назад он не работал, поэтому я тогда переключился на openvpn CLI). Я никак не настраивал его: просто попытался активировать его с помощью соответствующих учетных данных.

При отладке аналогичной проблемы, которая не могла быть решена точно так же, я использовал “resolvectl status” и “resolvectl help”, чтобы найти свое конкретное решение.