Как отключить системное разрешение и разрешить DNS с помощью dnsmasq?
Ubuntu 16.10+ использует systemd-resolved
как преобразователь DNS.
Я предпочитаю использовать настройки 16.04, dnsmasq
как решатель.
Как я могу это сделать на 16.10+, особенно на 17.04?
4 ответа
dnsmasq
пакеты по-прежнему доступны в 16.10 и 17.04.
устанавливать
dnsmasq
и зависимости (или, по крайней мере, скачать их пакеты) перед отключениемsystemd-resolved
:sudo apt-get install dnsmasq
запрещать
systemd-resolved
и проверитьdnsmasq
бежит:sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved systemctl status dnsmasq
Время года
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 предоставляет службы разрешения имен через три различных интерфейса:
- "Полнофункциональный API-интерфейс с разрешением systemd"
- "локальный прослушиватель заглушки DNS на IP-адресе 127.0.0.53 на локальном интерфейсе обратной связи"
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, а также не уверен, что я понял из этих руководств. Просьба указать, что я что-то не так понял. Спасибо:))