Назад | Перейти на главную страницу

Привязать управляемую dnsmasq NetworkManager к устройству, когда оно появляется

У меня есть несколько серверов, работающих в 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.

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

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