Привязать NetworkManager управляемый dnsmasq к устройству, когда оно появляется
У меня есть несколько серверов, работающих в 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 в качестве сервера для виртуалов. Но когда я поставил nameserver 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, но только когда виртуальная коробка запущена и vboxnet0
интерфейс существует. Когда Виртуальный ящик не работает 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
1 ответ
Это может быть решено (хех) с помощью сценария оболочки для 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 выше, так как я не могу добавить дополнительные блоки кода в комментарии.
Я также нашел полезным сбросить локальный хост listen-address
вариант как bind-dynamic
это покрыло.
--listen-address=*)
unset args[i]
args=(${args[@]})
;;
настройка bind-dynamic
наряду с настройкой сетевого менеджера listen-address=127.0.1.1
генерировал сообщения об ошибках о том, что dnsmasq не может дважды привязаться к одному и тому же адресу: порту, который запрашивает эта конфигурация. Возможно, dnsmasq должен обнаружить этот сценарий, но это не так.