На Arch Linux есть специфическая ситуация с получением DNS-серверов
при подключении через OpenVPN: это не работает из коробки. Для
корректной настройки требуется запускать кастомные скрипты при поднятии
и закрытии туннеля. Готовый скрипт можно взять здесь.
Файл update-systemd-resolved нужно скопировать в
/etc/openvpn/. В конфигурационный файл клиента
/etc/openvpn/client/client.conf добавляем следующее:
script-security 2
up /etc/openvpn/update-systemd-resolved
up-restart
down /etc/openvpn/update-systemd-resolved
down-pre
Чтобы весь DNS-трафик шел через туннель, в конфигурационный файл можно добавить:
dhcp-option DOMAIN-ROUTE .
После этого необходимо сделать файл исполняемым и назначить правильного владельца:
chmod +x /etc/openvpn/update-systemd-resolved
chown openvpn:network /etc/openvpn/update-systemd-resolved
Чтобы скрипт мог менять настройки systemd-resolved от имени
пользователя openvpn, нужно разрешить ему соответствующие действия через
Polkit. Для этого создаём файл
/etc/polkit-1/rules.d/00-openvpn-resolved.rules со
следующим содержимым:
polkit.addRule(function(action, subject) {
if (action.id == 'org.freedesktop.resolve1.set-dns-servers' ||
action.id == 'org.freedesktop.resolve1.set-domains' ||
action.id == 'org.freedesktop.resolve1.set-dnssec') {
if (subject.user == 'openvpn') {
return polkit.Result.YES;
}
}
});
Что делает этот скрипт:
- Проверяет, какая именно операция выполняется через Polkit (установка DNS, доменов или DNSSEC).
- Если действие выполняет пользователь openvpn, оно разрешается
(
Result.YES). - Это позволяет скрипту
update-systemd-resolvedменять настройки DNS systemd-resolved без необходимости запускать его от root напрямую.
После настройки нужно перезапустить соответствующие службы и проверить работу. Перезапускаем systemd-resolved:
systemctl restart systemd-resolved
Перезапускаем OpenVPN-клиент:
systemctl restart openvpn-client@client
Проверяем статус DNS и туннеля:
systemd-resolve --status
Если всё настроено правильно, вывод будет примерно таким:
Link 4 (tun0)
Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6 mDNS/IPv4 mDNS/IPv6
Protocols: +DefaultRoute +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 1.1.1.1
DNS Servers: 1.1.1.1 2.2.2.2
DNS Domain: mydomain.com mydomain.ru
Default Route: yes
Объяснение:
- Link 4 (tun0) – интерфейс, через который проходит VPN-туннель.
- Current Scopes – какие протоколы разрешения имён активны на этом
интерфейсе:
- DNS – стандартный DNS
- LLMNR/IPv4 и LLMNR/IPv6 – локальное разрешение имён в сети (Link-Local Multicast Name Resolution)
- mDNS/IPv4 и mDNS/IPv6 – multicast DNS (часто для локальных устройств типа принтеров, медиасерверов)
- Protocols – протоколы и опции, используемые для разрешения имён:
- +DefaultRoute – использовать этот интерфейс как основной маршрут для DNS
- +LLMNR и +mDNS – активированы соответствующие протоколы
- -DNSOverTLS – DNS-over-TLS не используется
- DNSSEC=no/unsupported – проверка DNSSEC не поддерживается или отключена
- Current DNS Server – текущий DNS-сервер, используемый по умолчанию для запросов.
- DNS Servers – список всех DNS-серверов, назначенных интерфейсу (обычно те, что пришли через OpenVPN).
- DNS Domain – домены поиска для этого интерфейса.
- Default Route – если yes, значит все DNS-запросы по умолчанию идут через этот интерфейс.
Если нужно, чтобы dns-запросы определённого домена шли через
DNS-серверы VPN-интерфейса, можно добавить его вручную через
resolvectl. Например:
resolvectl domain tun0 "~ru"
После этого все DNS-запросы .ru будут идти через
VPN-туннель tun0, а не через основной
интернет-интерфейс.