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

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

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

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

4 ответа

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.

В дополнение к ответу @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

Для (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

Согласно руководству 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, а также не уверен, что я понял из этих руководств. Просьба указать, что я что-то не так понял. Спасибо:))

Другие вопросы по тегам