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

15

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

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

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

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

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

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

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

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

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

TL'dr

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

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

XPT
источник
2
Только для Google (как и я): в новых версиях Ubuntu ядро ​​dnsmasq внутри NetworkManager несколько более дружелюбно. Смотрите здесь: askubuntu.com/questions/233195/…
A.

Ответы:

3

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

В принципе, после 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 всегда пуст: мне не удалось настроить ни одну опцию, используя эту процедуру.

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

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

dns=dnsmasq

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

штифтик
источник
Добро пожаловать в суперпользовательский брэд! Спасибо за вашу помощь!
xpt
1
На самом деле это включает кеш, так как он работает с --conf-dir=/etc/NetworkManager/dnsmasq.d, используется cache-sizeуказанный в созданном вами файле. Вы можете увидеть разницу с помощьюdig
sirfz
6

Можно переопределить настройки, введя их в /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 at 127.0.1.1не будет использоваться локально, если установлен пакет resolvconf. resolvconf - это часть Ubuntu-минимальной и стандартной установки 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
Tobu
источник
Благодарю. Хотя вам следует более подробно описать, что делают ваши команды «in summary», то есть инструкции также удаляют 4 пакета, если они у вас есть в данный момент. Дополнительные ссылки и обсуждение на reddit.com/r/Ubuntu/comments/2j0va4/…
nealmcb
Совершенно согласна с @nealmcb, Tobu, объясните, пожалуйста , почему «для тех , кто хочет просто локальное кэширование DNS» , им нужно удалить в dnsmasqпакет. тогда для чего следующая echoкоманда? так как dnsmasqне будет.
XPT
@xpt Тобу предлагает удалить dnsmasq, но вы все равно должны были dnsmasq-baseустановить из-за NM.
Талис Калфигкопулос
0

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

Кристофер Брукс
источник
спасибо за ответ Кристофер, однако, я действительно не в состоянии следовать ... "Я хотел назначить определенный MAC для определенного IP-адреса и в целях стабильности" ... "ps auxgww | grep dnsmasq показывает, что последний аргумент командной строки каждого из процессов dnsmasq " ... " Я создал ... работал бы " ... " Да, это неправильно " ... Т.е. я действительно не могу следовать твоему ходу мыслей , чтобы понять, что вы пытаетесь сказать здесь.
XPT
0

Мое решение может сломать Network Manager, и в нем все просто. Из-за неправильного способа работы NM с dnsmasq я просто переопределил его своим методом ниже.

Обойти эту проблему можно было следующим образом:

sudo apt install dnsmasq
cp /etc/dnsmasq.conf ~/

Отредактируйте ~/dnsmasq.confфайл в вашем пользовательском каталоге так, как вы хотите, и сохраните его.

sudo rm -v /etc/dnsmasq.conf
sudo cp -v ~/dnsmasq.conf /etc/
sudo chattr +i /etc/dnsmasq.conf
sudo systemctl restart dnsmasq.service

Я сделал простой псевдоним bash и поместил его внизу моего файла ~ / .bash_aliases, чтобы было легко редактировать файл dnsmasq.conf. Вот псевдоним:

alias="sudo chattr -i /etc/dnsmasq.conf && sudo nano -w /etc/dnsmasq.conf && sudo chattr +i /etc/dnsmasq.conf && sudo systemctl restart dnsmasq.service"

Конечно, вы можете выбрать любой редактор по своему вкусу для второй команды sudo в псевдониме, но я использовал там nano для простоты для всех. Сохраните файл, закройте и снова откройте вкладку / окно вашего командного терминала. Это должно позволить псевдониму быть доступным для недавно открытых вкладок / окон терминала.

Просто запустите eddmcиз своей учетной записи пользователя, и он попросит ваш пароль для выполнения повышенных команд.

Обратите внимание, что я всегда chattr +iфайл. Это делается для того, чтобы Network Manager не перезаписывал ваш конфиг своим собственным.

На проводных соединениях Ethernet не должно быть никаких проблем. С тех пор, как я использую dnsmasq для кэширования dns на ноутбуках с беспроводной связью, мне нужно вручную перезапустить dnsmasq.service после подключения к точке доступа. Я думаю, что Network Manager может выполнять такие задачи, как перезапуск служб при подключении, но я еще не рассматривал это.

jpyper
источник
0

Несмотря на заявления здесь и в других местах, NetworkManager полностью игнорирует все файлы конфигурации dmsmasq - даже те, которые находятся в его собственном каталоге /etc/NetworkManager/dnsmasq-shared.d. Доказательство в исходном коде для NetworkManager ... Вот соответствующий комментарий:

/ * dnsmasq может читать из своего расположения файла конфигурации по умолчанию, который, если это расположение является допустимым файлом конфигурации, будет объединяться с указанными здесь параметрами и вызывать нежелательные побочные эффекты. Как отправка поддельных IP-адресов в качестве шлюза или что-то еще. Так что скажите dnsmasq вообще не использовать какой-либо конфигурационный файл. * /

Вот ссылка на соответствующий исходный код (строки 139-144).

bsalnick
источник
2
Ссылка, указывающая на исходный код, чтобы читатели могли проверить это и прочитать соответствующий код, была бы полезной, если это возможно.
Jamesc
1
Так что да, нельзя указывать явный конфигурационный файл. --conf-файл жестко запрограммирован в / dev / null. Однако, если вы посмотрите на полную командную строку, использованную для запуска dnsmasq через NetworkManager, вы увидите, что используется conf-dir: '/ usr / sbin / dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file = / var / run / NetworkManager / dnsmasq.pid --listen-address = 127.0.0.1 --cache-size = 400 - clear-on-reload --conf-file = / dev / null --proxy-dnssec --enable-dbus = org.freedesktop.NetworkManager.dnsmasq --conf-dir = / etc / NetworkManager / dnsmasq.d ', что означает чтение всех файлов в данном каталоге.
Харди