Привязать 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,

Предостережения:

  1. Использование /usr/local/sbin может сломаться, если NetworkManager обновляется в честь PATH переменная окружения. Если это проблема, переместите реальный исполняемый файл вPATH место, такое как /usr/lib (но см. № 2 ниже).
  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 должен обнаружить этот сценарий, но это не так.

Другие вопросы по тегам