
Было хорошо известно, что 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 "просто работал", но создание инструментов, защищенных от идиотов, означает, что ими смогут пользоваться только идиоты.