Как избежать конфликтов между dnsmasq и systemd-resolved?

57

Я недавно установил dnsmasq для работы в качестве DNS-сервера для моей локальной сети. dnsmasq прослушивает порт 53, который уже используется локальным прослушивателем заглушки DNS из systemd-resolved .

Чтобы решить эту проблему, просто остановите systemd-resolved и затем перезапустите его после запуска dnsmasq. Но он возвращается после перезагрузки: systemd-resolved запускается с предпочтением, и dnsmasq не запускается, потому что порт 53 уже используется.

Первый очевидный вопрос, как мне кажется, заключается в том, как мне лучше понять, что systemd-resolved понимает, что он не должен запускать локальный прослушиватель заглушки DNS и, таким образом, оставить порт 53 для использования dnsmasq?

Однако более интересным вопросом является то, как эти две службы обычно предназначены для совместной работы. Они даже предназначены для работы бок о бок или системно разрешаются так, как если бы кто-то использовал dnsmasq?

Vic
источник
4
Вы пробовали просто отключить через sudo systemctl disable systemd-resolved? Я думаю, что если dnsmasq правильно настроен, он должен обрабатывать разрешение домена.
pbhj
1
Вы также должны выдать, sudo systemctl stop systemd-resolvedесли он работает. Используйте sudo systemctl status systemd-resolvedдля проверки
Брюс Барнетт

Ответы:

42

Начиная с systemd 232 (выпущен в 2017 году) вы можете редактировать /etc/systemd/resolved.confи добавлять эту строку:

DNSStubListener=no

Это отключит привязку к порту 53.

Эта опция более подробно описана в справочной странице resolved.conf .

Вы можете найти версию systemd, с которой работает ваша система:

systemctl --version
Malvineous
источник
2
Делая этот поворот интернет-соединения
Равиндер
2
@Ravinder: Да, отключит DNS-сервер systemd. Если ваша система настроена на использование этого сервера, то будет выглядеть, как будто интернет-соединение перестает работать (потому что вы его отключили). Вам нужно будет настроить свою систему на использование другого DNS-сервера. Обычно люди отключают привязку на порту 53, потому что вместо этого они хотят запустить собственный DNS-сервер, поэтому это не проблема.
Malvineous
18

Вы можете отключить systemd-resolvedзагрузку при загрузке с помощью sudo systemctl disable systemd-resolved.

Если вы хотите запустить их вместе, вы можете перенаправить их, systemd-resolvedчтобы использовать localhost в качестве основного сервера имен. Это позволит убедиться, что все запросы направляются в dnsmasq для разрешения, прежде чем попасть на внешний DNS-сервер. Это можно сделать, добавив строку nameserver 127.0.0.1в верхней части вашего /etc/resolv.confфайла. Это также отключит локальное кэширование systemd.

Вы можете прочитать больше на Arch Linux вики . Я скопировал это оттуда, и это покрывает это довольно хорошо.

Однако это не позволяет избежать ошибки во время загрузки, т. Е. Dnsmasq все равно не будет работать, если произойдет запуск systemd-resolved. Если ваша версия systemdдостаточно новая, используйте ответ Malvineous . Если ваша версия systemdслишком старая, вы можете обойти эту проблему, изменив модуль dnsmasq: в [Unit]разделе добавить Before=systemd-resolved.

После этого, если вы хотите, вы можете создать отдельный /etc/dnsmasq-resolv.confфайл для восходящего потока сервера имен и передать его с помощью -rили --resolv-fileопцию, или добавить вверх по течению сервера имен в файле конфигурации Dnsmasq и использовать -Rили --no-resolvвариант. Таким образом, у вас есть только локальный хост, /etc/resolv.confи все проходит через dnsmasq.

Мунир
источник
2
Мне пришлось удалить свой предыдущий комментарий, так как я больше не могу подтвердить, что это решило проблему. Я прочитал вики перед тем, как спросить здесь, и у меня уже был файл resolv.conf с сервером имен localhost вверху. Это не помогло. Затем я следовал вашим инструкциям, чтобы переместить внешние серверы имен во второй файл для dnsmasq. После первой перезагрузки сначала загружается dnsmasq, поэтому проблема не возникает. При второй перезагрузке разрешается загружен первым, поэтому dnsmasq завершается с описанной ошибкой. Я так же далеко, как и раньше.
Vic
6
В блоке dnsmasq вставьте Before=systemd-resolvedв [Unit]раздел. Таким образом, dnsmasq всегда запускается первым.
Мунир
7

Судя по страницам руководства systemd, он не предназначен для того, чтобы вручную отключать заглушку DNS-сервера. Интересно, что я заметил только описанную проблему после обновления systemd с 230 до 231.

Отключение systemd-resolved не было для меня опцией, потому что мне нужно было обрабатывать полученные исходящие DNS-серверы через DHCP.

Моим решением было сделать dnsmasq stop systemd-resolved перед запуском и запустить его потом снова.

Я создал дроп-ин конфигурацию в /etc/systemd/system/dnsmasq.service.d/resolved-fix.conf:

[Unit]
After=systemd-resolved.service

[Service]
ExecStartPre=/usr/bin/systemctl stop systemd-resolved.service
ExecStartPost=/usr/bin/systemctl start systemd-resolved.service

Это выглядит довольно хакерским решением, но оно работает.

Freaker
источник
2
Эй, на самом деле это решение довольно гладко. Он постоянен даже после обновления пакета, поскольку сохраняет исходный файл модуля. Красиво сделано. В DNSStubListenerруководстве resolved.conf указано следующее : «Обратите внимание, что прослушиватель заглушки DNS неявно отключается, когда его адрес прослушивания и порт уже используются». Вот почему этот метод работает отлично, я думаю.
Джонатан Комар
А ++ решение !!!
sjas
Мне пришлось изменить / usr / bin / systemctl на / bin / systemctl
Брюс Барнетт
5

Я просто включил опцию "bind-interfaces", удалив '#' в начале строки в /etc/dnsmasq.conf.

Я смог запустить dnsmasq снова:

  • dnsmasq связывает порт DNS на всех интерфейсах (включая 127.0.0.1) порт 53,
  • systemd-resolv продолжает слушать 127.0.0. 53 : 53

Я решил, что это решение разрешено этим обсуждением : добавьте параметр, чтобы отключить преобразователь заглушки.

тамтам
источник
Это лучший ответ для того, что является пожаром мусорного контейнера. Нет причин, по которым systemd должен занимать этот порт, даже в режиме loopback.
Джонатан С. Фишер
2

Если вы используете настройку Ubuntu 18.04 по умолчанию, это может быть вызвано конфликтом между systemd-resolved(DNS-сервером по умолчанию) и dnsmasq. Если вы установили dnsmasqсебя намеренно, потому что явно этого хотели, то один из других ответов на этот вопрос, объясняющий, как отключить systemd-resolved, вероятно, будет полезен для вас. Если вы не установили явным образом dnsmasq, скорее всего, он установлен, потому что вы используете lxd. Это может быть потому, что вы на самом деле используете lxdдля управления контейнерами, но это, скорее всего, потому, что оснастки используют lxdдля защиты вас, когда приложения установлены. С моей точки зрения, я хочу сохранить dnsmasq(потому что lxdхочет этого), но я также хочу сохранитьsystemd-resolved в качестве DNS-сервера (потому что это то, что выбрала команда Ubuntu, и я доверяю им больше, чем себе).

Таким образом, это, кажется, lxdпроблема в глубине души. Если так, то, как я это исправил, согласно сообщению в списке рассылки lxd-users , это:

$ lxc network edit lxdbr0

Это отредактирует вашу конфигурацию в редакторе терминала. Это будет выглядеть примерно так:

config:
  ipv4.address: 10.216.134.1/24
  ipv4.nat: "true"
  ipv6.address: none
  ipv6.nat: "true"
name: lxdbr0
type: bridge

Добавьте к нему три строки:

config:
  ipv4.address: 10.216.134.1/24
  ipv4.nat: "true"
  ipv6.address: none
  ipv6.nat: "true"
  raw.dnsmasq: |
    auth-zone=lxd
    dns-loop-detect
name: lxdbr0
type: bridge

и это должно привести к тому dnsmasq, что запускаемая система lxdобнаруживает петли DNS. Это, по крайней мере для меня, решило проблему и остановилось systemd-resolvedи dnsmasqиспользовало 100% CPU.

силь
источник
2

Вот решение для (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, но она не работает, несмотря на то, что она описана в руководстве по NM):

$ 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
источник
1
После того, как вы попробовали несколько других решений, именно ваше решение решило мою проблему в Linux Mint 19.1. Большое спасибо!
Ренан Лазаротто
1

Я решил это так:

Добавьте или раскомментируйте следующую строку в / etc / default / dnsmasq :

IGNORE_RESOLVCONF=yes

Создайте свой собственный файл resolv (/etc/resolv.personal) для определения серверов имен. Вы можете использовать любой сервер имен здесь. Я взял два с https://www.opennic.org

nameserver 5.132.191.104
nameserver 103.236.162.119

В /etc/dnsmasq.conf добавьте или раскомментируйте следующую строку:

resolv-file=/etc/resolv.personal

Затем перезапустите dnsmasq и отключите распознаватель по умолчанию: systemd-resolved.

sudo service dnsmasq restart

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
Дэниел Пернольд
источник
1

Я не уверен, почему обе службы пытаются использовать один и тот же адрес. Может быть, вы можете организовать их, как в моем случае на Xubuntu 18.04.1, где их конфигурация следующая:

xy@zq:~$ sudo netstat -tulpn | grep 53
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      13549/systemd-resol 
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      9632/dnsmasq 

Чтобы разрешить systemd, используя мой dnsmasq, я просто установил:

#/etc/systemd/resolved.conf 
[Resolve]
DNS=127.0.0.1

В моем конфиге dnsmasq я установил внешние серверы имен:

#/etc/dnsmasq.conf
nameserver x.x.x.x
nameserver y.y.y.y

После перезапуска всего:

# sudo systemctl restart systemd-resolved.service
# sudo systemctl restart dnsmasq.service

systemd-resolved установит для DNS-сервера по умолчанию значение dnsmasq в:

#/etc/resolv.conf
nameserver 127.0.0.1
JonnyTischbein
источник
Эта последняя строка удивила меня, поэтому я посмотрел на нее. Похоже, в вашем случае, /etc/resolv.confэто символическая ссылка на /run/systemd/resolve/resolv.conf. По-видимому, это один из четырех (!) Возможных различных режимов , в которых может работать systemd-resolved. Я полагаю, это зависит от того, как настроен ваш дистрибутив, т.е. это верно для вашего Xubuntu 18.04.1, но может отличаться от других системы.
Sourcejedi
0

Мне не удалось заставить dnsmasq начать использовать решения, найденные в Интернете, то есть отключить systemd-resolved, изменить dnsmasq.conf на «динамическое связывание» вместо «связывание интерфейсов». Я смог запустить его при загрузке, запустив dnsmasq start После network-online.service, а не network.service:

[Unit]
Description=dnsmasq - A lightweight DHCP and caching DNS server
Requires=network.target
Wants=nss-lookup.target
Before=nss-lookup.target
After=network-online.target #This line changed
omegahelix
источник
Спасибо за публикацию подхода, который вы используете. Обратите внимание, что обычно, когда вы заказываете против network-online.target, вы также должны добавить network-online.target в список Wants=. freedesktop.org/wiki/Software/systemd/NetworkTarget
sourcejedi
0

Вот что сработало для меня (после нескольких часов боли) в Ubuntu 18.10 Cosmic Cuttlefish. Я сделал это, чтобы воспользоваться dnsmasqсравнительно более надежным механизмом кэширования и избежать уязвимостей в NGINX . Обратите внимание, что я использую версию Ubuntu Server (no NetworkManager/ nmcli, просто systemd-networkd), и она работает на AWS EC2, поэтому мне также нужно было поддерживать работу DNS и DHCP с доменом поиска EC2 по умолчанию. Я не хотел systemd-resolvedполностью отключать, потому что понятия не имею, как это может повлиять на будущие обновления. Все здесь запускается как root / sudo, если не указано иное (это происходит по умолчанию при передаче в качестве пользовательских данных EC2).

## Configure dnsmasq to work with systemd-resolved
# Set static hostname with hostnamectl
hostnamectl set-hostname mydomainname
# Add an entry for the hostname to /etc/hosts
tee --append /etc/hosts <<EOF
127.0.0.1 mydomainname
EOF
# Disable stub listener for resolvconf and set DNS to loopback
tee --append /etc/systemd/resolved.conf <<EOF
DNSStubListener=no
DNS=127.0.0.1
EOF
# Tell dnsmasq to ignore resolvconf
tee --append /etc/default/dnsmasq <<EOF
IGNORE_RESOLVCONF=yes
EOF
# Create dropin directory
mkdir -p /etc/systemd/system/dnsmasq.service.d
# Create systemd dropin to make sure systemd-resolved stops before dnsmasq starts
tee /etc/systemd/system/dnsmasq.service.d/resolved-fix.conf <<EOF
[Unit]
After=systemd-resolved.service
[Service]
ExecStartPre=bin/systemctl stop systemd-resolved.service
ExecStartPost=bin/systemctl start systemd-resolved.service
EOF
# Create custom resolvconf with name servers (I usec cloudflare)
tee /etc/resolv.mydomainname <<EOF
nameserver 1.1.1.1
nameserver 1.0.0.1 
nameserver [2606:4700:4700::1111] 
nameserver [2606:4700:4700::1001] 
EOF
# Configure dnsmasq
tee /etc/dnsmasq.d/mydomainname.conf <<EOF
# Region comes from:
# EC2_AVAIL_ZONE=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
# EC2_REGION=${EC2_AVAIL_ZONE%?}
domain=$EC2_REGION.compute.internal
resolv-file=/etc/resolv.mydomainname
listen-address=127.0.0.1
port=53
interface=lo
bind-dynamic
domain-needed
bogus-priv
dnssec
dns-forward-max=300
cache-size=1000
neg-ttl=3600
EOF
# Reload to pick up dropin
systemctl daemon-reload
# Stop systemd-resolved
systemctl stop systemd-resolved
# Start dnsmasq
systemctl restart dnsmasq

Убедитесь, 127.0.0.1#53что используется для разрешения, а DNSSEC работает с чем-то вродеdig +trace facebook.com

Джастин гаррик
источник
Знаете ли вы, почему вам все еще нужен этот взломанный файл, когда вы его установили DNSStubListener=no?
Sourcejedi