У меня есть несколько серверов, работающих в VirtualBox, связанных единой сетью. Родительская система - это Ubuntu с запущенным NetworkManager, который управляет DNS в соответствии с подключенной сетью, поэтому мои resolv.conf
содержит
nameserver 127.0.1.1
VirtualBox настроен так, что родительская система имеет адрес 10.1.0.1
а виртуальные серверы статически настроены на 10.1.0.2
, 10.1.0.3
....
Когда я меняю сеть, я всегда нахожу (через nmcli
) мой фактический сервер имен и укажите значение для каждого из виртуальных серверов. Это раздражает, так как я часто меняю сеть и подключаюсь через разные интерфейсы (wlan0
, eth0
).
Моя идея состоит в том, чтобы использовать управляемый DNS-сервер NetworkManager в качестве сервера для виртуальных машин. Но когда я поставил сервер имен 10.1.0.1
в resolv.conf виртуальных серверов DNS не разрешен.
Очевидно, что DNS-сервер, управляемый NetworkManager, привязан только к 127.0.1.1
.
Я пытался добавить listen-interface=10.1.0.1
к /etc/NetworkManager/dnsmasq.d/<my-file>
он работает после перезапуска NetworkManager, но только тогда, когда Virtual Box запущен и vboxnet0
интерфейс существует. Когда Virtual Box не работает, dnsmasq
не запускается.
Я также пробовал использовать bind-dynamic
вариант для dnsmasq, но он несовместим с bind-interface
добавлен к dnsmasq
команда NetworkManager.
Вопрос: Как я могу заставить NetworkManager привязать dnsmasq к 10.1.0.1
после vboxnet0
интерфейс появляется? Или как заставить его запускать другой экземпляр dnsmasq
пересылка 10.1.0.1
просьба к 127.0.1.1
?
# ifconfig
...
vboxnet0 Link encap:Ethernet HWaddr 0a:00:27:00:00:00
inet addr:10.1.0.1 Bcast:10.1.0.255 Mask:255.255.255.0
...
-
# ps aux|grep dnsmasq
nobody 1252 0.0 0.0 52976 4108 ? S dub10 0:00
/usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts
--bind-interfaces --pid-file=/var/run/NetworkManager/dnsmasq.pid
--listen-address=127.0.1.1 --cache-size=0 --conf-file=/dev/null
--proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq
--conf-dir=/etc/NetworkManager/dnsmasq.d
-
#netstat -antp|grep ':53'
tcp 0 0 127.0.1.1:53 0.0.0.0:* LISTEN 1252/dnsmasq
-
# nslookup google.com 127.0.1.1
Server: 127.0.1.1
Address: 127.0.1.1#53
Non-authoritative answer:
Name: google.com
Address: 64.233.164
-
# nslookup google.com 10.1.0.1
;; connection timed out; no servers could be reached
Это можно решить (хех) с помощью сценария-оболочки для dnsmasq
заменить --bind-interfaces
с участием --bind-dynamic
, но почему-то NetworkManager
жестко кодирует свой путь поиска, поэтому сначала нужно убрать исходный двоичный файл (на dpkg
-системы, используйте такую команду, как dpkg-divert --local --rename --divert /usr/local/sbin/dnsmasq --add /usr/sbin/dnsmasq
).
Затем создайте новый /usr/sbin/dnsmasq
:
#!/bin/bash
args=("$@")
for (( i=0; i<${#args}; ++i )); do
case "${args[i]}" in
-z|--bind-interfaces)
args[i]=--bind-dynamic
;;
--)
break
;;
esac
done
exec /usr/local/sbin/dnsmasq "${args[@]}"
+ Изменить /usr/local/sbin/dnsmasq
если необходимо, чтобы указать на исходный двоичный файл, отметьте сценарий как исполняемый (chmod +x /usr/sbin/dnsmasq
) и добавить все interface=
строк в файл в /etc/NetworkManager/dnsmasq.d
.
/usr/local/sbin
может сломаться, если NetworkManager
обновлен в честь PATH
переменная окружения. Если это вызывает беспокойство, переместите реальный исполняемый файл в не-PATH
место, такое как /usr/lib
(но см. № 2 ниже)./usr/sbin
в $PATH
вызовет --bind-interfaces
(-z
) для замены при вызове вручную dnsmasq
в командной строке.Расширение ответа @ lumato-reinstate-monica выше, поскольку я не могу добавлять дополнительные блоки кода в комментарий.
Я также счел полезным отключить localhost listen-address
вариант как bind-dynamic
это покрыто.
--listen-address=*)
unset args[i]
args=(${args[@]})
;;
Настройка bind-dynamic
наряду с настройкой сетевого менеджера listen-address=127.0.1.1
генерировал сообщения об ошибках о том, что dnsmasq не мог дважды привязаться к одному и тому же адресу: порту, который запрашивает эта конфигурация. Возможно, dnsmasq должен обнаружить этот сценарий, но это не так.