Как отключить системное разрешение и разрешить DNS с помощью dnsmasq?

32

Ubuntu 16.10+ использует в systemd-resolvedкачестве преобразователя DNS.

Я предпочитаю использовать установку 16.04, dnsmasqв качестве решателя.

Как я могу это сделать на 16.10+, особенно на 17.04?

Артём
источник
Может быть, это может помочь: askubuntu.com/questions/1032450/…
cmak.fr

Ответы:

35

dnsmasq пакеты по-прежнему доступны в 16.10 и 17.04.

  1. Установите dnsmasqи установите зависимости (или хотя бы загрузите их пакеты) перед отключениемsystemd-resolved :

    sudo apt-get install dnsmasq
    
  2. Отключить systemd-resolvedи убедиться, dnsmasqчто работает:

    sudo systemctl stop systemd-resolved
    sudo systemctl disable systemd-resolved
    
    systemctl status dnsmasq
    
  3. Сезон dnsmasqпо вкусу. После применения настроек перезапустите dnsmasq:

    sudo systemctl stop dnsmasq
    sudo systemctl start dnsmasq
    

После шага 2 у вас может не быть рабочего распознавателя системы, пока шаг 3 не будет завершен. Вам может потребоваться перезапустить сетевую подсистему (или просто перезагрузиться), чтобы начать dnsmasqработу с настройками по умолчанию. В моем тестировании было достаточно добавить известный DNS-сервер /etc/dnsmasq.confи перезапустить dnsmasqего, чтобы он работал в среде liveCD.

донкихотский
источник
Отличный ответ и, похоже, единственное решение при отключении NetworkManager не приемлемо!
Бог
3
Для меня это был отличный ответ, но он также потребовал дополнительных шагов из ответа @ blabla, добавив dns=dnsmasqконфигурацию/etc/NetworkManager/NetworkManager.conf
Roberto Tyley
Тоже самое. После борьбы с системным разрешением и несвязанным переключением на dnsmasq добился цели в Ubuntu 17.10. Я должен был использовать дополнения Blabla все же.
Альберто Л. Бонфильо
17

В дополнение к ответу @quixotic:

Убедитесь, что у вас есть в /etc/NetworkManager/NetworkManager.conf:

[main]
dns=dnsmasq

если вам нужно добавить его, перезапустите NetworkManager следующим образом:

sudo systemctl restart NetworkManager

и /etc/resolv.confдолжна быть символическая ссылка на /var/run/NetworkManager/resolv.conf. можно сделать так

sudo rm /etc/resolv.conf; sudo ln -s /var/run/NetworkManager/resolv.conf /etc/resolv.conf
блабла
источник
На самом деле я установил его как dns=defaultи он работает нормально, потому что у меня есть серверы имен, определенные NetworkManager вместо того, чтобы быть определенными в dnsmasq; это работает для меня - NM получает серверы имен из настроек, сделанных в конфигурации NM KDE через системный трей. Я использую фиксированный IP в моей домашней сети FWIW.
pbhj
1
Этот шаг был необходимым дополнением к ответу @ quixotic для меня (Ubuntu 17.04, полная установка, а не LiveCD).
Роберто Тайли
0

Согласно руководству systemd-resolved , systemd-resolved предоставляет услуги разрешения имен через три различных интерфейса:

  1. «Полнофункциональный API-интерфейс с разрешением systemd»
  2. «локальный прослушиватель заглушки DNS на IP-адресе 127.0.0.53 на локальном интерфейсе обратной связи»
  3. API glibc getaddrinfo (3), как определено в RFC3493 и связанных с ним функциях распознавателя, включая gethostbyname (3). Этот API широко поддерживается, в том числе и за пределами платформы Linux. Однако в его текущей форме он не предоставляет информацию о состоянии проверки DNSSEC и является только синхронным. Этот API поддерживается коммутатором службы имен glibc (nss (5)). Использование модуля NSS glibc nss-resol (8) необходимо для того, чтобы функции распознавателя NSS glibc могли разрешать имена хостов через systemd-resolved.

Похоже, что первые два интерфейса не будут мешать нормальному разрешению DNS, и для меня проблема, скорее всего, будет в третьем.

В руководстве nss-resol :

Чтобы активировать модуль NSS, добавьте «resol» в строку, начинающуюся с «hosts:» в /etc/nsswitch.conf. В частности, рекомендуется помещать «resol» в начале строки «hosts:» /etc/nsswitch.conf (но после записей «files» или «mymachines»), прямо перед записью «dns», если она существует, после чего следует «[! UNAVAIL = return]», чтобы гарантировать, что DNS-запросы всегда направляются через systemd-resolved (8), если он работает, но направляются в nss-dns, если эта служба недоступна

Поэтому необходимо, чтобы параметр «dns» предшествовал «resol» в строке «host:» файла /etc/nsswitch.conf . И тогда getaddrinfoследует просто придерживаться /etc/resolv.conf .

Это решение предотвращает только обработку systemd-resolved всех запросов разрешения DNS и не ограничивается определенным сетевым менеджером. И это также гарантирует, что службы LLMNR и mDNS работают нормально.

(Я не совсем знаком с тем, как работает разрешение имен в Linux, а также не уверен в том, что я понял из этих руководств. Просьба указать, что я что-то не так понял. Спасибо :))

Dummmy
источник
0

Для (X) Ubuntu 18.04 (см. Мой ответ на stackexchange ).

Вот копия этого (я должен сделать копию?)

Вот решение для (X) Ubuntu 18.04 Bionic.

Установить dnsmasq

sudo apt install dnsmasq

Отключите обработчик с разрешением systemd на порту 53 (не трогайте /etc/systemd/resolved.conf, поскольку он может быть перезаписан при обновлении):

$ cat /etc/systemd/resolved.conf.d/noresolved.conf 
[Resolve]
DNSStubListener=no

и перезапустите

$ sudo systemctl restart systemd-resolved

(в качестве альтернативы отключите его полностью с помощью $ sudo systemctl disable systemd-resolved.service)

Удалите /etc/resolv.conf и создайте заново. Это важно, потому что resolv.conf является символической ссылкой на /run/systemd/resolve/stub-resolv.conf по умолчанию. Если вы не удалите символическую ссылку, файл будет перезаписан systemd при перезагрузке (даже если мы отключили systemd-resolved!). Также NetworkManager (NM) проверяет, является ли это символической ссылкой для обнаружения конфигурации, разрешенной системой.

$ sudo rm /etc/resolv.conf
$ sudo touch /etc/resolv.conf

Отключите перезапись /etc/resolv.conf в NM (есть также опция rc-manager, но она не работает, несмотря на то, что она описана в руководстве):

$ cat /etc/NetworkManager/conf.d/disableresolv.conf 
[main]
dns=none

и перезапустите его:

$ sudo systemctl restart NetworkManager

Скажите dnsmasq использовать resolv.conf из NM:

$ cat /etc/dnsmasq.d/nmresolv.conf 
resolv-file=/var/run/NetworkManager/resolv.conf

и перезапустите его:

$ sudo systemctl restart dnsmasq

Используйте dnsmasq для разрешения:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1
Sena
источник