Как заставить networkmanager настроить доменные серверы имен с помощью openresolv + dnsmasq

11

Я часто подключаюсь к нескольким сетям одновременно. Каждая из этих сетей обеспечивает настройку сервера имен через dhcp. Например, сеть 1: (eth0):

domain company1.corp #
nameserver 192.168.0.253
nameserver 192.168.0.254

Сеть 2 (tun0):

domain company2.corp #
nameserver 10.102.204.51
nameserver 10.102.208.51

# Имена изменены

При одновременном подключении к обеим сетям:

# resolv.conf from NetworkManager
domain company1.corp, company2.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
nameserver 10.102.204.51
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 10.102.208.51

Разрешение service.company2.corp не работает, так как первый сервер имен знает только имена company1.corp.

Вдохновленный этой статьей , я настроил openresolv (реализацию resolvconf), настраивая локальную службу dnsmasq в моей установке Arch linux.

Если я настраиваю серверы имен вручную, используя resolvconf:

# resolvconf -d NetworkManager
# echo "domain company1.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
" | resolvconf -a eth0
# echo "domain company2.corp
nameserver 10.102.204.51
nameserver 10.102.208.51
" | resolvconf -a tun0

Затем я могу разрешить имена как из company1.corp, так и company2.corp (это обрабатывает локальный сервер dnsmasq.)

Обратите внимание, что после ручной настройки, resolconf -l показывает 2 конфигурации отдельно:

~ # resolvconf -l
# resolv.conf from tun0
domain company2.corp
nameserver 10.102.204.51
nameserver 10.102.208.51

# resolv.conf from eth0
domain company1.corp
nameserver 192.168.0.253
nameserver 192.168.0.254

Однако, когда сетевой менеджер разрешает выполнять настройку, две конфигурации не являются отдельными, как если бы сетевой менеджер писал в /etc/resolve.conf

~ # resolvconf -l
# resolv.conf from NetworkManager
# Generated by NetworkManager
domain company1.corp, company2.corp
nameserver 192.168.0.253
nameserver 192.168.0.254
nameserver 10.102.204.51
# NOTE: the libc resolver may not support more than 3 nameservers.
# The nameservers listed below may not be recognized.
nameserver 10.102.208.51

Мой вопрос заключается в том, как заставить сетевой менеджер правильно вызывать resolconf, чтобы серверы имен для каждого интерфейса регистрировались отдельно. (К сожалению, поиск в Google для этого бесполезен, потому что Google считает, что "resolconf" == "resol.conf")

Гари ван дер Мерве
источник
2
В гугле ищите "resolvconf"с кавычками. Всегда помещайте кавычки вокруг собственных имен в Google.
Жиль "ТАК - перестань быть злым"

Ответы:

14

NetworkManager обладает функциональностью для управления встроенным локальным сервером dnsmasq. Для этого не нужно использовать resolvconf / openresolv.

Чтобы включить это:

  • Отключите конфигурацию resolvconf / openresolv dnsmasq, если она была ранее включена, и убедитесь, что не запущены экземпляры dnsmasq.
  • Убедитесь, что dnsmasq установлен
  • Добавить dns=dnsmasqв /etc/NetworkManager/NetworkManager.conf.
  • Перезапустите NetworkManager

Как только вы это сделаете, вы увидите, что NetworkManager запустил процесс dnsmasq:

$ pgrep dnsmasq -fl
1697 /usr/bin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/nm-dns-dnsmasq.pid --listen-address=127.0.0.1 --conf-file=/var/run/nm-dns-dnsmasq.conf --cache-size=400 --proxy-dnssec

/etc/resolve.conf должен указывать на локальный экземпляр dnsmasq:

$ cat /etc/resolv.conf
# Generated by NetworkManager
domain company1.corp
search company1.corp
nameserver 127.0.0.1

и мы можем увидеть, какие серверы использует dnsmasq:

# cat /var/run/nm-dns-dnsmasq.conf 
server=/company2.corp/10.102.208.51
server=/10.in-addr.arpa/10.102.208.51
server=192.168.1.244
server=192.168.1.239
Гари ван дер Мерве
источник
очень мило, спасибо! очень простое и простое решение, но, к сожалению, малоизвестно - не удержался, извините
akostadinov
Это похоже на работу при объединении локального соединения с одной или двумя VPN. Кажется, он не работает с двумя локальными подключениями. В настоящее время я подключен к офисной сети через Ethernet, где, к сожалению, не удалось подключиться к Интернету. Также я подключен через USB Ethernet (мой телефон) к работающему Интернету. Я не могу заставить NetworkManager применить доменное имя к офисному DNS-серверу.
Оскар Берггрен
@OskarBerggren: В вашей локальной сети Office на вкладке IPv4 установите флажок «Использовать это соединение только для ресурсов в своей сети».
Гэри ван дер Мерве
@GaryvanderMerwe Это именно то, что я пытался, забыл написать. Кажется, есть связанный запрос об ошибке / функции: bugzilla.gnome.org/show_bug.cgi?id=685962
Оскар Берггрен
К вашему сведению, нет возможности использовать, uboundпоэтому DNSSEC работает, см. Fedoraproject.org/wiki/Networking/NameResolution/DNSSEC
akostadinov
0

Похоже, что NetworkManager просто перезаписывает /etc/resolv.confи не использует openresolv. Согласно FS № 24635 , NetworkManager действительно поддерживает openreslov, но изначально он не был включен в сборку. Какую версию Arch Linux вы используете и какая версия пакета networkmanager?

mgorven
источник
networkmanager 0.9.4.0-6 NetworkManager вызывает resolconf, а не записывает в /etc/resolev.conf. Проблема заключается в том, что NetworkManager объединяет информацию DNS и передает ее в resolconf как один интерфейс, а не как информацию для отдельных интерфейсов.
Гэри ван дер Мерве
0

Делай, как ответил Гари ван дер Мерве, но в

/etc/NetworkManager/NetworkManager.conf

Я должен был добавить

[main]
dns=dnsmasq

в файл. Не просто

dns=dnsmasq

Это потому, что все настройки в этом файле должны быть в разделе, а мой дистрибутив manjaro (archlinux) версии пакета NetworkManager не заполняет файл конфигурации. (Я предполагаю, что дистрибутив Гари работает, так как его предложенная линия работала для него других)

Еще одно примечание, любая конфигурация dnsmasq должна идти в файле конфигурации в этом

/etc/NetworkManager/dnsmasq.d/

каталог. Это может быть другой каталог на вашем компьютере. Я узнал об используемом каталоге, посмотрев на строку, которую NetworkManager использует для запуска демона dnsmasq. Вы можете увидеть эту строку, запустив ps aux|grep dnsmasq. Вы должны подождать, чтобы запустить это, пока не измените конфигурацию NetworkManager и не перезапустите его службу.

SultanLegend
источник