Як уникнути конфліктів між dnsmasq та systemd-разрешеними?


57

Нещодавно я встановив dnsmasq для виконання функції DNS-сервера для моєї локальної мережі. dnsmasq прослуховує порт 53, який вже використовується локальним слухачем DNS-скриптів із системного рішення .

Просто зупинення системного рішення та його перезапуск після запуску dnsmasq вирішує цю проблему. Але він повертається після перезавантаження: системне вирішення запускається з уподобанням, і dnsmasq не запуститься, оскільки порт 53 вже використовується.

Перший очевидний запитання, я думаю, полягає в тому, як я найкраще даю зрозуміти, що система вирішує, що він не повинен запускати локальний слухач заглушки DNS і таким чином зберігати порт 53 для використання dnsmasq?

Однак більш цікавим питанням є те, як обидві служби взагалі мають намір працювати разом. Чи вони призначені для того, щоб вони працювали пліч-о-пліч, або це вирішено системою просто так, якщо використовується dnsmasq?


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.

Цей параметр більш докладно описаний на сторінці дозволеної адреси.conf .

Ви можете знайти системну версію, з якою працює ваша система:

systemctl --version

2
Робимо цей поворот у зв’язку з Інтернетом
Равіндер

2
@Ravinder: це відключить системний DNS-сервер, так. Якщо ваша система налаштована на використання цього сервера, це буде виглядати так, що підключення до Інтернету перестає працювати (тому що ви вимкнули його). Вам потрібно буде налаштувати вашу систему замість іншого сервера 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файлу. Це також вимкне локальне кешування системи.

Більше можна прочитати на вікі Arch Arch . Я скопіював це звідти і це досить добре висвітлює.

Однак це не дозволяє надійно уникнути помилки під час завантаження, тобто dnsmasq все одно вийде з ладу, якщо трапиться вирішення системи, яке почнеться спочатку. Якщо ваша версія systemdновинки досить нова, скористайтеся відповіддю Malvineous . Якщо ваша версія версії systemdзанадто стара, ви можете подолати цю проблему, змінивши блок dnsmasq: у [Unit]розділі додати Before=systemd-resolved.

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


2
Мені довелося видалити попередній коментар, оскільки я більше не можу підтвердити, що це вирішило проблему. Я читав вікі, перш ніж запитати тут, і у мене вже був файл resv.conf з сервером імен localhost вгорі. Це не допомогло. Потім я дотримувався ваших інструкцій, щоб перемістити зовнішні сервери імен до другого файлу для dnsmasq. Після першої перезавантаження dnsmasq спочатку завантажився, щоб проблеми не виникло. При другому перезавантаженні розв'язаний завантажений перший, щоб dnsmasq вийшов із описаною помилкою. Я, як і раніше.
вік

6
У блоці dnsmasq поставте а Before=systemd-resolvedв [Unit]розділі. Таким чином, dnsmasq завжди почнеться першим.
Мунір

7

Судячи з системних мап, не можна вручну відключати заглушку DNS-сервера. Цікаво, що описану проблему я помітив лише після оновлення systemd з 230 до 231.

Відключення системного рішення не було для мене варіантом, тому що мені це потрібно для обробки отриманих серверів DNS вище за потоком через DHCP.

Моє рішення полягало в тому, щоб зробити dnsmasq stop systemd-разрешеним перед запуском і запустити його після цього знову.

Я створив конфігурацію, що випадає /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

Це здається досить хакерським рішенням, але воно працює.


2
Гей насправді це рішення досить гладке. Він зберігається навіть після оновлення пакету, оскільки він зберігає оригінальний файл одиниці. Чудово зроблено. У DNSStubListenerкерівництві дозволеного рішення разрешено наступне : "Зауважте, що слухач заглушки DNS вимкнено неявно, коли його адреса прослуховування та порт вже використовуються." Ось чому цей метод добре працює, я думаю.
Джонатан Комар

Рішення ++ !!!
sjas

Мені довелося змінити / usr / bin / systemctl на / bin / systemctl
Брюс Барнетт

5

Я просто ввімкнув опцію "bind-interface", видаливши "#" на початку рядка в /etc/dnsmasq.conf.

Мені вдалося запустити dnsmasq знову:

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

Мене вказувало на це рішення, коли ця дискусія була вирішена: додайте опцію вимкнення резолюції заглушки


Це найкраща відповідь на те, що таке пожежний смітник. Немає жодних причин systemd повинен зайняти цей порт, навіть якщо він не працює.
Джонатан С. Фішер


2

Якщо ви використовуєте налаштування Ubuntu 18.04 за замовчуванням, це може бути викликано конфліктом між systemd-resolved(сервер DNS за замовчуванням) та dnsmasq. Якщо ви встановили dnsmasqсебе навмисно, тому що ви явно цього хотіли, то одна з інших відповідей на це питання, пояснюючи, як відключити systemd-resolved, вам, ймовірно, буде корисна. Якщо ви явно не встановили dnsmasq, це, ймовірно, на місці, оскільки ви використовуєте lxd. Це може бути тому, що ви фактично використовуєте lxdдля керування контейнерами, але це, швидше за все, тому, що знімки використовують lxdдля захисту вас, коли встановлені додатки. З моєї точки зору, я хочу зберегти dnsmasq(тому що lxdхоче), але також хочу зберегтиsystemd-resolved як сервер DNS (адже саме це обрала команда Ubuntu, і я довіряю їм більше, ніж собі).

Отже, це, здається, є lxdпроблемою на душі. Якщо так, то спосіб, яким я це зафіксував, відповідно до публікації списку розсилки lxd-користувачів :

$ 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% процесор.


2

Ось рішення для (X) Ubuntu 18.04 Bionic.

Встановіть dnsmasq

sudo apt install dnsmasq

Відключіть системний слухач на порту 53 (не торкайтеся /etc/systemd/Weather.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 та створіть заново. Це важливо, оскільки resoluv.conf є символьним посиланням на /run/systemd/resolve/stub-resolv.conf за замовчуванням. Якщо ви не видалите символічне посилання, файл буде перезаписаний системою при перезавантаженні (навіть якщо ми відключили системне рішення!). Також NetworkManager (NM) перевіряє, чи є символічним посиланням виявлення конфігурації, вирішеної системою.

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

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

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

та перезапустіть його:

$ sudo systemctl restart NetworkManager

Скажіть dnsmasq використовувати резолюцію.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

1
Спробувавши кілька інших рішень, саме ваше вирішило мою проблему на Linux Mint 19.1. Дуже дякую!
Ренан Лазаротто

1

Я вирішив це таким чином:

Додайте або коментуйте наступний рядок у / etc / default / dnsmasq :

IGNORE_RESOLVCONF=yes

Створіть власний файл резолюції (/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-resolution.

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 

Щоб зробити системне вирішення за допомогою 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-resolution встановить сервер DNS за замовчуванням dnsmasq у:

#/etc/resolv.conf
nameserver 127.0.0.1

Цей останній рядок мене здивував, тому я подивився на це. Це звучить як у вашому випадку, /etc/resolv.confє символьним посиланням на /run/systemd/resolve/resolv.conf. Мабуть, це один з чотирьох (!) Можливих різних режимів, в яких може працювати системний дозвіл. Я думаю, це залежить від того, як ваш дистрибутив встановив його, тобто це правда для вашого Xubuntu 18.04.1, але він може бути іншим для інших систем.
sourcejedi

0

Мені не вдалося змусити dnsmasq почати використовувати рішення, знайдені в Інтернеті, тобто відключення системного рішення, зміна dnsmasq.conf на "динамічне прив'язування" замість "зв'язування інтерфейсів". Мені вдалося запустити його при завантаженні, запустивши dnsmasq start after 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

Дякуємо, що опублікували підхід, який ви використовуєте. Зауважте, що зазвичай, замовляючи мережу.online.target, ви також повинні додати network-online.target до списку Wants=. freedesktop.org/wiki/Software/systemd/NetworkTarget
sourcejedi

0

Ось що працювало для мене (після години болю) у космічній каракатиці Ubuntu 18.10. Я зробив це для того, щоб скористатися dnsmasqпорівняно більш надійним механізмом кешування та уникнути вразливості NGINX . Зауважте, що я використовую версію сервера Ubuntu (немає 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.