Использование dnsmasq с NetworkManager

Использование dnsmasq с NetworkManager

Было хорошо известно, что NetworkManager плохо работает с dnsmasq(см.здесь). Я просмотрел длинныйобсуждение здесьно все еще не уверен, как лучше всего справиться с этой ситуацией.

Все, что я хочу сделать, это dnsmasqиспользоватьпредоставить DNS и DHCP для моей локальной сети. Какой способ будет рекомендован в этом случае?

Кажется, проблема осталась даже в Ubuntu 14.04, дажеошибкаутверждается, что это исправлено.

В качестве обходных путей люди отключают NM-enslaved dnsmasq-baseпо следующим причинам:

NM-enslaved dnsmasqиспользует жестко запрограммированные параметры (на языке C), которые обеспечивают крайне ограниченную функциональность.

  • Он не прослушивает ethX ( --listen-address=127.0.0.1). Поэтому мы не можем использовать наши серверы в качестве DNS-серверов для наших локальных сетевых ПК, т. е. он совершенно бесполезен для локальных сетей.
  • Он не кэширует запросы ( --cache-size=0). Никакого кэширования ==> нет ускорения DNS-запросов. Это опять же очень важно для локальных сетей, поскольку есть много одновременных пользователей.
  • Наконец, нам также нужны функции DHCP и TFTP dnsmasq, поэтому даже если NM+dnsmasq включает в себя настоящий DNS-сервер, нам придется запустить еще один dnsmasq

Но я не уверен, что они все еще актуальны и/или как исправление решило проблему(ы). Кроме того, никто из них не очень ясно выразил, что именно они сделали и как они сделали, чтобы решить свою проблему. То есть, часть решения отсутствует впродолжительное обсуждение. Может ли кто-нибудь заполнить пробелы, пожалуйста? То есть,

Поставляемый dnsmasqиз коробки Ubuntu не работает на стороне сервера по указанным выше причинам. А также на стороне клиента«dnsmasq, установленный на этих ноутбуках с Ubuntu, не может выполнить запрос DNS по локальной сети с моего DNS-сервера», потому что«NetworkManager (ноутбуков Ubuntu) приводит к тому, что у них появляется странная настройка сервера имен 127.0.1.1»(ссылка:DNS-решение для локальной сети или локальной домашней сети)

Как заставить dnsmasq работать без сбоев с NetworkManager, чтобы обеспечить работу DNS и DHCP (и TFTP) в моей локальной сети как на стороне сервера, так и на стороне клиента?

TL'dr

для тех, кто ищет ответ. Из всех ответов ниже я нашел самое простое решение @brad's, длясерверная сторона(все еще нет хорошего ответа для клиентской стороны):

Единственное решение проблемы — отключить NM-диск dnsmasq..., установить «стандартный» dnsmasq и затем настроить его через стандартный /etc/dnsmasq.confфайл конфигурации.

решение1

У меня тоже твои проблемы.

В принципе, послеwiki.archlinux, похоже, что для включения кэширования достаточно создать файл, /etc/NetworkManager/dnsmasq.d/cacheсодержащий просто

$ cat /etc/NetworkManager/dnsmasq.d/cache 
cache-size=1000

Я попробовал это, но после перезапуска NM у меня все еще нет кэша:

# ps ax | grep dns
11724 ?        S      0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

Обратите внимание, что указанный conf-файл всегда пуст: мне не удалось настроить ни одну опцию с помощью этой процедуры.

В целом, похоже, что DNS-маска, подчинённая NM в версии 14.04 (которая предоставляется пакетом dnsmasq-base), полностью заблокирована, поэтому невозможно включить кэширование или что-либо ещё (dhcp, tftp).

Если это так, то я думаю, что, как вы говорите, единственным решением проблемы является отключение NM-диска dnsmasq путем закомментирования строки

dns=dnsmasq

в файле /etc/NetworkManager/NetworkManager.confи установите «стандартный» dnsmasq, а затем настройте его через стандартный /etc/dnsmasq.confфайл конфигурации.

решение2

Можно переопределить настройки, поместив их в /etc/NetworkManager/dnsmasq.d/*.conf. Настройки файла конфигурации имеют приоритет над флагами командной строки. Они применяются, когда NetworkManager запускает dnsmasq. Запустите, sudo service network-manager restartчтобы повторно применить. (Если есть сомнения: ответ Брэда пропустил тот факт, что ps ax | grep dnsпоказывает --conf-dirаргумент)

Например:

echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

Насколько я помню, NetworkManager отключает кэширование dnsmasq по умолчанию из-за опасений отравления кэша. Для машины, где все пользователи являются доверенными, это может не быть проблемой.

NetworkManager не интегрируется с resolvconf, и сервер NM 127.0.1.1не будет использоваться локально, если установлен пакет resolvconf. resolvconf является частью установок ubuntu-minimal и standard Debian; NetworkManager повторно реализует эту функциональность более интегрированным, менее основанным на скриптах способом.

NetworkManager не мешает глобальному экземпляру dnsmasq (привязка к вторичному IP-адресу обратной связи и настройка bind-interfacesчерез /etc/dnsmasq.d/network-manager). Если вы устанавливаете глобальный экземпляр dnsmasq и сохраняете экземпляр NM, дважды проверьте, /etc/resolv.confкакой из них хост будет использовать по умолчанию.

Хотя вы можете настроить экземпляр dnsmasq NetworkManager, как показано выше, если вам нужен DNS-сервер, который привязывается к публичным интерфейсам, вам следует установить пакет dnsmasq(NetworkManager использует только dnsmasq-base, который не настраивает глобальный экземпляр) и поместить свою конфигурацию в /etc/dnsmasq.d/*.conf. Подчиненный экземпляр NetworkManager предназначен только для привязки к интерфейсу обратной связи, и его настройка за пределами этой области может привести к его поломке.


Подводя итог, для тех, кому нужно только локальное кэширование DNS:

sudo apt-get remove dnsmasq resolvconf dhcpcd5 rdnssd
echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

Для простой локальной сети общего доступа NetworkManager должно быть достаточно. Но для специально настроенной локальной сети с TFTP и т. д.:

sudo apt-get install resolvconf dnsmasq
echo 192.168.0.50,192.168.0.150,12h |sudo tee -a /etc/dnsmasq.d/lan.conf
echo enable-tftp |sudo tee -a /etc/dnsmasq.d/lan.conf
sudo service dnsmasq restart

решение3

В дополнение к предыдущим ответам на этот пост я хотел бы добавить, что dnsmasq-baseэкземпляр Network-manager также будет следовать addn-hostsдирективе (размещенной в файле конфигурации, созданном ниже /etc/NetworkManager/dnsmasq-shared.d/), заставляя dnmasq-base читать локальный /etc/hostsфайл, несмотря на то, что dnsmasq вызывается с --no-hostsопцией Network-Manager

Таким образом, мне удалось успешно настроить локальный DNS-сервер на моем ноутбуке Mint 20.1. Не нужно возиться с IP-адресами (правильная настройка /etc/hostsпри условии...)

Ниже представлен рабочий пример...

 # /etc/NetworkManager/dnsmasq-shared.d/local-DNS.conf
 domain=local.wifi              // specify the (local) DNS-domain
 addn-hosts=/etc/hosts          // force dnmasq to read /etc/hosts despite --no-host
 bogus-priv                     // do not forward private reverse lookups to upstream server (not needed if there is none...)
 dhcp-option=6,[IP-OF-WIFI_IF]  // tell client to use [IP-OF-WIFI_IF] as DNS-Server

решение4

Я хотел назначить определенный MAC-адрес определенному IP-адресу и в целях стабильности по возможности придерживаться Network Manager/dnsmasq по умолчанию.

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.cесть комментарий об использовании --conf-file для игнорирования конфигураций, но далее в файле мы имеем

/* dnsmasq exits if the conf dir is not present */
    if (g_file_test (CONFDIR, G_FILE_TEST_IS_DIR))
        nm_cmd_line_add_string (cmd, "--conf-dir=" CONFDIR);

В Ubuntu 16.04 LTS после настройки точки доступа Wi-Fi и предоставления общего доступа к другому подключению ps auxgww | grep dnsmasqпоследний аргумент командной строки каждого из процессов dnsmasq выглядит следующим образом:

--conf-dir=/etc/NetworkManager/dnsmasq-shared.d

Таким образом, в этом каталоге можно создать файлы конфигурации, которые будут использоваться совместно всеми вызовами dnsmasq, запускаемыми Network Manager.

Я создал /etc/NetworkManager/dnsmasq-shared.d/Hue

dhcp-host=0c:4d:e9:a0:ce:cf,192.168.1.221

и перезагрузился, хотя работает

sudo service network-manager restart

сработало бы.

В результате мое устройство получило соответствующий IP-адрес.

Да, это неправильно, потому что это означает, что все вызовы dnsmasq от NetworkManager получат это объявление, но в этом случае это безвредно, потому что имеет значение только то, отображается ли MAC в рассматриваемой сети. Если сеть не 192.168.1, то будут проблемы.

Это более надежно, чем замена /usr/sbin/dnsmasq скриптом, как предлагается вhttps://gist.github.com/magnetikonline/6236150

Правильным решением было бы изменить способ вызова dnsmasq для правильного использования файлов конфигурации dnsmasq. Я понимаю желание, чтобы Network Manager "просто работал", но создание инструментов, защищенных от идиотов, означает, что ими смогут пользоваться только идиоты.

Связанный контент