Comment éviter les conflits entre dnsmasq et systemd-resolu?

57

J'ai récemment installé Dnsmasq pour qu'il agisse en tant que serveur DNS pour mon réseau local. Dnsmasq écoute sur le port 53 déjà utilisé par l'écouteur de stub DNS local à partir de la résolution systemd .

Il suffit d’arrêter Systemd, puis de le redémarrer une fois Dnsmasq en cours d’exécution pour résoudre ce problème. Mais il revient après un redémarrage: systemd-resolution est démarré avec préférence et dnsmasq ne démarrera pas car le port 53 est déjà utilisé.

La première question évidente, je suppose, est de savoir comment mieux faire comprendre à systemd qu’il ne doit pas démarrer le programme d’écoute du stub DNS local et conserver ainsi le port 53 à l’utilisation de dnsmasq.

Une question plus intéressante, cependant, est de savoir comment les deux services sont généralement censés fonctionner ensemble. Sont-ils même censés travailler côte à côte ou est-ce que systemd est résolu uniquement si on utilise dnsmasq?

victime
la source
4
Avez-vous essayé de désactiver simplement via sudo systemctl disable systemd-resolved? Dnsmasq si correctement configuré devrait gérer la résolution de domaine, je pense.
pbhj
1
Vous devez également émettre sudo systemctl stop systemd-resolvedsi il est en cours d'exécution. Utiliser sudo systemctl status systemd-resolvedpour vérifier
Bruce Barnett

Réponses:

42

Depuis la version 232 de systemd (sortie en 2017), vous pouvez éditer /etc/systemd/resolved.confet ajouter cette ligne:

DNSStubListener=no

Cela désactivera la liaison au port 53.

L'option est décrite plus en détail dans la page de manuel resol.conf .

Vous pouvez trouver la version de systemd sur laquelle votre système tourne:

systemctl --version
Malvineux
la source
2
Faire ce tour de la connexion Internet
Ravinder
2
@Ravinder: Cela désactivera le serveur DNS systemd, oui. Si votre système est configuré pour utiliser ce serveur, il semblera que la connexion Internet cesse de fonctionner (car vous l'avez désactivée). Vous devrez configurer votre système pour utiliser un autre serveur DNS à la place. Généralement, les utilisateurs désactivent la liaison sur le port 53 car ils souhaitent y exécuter leur propre serveur DNS. Ce n'est donc pas un problème.
Malvineous
18

Vous pouvez désactiver le systemd-resolvedchargement au démarrage en utilisant sudo systemctl disable systemd-resolved.

Si vous voulez exécuter les deux ensemble, vous pouvez rediriger le systemd-resolvedpour utiliser l'hôte local comme serveur de noms principal. Cela garantira que toutes les requêtes sont dirigées vers Dnsmasq pour la résolution avant de frapper le serveur DNS externe. Cela peut être fait en ajoutant la ligne nameserver 127.0.0.1en haut de votre /etc/resolv.conffichier. Cela désactivera également la mise en cache locale de systemd.

Vous pouvez en lire plus sur le wiki Arch Linux . Je l'ai copié à partir de là et ça couvre assez bien.

Cependant, cela n'évite pas l'erreur au démarrage de manière fiable, c.-à-d. Que Dnsmasq échouera quand même si le problème résolu par systemd a commencé. Si votre version de systemdest suffisamment nouvelle, utilisez la réponse de Malvineous . Si votre version de systemdest trop ancienne, vous pouvez contourner ce problème en modifiant l’unité Dnsmasq: dans la [Unit]section, ajoutez Before=systemd-resolved.

Après cela, si vous le souhaitez, vous pouvez créer un séparé /etc/dnsmasq-resolv.conffichier pour les serveurs de noms en amont et de le transmettre en utilisant la -rou --resolv-fileoption ou ajouter les serveurs de noms en amont dans le fichier de configuration de dnsmasq et utiliser la -Rou --no-resolvoption. De cette façon, vous n’avez que l’hôte local dans votre /etc/resolv.confet tout passe par Dnsmasq.

Munir
la source
2
J'ai dû retirer mon commentaire précédent car je ne peux plus confirmer que cela a résolu le problème. J'ai lu le wiki avant de demander ici et j'avais déjà un fichier resolv.conf avec le serveur de noms localhost en haut. Cela n'a pas aidé. J'ai ensuite suivi vos instructions pour déplacer les serveurs de noms externes dans un deuxième fichier pour Dnsmasq. Après le premier redémarrage, Dnsmasq a été chargé en premier pour que le problème ne se pose pas. Lors du deuxième redémarrage, résolu chargé en premier, Dnsmasq s'est arrêté avec l'erreur décrite. Je suis aussi loin qu'avant.
vic
6
Dans l'unité dnsmasq, mettez un Before=systemd-resolveddans la [Unit]section. De cette façon, Dnsmasq commencera toujours en premier.
Munir
7

À en juger par les pages de manuel systemd, il n’est pas prévu de pouvoir désactiver manuellement le serveur DNS de stub. Fait intéressant, j'ai seulement remarqué le problème décrit après la mise à niveau de systemd de 230 à 231.

Désactiver la résolution de systemd n'était pas une option pour moi car j'en ai besoin pour gérer les serveurs DNS en amont reçus via DHCP.

Ma solution était de faire en sorte que dnsmasq arrête systemd-resolu avant de le redémarrer ensuite.

J'ai créé une config drop-in dans /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

Cela semble être une solution plutôt compliquée, mais cela fonctionne.

freaker
la source
2
Hé, en fait, cette solution est assez astucieuse. Il est persistant même après les mises à jour du paquet car il conserve le fichier d'unité d'origine. Bien fait. Le DNSStubListenertexte du manuel resol.conf indique ce qui suit : "Notez que l'écouteur de stub DNS est désactivé de manière implicite lorsque son adresse d'écoute et son port sont déjà utilisés." C'est pourquoi cette méthode fonctionne bien, je pense.
Jonathan Komar
Une solution A ++ !!!
Sjas
Je devais changer / usr / bin / systemctl en / bin / systemctl
Bruce Barnett
5

Je viens d'activer l'option "bind-interfaces" en supprimant '#' au début de la ligne dans /etc/dnsmasq.conf.

J'ai pu redémarrer Dnsmasq:

  • dnsmasq lie le port DNS sur toutes les interfaces (y compris 127.0.0.1), port 53,
  • systemd-resolv continue d'écouter 127.0.0. 53 : 53

Cette discussion résolue m'a amené à cette solution : ajouter une option pour désactiver le résolveur de stub

tomtom
la source
C'est la meilleure réponse pour ce qui est un feu de benne à ordures. Il n'y a aucune raison pour que systemd occupe ce port, même en boucle.
Jonathan S. Fisher
2

Si vous utilisez une configuration par défaut d'Ubuntu 18.04, cela peut être dû à un conflit entre systemd-resolved(le serveur DNS par défaut) et dnsmasq. Si vous dnsmasqvous êtes installé délibérément parce que vous le vouliez explicitement, l'une des autres réponses à cette question, expliquant comment désactiver systemd-resolved, sera probablement bénéfique pour vous. Si vous n'avez pas explicitement installé dnsmasq, alors il est probablement en place parce que vous utilisez lxd. C'est peut-être parce que vous utilisez réellement lxdpour gérer les conteneurs, mais c'est probablement parce que les instantanés s'utilisent lxdpour vous protéger lorsque des applications sont installées. De mon point de vue, je veux garder dnsmasq(parce que le lxdveut) mais je veux aussi gardersystemd-resolved en tant que serveur DNS (car c'est ce que l'équipe Ubuntu a choisi et je leur fais plus confiance que moi).

Cela semble donc être un lxdproblème de fond. Si tel est le cas, voici comment je l'ai corrigé, comme dans un message de la liste de diffusion lxd-users :

$ lxc network edit lxdbr0

Cela modifiera votre configuration dans un éditeur de terminal. Cela ressemblera à ceci:

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

Ajoutez-y trois lignes:

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

et cela devrait causer dnsmasq, qui est en cours d'exécution lxd, de détecter les boucles DNS. Cela, au moins pour moi, a résolu le problème et a arrêté systemd-resolvedet en dnsmasqutilisant 100% du CPU.

sil
la source
2

Voici la solution pour (X) Ubuntu 18.04 Bionic.

Installer Dnsmasq

sudo apt install dnsmasq

Désactivez le programme d'écoute résolu par systemd sur le port 53 (ne touchez pas à /etc/systemd/resolved.conf car il pourrait être écrasé lors de la mise à niveau):

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

et le redémarrer

$ sudo systemctl restart systemd-resolved

(sinon désactivez-le complètement par $ sudo systemctl disable systemd-resolved.service )

Supprimez /etc/resolv.conf et créez à nouveau. Ceci est important, car resolv.conf est un lien symbolique vers /run/systemd/resolve/stub-resolv.conf par défaut. Si vous ne supprimez pas le lien symbolique, le fichier sera écrasé par systemd lors du redémarrage (même si nous avons désactivé systemd-resol!). NetworkManager (NM) vérifie également s'il s'agit d'un lien symbolique permettant de détecter la configuration résolue par systemd.

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

Désactivez le remplacement de /etc/resolv.conf par NM (il existe également une option rc-manager, mais cela ne fonctionne pas, bien que cela soit décrit dans le manuel de NM):

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

et le redémarrer:

$ sudo systemctl restart NetworkManager

Dites à dnsmasq d'utiliser resolv.conf à partir de NM:

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

et le redémarrer:

$ sudo systemctl restart dnsmasq

Utilisez dnsmasq pour résoudre:

$ cat /etc/resolv.conf 
# Use local dnsmasq for resolving
nameserver 127.0.0.1
Sena
la source
1
Après avoir essayé quelques autres solutions, c'est la vôtre qui a résolu mon problème sous Linux Mint 19.1. Merci beaucoup!
Renan Lazarotto
1

Je l'ai résolu de cette façon:

Ajoutez ou décommentez la ligne suivante dans / etc / default / dnsmasq :

IGNORE_RESOLVCONF=yes

Créez votre propre fichier de résolution (/etc/resolv.personal) pour définir les serveurs de noms. Vous pouvez utiliser n'importe quel serveur de noms ici. J'en ai pris deux sur https://www.opennic.org

nameserver 5.132.191.104
nameserver 103.236.162.119

Dans /etc/dnsmasq.conf, ajoutez ou supprimez la mise en commentaire de la ligne suivante:

resolv-file=/etc/resolv.personal

Puis redémarrez Dnsmasq et désactivez le résolveur par défaut: systemd-resol.

sudo service dnsmasq restart

sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
Daniel Pernold
la source
1

Je ne sais pas pourquoi les deux services essaient d'utiliser la même adresse. Peut-être que vous pouvez les organiser comme dans mon cas sous Xubuntu 18.04.1, où leur configuration est la suivante:

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 

Pour résoudre systemd en utilisant mon dnsmasq, je viens de définir:

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

Dans ma configuration Dnsmasq, j'ai défini mes serveurs de noms externes:

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

Après avoir tout redémarré:

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

systemd-resolu définira le serveur DNS par défaut sur dnsmasq dans:

#/etc/resolv.conf
nameserver 127.0.0.1
JonnyTischbein
la source
Cette dernière ligne m'a surpris, alors je l'ai regardé. Cela ressemble, dans votre cas, à /etc/resolv.confun lien symbolique vers /run/systemd/resolve/resolv.conf. Apparemment, il s’agit de l’un des quatre (!) Différents modes possibles de résolution de systemd. Je suppose que cela dépend de la configuration de votre distribution, c’est-à-dire vrai pour votre Xubuntu 18.04.1, mais cela pourrait être différent pour d’autres systèmes.
sourcejedi
0

Je ne parvenais pas à obtenir que dnsmasq commence à utiliser les solutions trouvées en ligne, c.-à-d. En désactivant systemd-resol, en changeant le fichier dnsmasq.conf pour "lier dynamique" au lieu de "lier interfaces". J'ai réussi à le faire démarrer au démarrage en lançant dnsmasq start après network-online.service plutôt que 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
Omegaelix
la source
Merci d'avoir publié l'approche que vous utilisez. Notez que, normalement, lorsque vous commandez sur network-online.target, vous devez également ajouter network-online.target à la liste des Wants=. freedesktop.org/wiki/Software/systemd/NetworkTarget
sourcejedi
0

Voici ce qui a fonctionné pour moi (après des heures de douleur) dans Ubuntu 18.10 Cosmic Cuttlefish. Je l’ai fait pour tirer parti dnsmasqdu mécanisme de mise en cache comparativement plus robuste et éviter les vulnérabilités du résolveur NGINX . Notez que j'utilise l'édition Ubuntu Server (no NetworkManager/ nmcli, uniquement systemd-networkd) et qu'elle s'exécute sur AWS EC2. J'avais donc également besoin de faire en sorte que DNS et DHCP fonctionnent avec le domaine de recherche EC2 par défaut. Je ne voulais pas désactiver systemd-resolvedentièrement parce que je ne savais pas comment cela pourrait affecter les futures mises à jour. Tout ce qui s’exécute ici est exécuté en tant que root / sudo sauf indication contraire (cela se produit par défaut lorsqu’il est transmis en tant que données utilisateur 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

Vérifiez qu’il 127.0.0.1#53est utilisé pour la résolution et que DNSSEC fonctionne avec quelque chose comme:dig +trace facebook.com

Justin Garrick
la source
Savez-vous pourquoi vous avez toujours besoin de ce fichier unité hack droph, lorsque vous avez défini DNSStubListener=no?
sourcejedi