Jak uniknąć konfliktów między dnsmasq i systemd-rozwiązane?

56

Niedawno zainstalowałem dnsmasq, aby działał jako serwer DNS dla mojej sieci lokalnej. dnsmasq nasłuchuje na porcie 53, który jest już używany przez lokalny odbiornik kodów DNS z systemd-resolved .

Zatrzymanie systemu rozwiązane, a następnie uruchom go ponownie po uruchomieniu dnsmasq rozwiązuje ten problem. Ale powraca po ponownym uruchomieniu: systemd-resolved jest uruchamiany z preferencją i dnsmasq nie uruchamia się, ponieważ port 53 jest już w użyciu.

Pierwsze oczywiste pytanie, jak sądzę, brzmi: jak najlepiej sprawić, by systemd rozwiązał zrozumiał, że nie powinien on uruchamiać lokalnego nasłuchiwania kodu pośredniczącego DNS, a tym samym zachować port 53 do użytku przez dnsmasq?

Bardziej interesującym pytaniem jest jednak to, w jaki sposób obie usługi mają na ogół współpracować. Czy mają nawet działać obok siebie, czy też system jest rozwiązany w taki sam sposób, jeśli używa się dnsmasq?

ofiara
źródło
4
Czy próbowałeś właśnie wyłączyć poprzez sudo systemctl disable systemd-resolved? Myślę, że dnsmasq, jeśli właściwie skonfigurowany, powinien obsługiwać rozdzielczość domeny.
pbhj
1
Musisz także wydać polecenie, sudo systemctl stop systemd-resolvedjeśli jest uruchomione. Użyj, sudo systemctl status systemd-resolvedaby sprawdzić
Bruce Barnett

Odpowiedzi:

41

Od wersji systemd 232 (wydanej w 2017 roku) możesz edytować /etc/systemd/resolved.confi dodawać ten wiersz:

DNSStubListener=no

Spowoduje to wyłączenie wiązania do portu 53.

Opcja została opisana bardziej szczegółowo na stronie manualnej resolved.conf .

Możesz znaleźć wersję systemd, w której działa twój system:

systemctl --version
Malvineous
źródło
2
Ta kolejność połączenia z Internetem
Ravinder
2
@Ravinder: Wyłączy systemowego serwera DNS, tak. Jeśli Twój system jest skonfigurowany do korzystania z tego serwera, będzie wyglądało na to, że połączenie internetowe przestaje działać (ponieważ zostało wyłączone). Konieczne będzie skonfigurowanie systemu do korzystania z innego serwera DNS. Zazwyczaj ludzie wyłączają wiązanie na porcie 53, ponieważ zamiast tego chcą tam uruchomić własny serwer DNS, więc nie stanowi to problemu.
Malvineous,
18

Możesz wyłączyć systemd-resolvedładowanie podczas rozruchu za pomocą sudo systemctl disable systemd-resolved.

Jeśli chcesz uruchomić oba razem, możesz przekierować systemd-resolveddo używania localhost jako podstawowego serwera nazw. Dzięki temu wszystkie zapytania będą kierowane do dnsmasq w celu rozwiązania problemu przed trafieniem na zewnętrzny serwer DNS. Można to zrobić, dodając wiersz nameserver 127.0.0.1u góry /etc/resolv.confpliku. Spowoduje to również wyłączenie lokalnego buforowania systemd.

Możesz przeczytać więcej na wiki Arch Linux . Skopiowałem to stamtąd i całkiem dobrze to obejmuje.

Jednak nie pozwala to niezawodnie uniknąć błędu podczas rozruchu, tzn. Dnsmasq nadal nie powiedzie się, jeśli systemd rozwiązany zostanie uruchomiony jako pierwszy. Jeśli twoja wersja systemdjest wystarczająco nowa, użyj odpowiedzi Malvineous . Jeśli twoja wersja systemdjest za stara, możesz obejść ten problem, modyfikując jednostkę dnsmasq: w [Unit]sekcji dodaj Before=systemd-resolved.

Po tym, jeśli chcesz, możesz utworzyć osobny /etc/dnsmasq-resolv.confplik dla głównego serwera nazw i przekazać go za pomocą -rlub --resolv-fileopcję, albo dodać upstream serwery nazw pliku konfiguracyjnego dnsmasq i użyj -Rlub --no-resolvopcję. W ten sposób masz tylko lokalnego hosta /etc/resolv.confi wszystko przechodzi przez dnsmasq.

Munir
źródło
2
Musiałem usunąć poprzedni komentarz, ponieważ nie mogę już potwierdzić, że to rozwiązało problem. Przeczytałem wiki zanim zapytałem tutaj i miałem już plik resolv.conf z serwerem nazw localhost na górze. To nie pomogło. Następnie wykonałem instrukcje, aby przenieść zewnętrzne serwery nazw do drugiego pliku dla dnsmasq. Po pierwszym ponownym uruchomieniu, dnsmasq ładował się pierwszy, więc problem nie pojawił się. Przy drugim restarcie uruchomiono najpierw ładowanie, więc dnsmasq zakończył działanie z opisanym błędem. Jestem tak daleko jak wcześniej.
vic
6
W jednostce dnsmasq umieść a Before=systemd-resolvedw [Unit]sekcji. W ten sposób dnsmasq zawsze będzie uruchamiany jako pierwszy.
Munir,
7

Sądząc po stronach systemowych, nie jest możliwe ręczne wyłączenie pośredniczącego serwera DNS. Co ciekawe, zauważyłem opisany problem dopiero po aktualizacji systemu z 230 do 231.

Wyłączenie systemu-rozwiązanego nie było dla mnie opcją, ponieważ potrzebuję go do obsługi odebranych serwerów DNS za pośrednictwem DHCP.

Moje rozwiązanie polegało na tym, że dnsmasq przestał działać rozwiązany przed uruchomieniem i uruchomił go ponownie później.

Utworzyłem konfigurację drop-in w /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

To wydaje się być dość hackerskim rozwiązaniem, ale działa.

dziwak
źródło
2
Hej, to rozwiązanie jest całkiem sprytne. Jest trwały nawet po aktualizacji pakietu, ponieważ zachowuje oryginalny plik jednostki. Ładnie wykonane. W DNSStubListenerinstrukcji resolved.conf podano poniżej : „Pamiętaj, że detektor kodów pośredniczących DNS jest domyślnie wyłączany, gdy jego adres nasłuchiwania i port są już w użyciu”. Dlatego myślę, że ta metoda działa dobrze.
Jonathan Komar
Rozwiązanie ++ !!!
sjas,
Musiałem zmienić / usr / bin / systemctl na / bin / systemctl
Bruce Barnett
5

Właśnie włączyłem opcję „interfejsy powiązań”, usuwając „#” na początku wiersza w /etc/dnsmasq.conf.

Mogłem ponownie uruchomić dnsmasq:

  • port DNS powiązania dnsmasq na wszystkich interfejsach (w tym 127.0.0.1) port 53,
  • systemd-resolv wciąż nasłuchuje na 127.0.0. 53 : 53

Wskazano mi na to rozwiązanie dzięki tej dyskusji rozwiązanej: dodaj opcję, aby wyłączyć przelicznik kodów pośredniczących

tomtom
źródło
To najlepsza odpowiedź na to, co jest pożarem śmietnika. Nie ma powodu, dla którego systemd powinien zajmować ten port, nawet przy sprzężeniu zwrotnym.
Jonathan S. Fisher,
2

Jeśli używasz domyślnej konfiguracji Ubuntu 18.04, może to być spowodowane konfliktem między systemd-resolved(domyślnym serwerem DNS) a dnsmasq. Jeśli zainstalowałeś dnsmasqsię celowo, ponieważ wyraźnie tego chciałeś, to jedna z pozostałych odpowiedzi na to pytanie, wyjaśniająca, jak wyłączyć systemd-resolved, prawdopodobnie będzie dla ciebie dobra. Jeśli nie zainstalowałeś jawnie dnsmasq, prawdopodobnie jest na miejscu, ponieważ używasz lxd. Może to wynikać z tego, że faktycznie używasz lxddo zarządzania kontenerami, ale najprawdopodobniej dzieje się tak, ponieważ zatrzaski służą lxddo ochrony podczas instalowania aplikacji. Z mojej perspektywy chcę zachować dnsmasq(bo tego lxdchce), ale chcę też zachowaćsystemd-resolved jako serwer DNS (ponieważ to właśnie wybrał zespół Ubuntu i ufam im bardziej niż sobie).

Wydaje się, że jest to lxdproblem w sercu. Jeśli tak, to sposób, w jaki to naprawiłem, zgodnie z postem na liście mailingowej użytkowników lxd , jest następujący:

$ lxc network edit lxdbr0

Spowoduje to edycję konfiguracji w edytorze terminali. Będzie to wyglądać mniej więcej tak:

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

Dodaj do niego trzy linie:

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

a to powinno spowodować dnsmasq, że uruchomione przez lxdto urządzenie wykryje pętle DNS. To, przynajmniej dla mnie, rozwiązał problem i zatrzymał się systemd-resolvedi dnsmasqużywając 100% CPU.

sil
źródło
2

Oto rozwiązanie dla (X) Ubuntu 18.04 Bionic.

Zainstaluj dnsmasq

sudo apt install dnsmasq

Wyłącz nasłuchiwanie rozpoznane przez system na porcie 53 (nie dotykaj /etc/systemd/resolved.conf, ponieważ może zostać nadpisany podczas aktualizacji):

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

i uruchom go ponownie

$ sudo systemctl restart systemd-resolved

(alternatywnie wyłącz to całkowicie przez $ sudo systemctl disable systemd-resolved.service )

Usuń /etc/resolv.conf i utwórz ponownie. Jest to ważne, ponieważ resolv.conf jest domyślnie dowiązaniem symbolicznym do /run/systemd/resolve/stub-resolv.conf. Jeśli nie usuniesz dowiązania symbolicznego, plik zostanie zastąpiony przez systemd przy ponownym uruchomieniu (nawet jeśli wyłączono systemd-rozwiązany!). Również NetworkManager (NM) sprawdza, czy jest to dowiązanie symboliczne do wykrywania konfiguracji rozwiązanej przez system.

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

Wyłącz nadpisywanie pliku /etc/resolv.conf przez NM (istnieje również opcja rc-manager, ale to nie działa, mimo że jest opisane w podręczniku NM):

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

i uruchom go ponownie:

$ sudo systemctl restart NetworkManager

Powiedz dnsmasq, aby używał resolv.conf z NM:

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

i uruchom go ponownie:

$ sudo systemctl restart dnsmasq

Użyj dnsmasq do rozwiązania:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1
Sena
źródło
1
Po wypróbowaniu kilku innych rozwiązań, twoje było tym, które rozwiązało mój problem w Linux Mint 19.1. Wielkie dzięki!
Renan Lazarotto
1

Rozwiązałem to w ten sposób:

Dodaj lub usuń komentarz z następującego wiersza w / etc / default / dnsmasq :

IGNORE_RESOLVCONF=yes

Utwórz własny plik resolv (/etc/resolv.personal), aby zdefiniować serwery nazw. Możesz użyć dowolnego serwera nazw tutaj. Wziąłem dwa z https://www.opennic.org

nameserver 5.132.191.104
nameserver 103.236.162.119

W /etc/dnsmasq.conf dodaj lub usuń komentarz z następującego wiersza:

resolv-file=/etc/resolv.personal

Następnie uruchom ponownie dnsmasq i wyłącz domyślny program rozpoznawania nazw: systemd-resolved.

sudo service dnsmasq restart

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
Daniel Pernold
źródło
1

Nie jestem pewien, dlaczego obie usługi próbują użyć tego samego adresu. Być może możesz je zaaranżować tak jak w moim przypadku na Xubuntu 18.04.1, gdzie ich konfiguracja jest następująca:

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 

Aby systemd został rozwiązany za pomocą mojego dnsmasq, właśnie ustawiłem:

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

W mojej konfiguracji dnsmasq ustawiam zewnętrzne serwery nazw:

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

Po ponownym uruchomieniu wszystkiego:

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

systemd-resolved ustawi domyślny serwer DNS na dnsmasq w:

#/etc/resolv.conf
nameserver 127.0.0.1
JonnyTischbein
źródło
Ta ostatnia linia mnie zaskoczyła, więc to sprawdziłem. Brzmi jak w twoim przypadku, /etc/resolv.confjest dowiązaniem symbolicznym /run/systemd/resolve/resolv.conf. Najwyraźniej jest to jeden z czterech (!) Możliwych trybów , w których może działać system-resolved. Wydaje mi się, że zależy to od konfiguracji dystrybucji, tzn. Jest prawdą w przypadku Xubuntu 18.04.1, ale może być inny w innych systemy.
sourcejedi
0

Nie mogłem zmusić dnsmasq do rozpoczęcia korzystania z rozwiązań znalezionych online, tj. Wyłączenia systemd-resolved, zmiany dnsmasq.conf na „wiąż dynamiczne” zamiast „łącz interfejsy”. Udało mi się go uruchomić przy starcie, uruchamiając dnsmasq Po network-online.service zamiast 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
źródło
Dziękujemy za opublikowanie używanego podejścia. Zauważ, że zwykle, gdy zamawiasz przeciwko network-online.target, powinieneś również dodać network-online.target do listy Wants=. freedesktop.org/wiki/Software/systemd/NetworkTarget
sourcejedi
0

Oto, co zadziałało dla mnie (po godzinach bólu) w Ubuntu 18.10 Cosmic Cuttlefish. Zrobiłem to, aby skorzystać dnsmasqze stosunkowo bardziej niezawodnego mechanizmu buforowania i aby uniknąć luk w programie rozpoznawania nazw NGINX . Zauważ, że korzystam z wersji Ubuntu Server (no NetworkManager/ nmcli, just systemd-networkd) i działa na AWS EC2, więc musiałem też zachować DNS i DHCP w domyślnej domenie wyszukiwania EC2. Nie chciałem systemd-resolvedcałkowicie wyłączać, ponieważ nie mam pojęcia, jak to może wpłynąć na przyszłe aktualizacje. Wszystko tutaj jest uruchamiane jako root / sudo, chyba że zaznaczono inaczej (dzieje się to domyślnie po przekazaniu jako dane użytkownika 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

Sprawdź, 127.0.0.1#53czy używana jest rozdzielczość, a DNSSEC działa z czymś takimdig +trace facebook.com

Justin Garrick
źródło
Czy wiesz, dlaczego nadal potrzebujesz hakowania tego pliku jednostki po ustawieniu DNSStubListener=no?
sourcejedi