Как настроить split-dns для vpn с помощью сетевого менеджера
Я хочу создать конфигурацию split-DNS на настольном компьютере 14.04 с локальной сетью eth и соединением VPN. Т.е. я должен отправить DNS-запросы для диапазонов адресов, к которым осуществляется доступ через vpn, к (частным) DNS-серверам, настроенным для этого конкретного подключения vpn. Другие адреса, которые обслуживаются через локальную сеть, должны использовать разные (публичные) DNS-серверы.
https://www.stgraber.org/2012/02/24/dns-in-ubuntu-12-04/ предполагает, что это легко сделать сейчас, когда у нас есть локальный преобразователь dnsmasq. Цитата:
Большим преимуществом является то, что если вы подключаетесь к VPN, вместо того, чтобы весь ваш DNS-трафик направлялся через VPN, как в прошлом, вы вместо этого будете отправлять только DNS-запросы, относящиеся к подсети и доменам, объявленным этой VPN. Это особенно интересно для VPN-соединений с высокой задержкой, где в прошлом все было бы замедлено.
Но я не могу понять, как заставить это работать! При неактивном VPN администратор сети сообщает dnsmasq использовать локальные общедоступные DNS-серверы в качестве вышестоящих серверов (это хорошо). Если я сейчас активирую VPN-соединение, сетевой менеджер скажет dnsmasq сменить вышестоящие dns-серверы на частные, настроенные для vpn-соединения. И теперь весь мой локальный трафик идет в vpn для поиска DNS (это плохо!).
Если бы у меня была "настоящая" настройка dnsmasq, я мог бы указать ей в dnsmasq.conf, чтобы он перенаправлял определенные поиски на определенные DNS-серверы. Но как это работает с урезанной настройкой dnsmasq / network-manager, поставляемой с рабочим столом Ubuntu?
Я предполагаю, что один из вариантов - просто установить полный dnsmasq, но тогда это означает, что мне нужно хранить детали конфигурации в двух отдельных местах, что в большинстве случаев преодолевает сетевой менеджер. Какие-либо предложения?
3 ответа
Чтобы получить управляемый D-Bus dnsmasq, который NetworkManager запускает для использования разных DNS-серверов, есть следующие параметры (очевидно, настройте домены и IP-адреса в примерах):
- Добавить файл в
/etc/NetworkManager/dnsmasq.d
который устанавливает DNS-сервер для нужной вам подсети:myvpn-server.conf
может содержатьserver=/myvpn.domain.com/10.8.4.9
, Это всегда будет учитываться dnsmasq, даже если он не подключен к VPN, и в этом случае запросы для этих доменов должны прерваться. Недостаток в том, что вам нужно указывать IP-адрес статически, преимущество в простоте - Используйте D-Bus, чтобы напрямую общаться с dnsmasq, чтобы сообщить ему об обновлении серверов, используя что-то вроде
sudo dbus-send --system --print-reply --dest=org.freedesktop.NetworkManager.dnsmasq /uk/org/thekelleys/dnsmasq uk.org.thekelleys.SetDomainServers "array:string:192.168.0.1,/myvpn.domain.com/10.8.4.9"
, Это может быть записано в сценарии при подключении vpn. Вам нужно поискать существующие DNS-серверы (192.168.0.1
в моем примере) через D-Bus или используяnm-cli
- Используйте D-Bus, чтобы поговорить с самим Network Manager и попросить его обновить серверы. Вот пример выполнения этого с использованием Python, который потребует некоторой работы для включения текущих серверов.
Я использую первый вариант и пробовал только предварительные версии двух других
Скорее всего, это проблема конфигурации на стороне сервера. Сервер vpn должен выдвигать только те домены, которые он может разрешить.
Например, если вы используете сервер openvpn, конфигурация пользователя может выглядеть так:
ifconfig-push 172.16.0.51 255.255.255.0
push "route 172.16.1.0 255.255.255.0 172.16.0.1"
push "route 192.168.2.0 255.255.255.0 172.16.0.6"
push "dhcp-option DNS 172.16.0.1"
push "dhcp-option DOMAIN some.of.your.domains"
push "dhcp-option DOMAIN another.domain"
Таким образом, ваш клиент знает, что ваш сервер может разрешать только домены, указанные здесь.
Конфигурация dnsmasq может быть весьма минимальной в случае, если вы используете Networkmanager:
domain-needed
interface=lo
bind-interfaces
Еще одна распространенная ошибка: вам необходимо настроить параметры IP-соединения вашего vpn-соединения в networkmanager так, чтобы он "использовал соединение только для ресурсов своей сети" (например, здесь: https://brmlab.cz/_media/project/warzone/nv-routes.png)
В противном случае маршрутизация всегда будет использовать ваше соединение vpn через "реальный" интерфейс. Метрики обычно правильно устанавливаются сетевым менеджером (более высокая метрика для vpn, чем базовая сеть)
Скорее всего, вы ищете поля DNS Search Domain и Additional DNS Server на вкладках IPv4 и IPv6 в приложении nm-connection-editor.
Просто введите IP-адрес домена вашей компании и DNS-сервера.