dns

02/04/2026

DNS

SCHEMA :

on fait ping google.com depuis un conteneur.

flowchart TD
    A[Docker DNS
127.0.0.11] --> B[Lit /etc/resolv.conf] B --> C[systemd-resolved
127.0.0.53] C -->|upstream| D[AdGuard
127.0.0.1] C -->|fallback| E[1.1.1.1 / 8.8.8.8] D -->|resolution| E E --> F[Internet]

RESUME des options :

dans /etc/systemd/resolved.conf

  1. on met DNSStubListener=yes et DNS=1.1.1.1
    alors /etc/resolv.conf va contenir nameserver 127.0.0.53
    en gros il demarre un proxy qui va ecouter sur 127.0.0.53:53 et resoudre le dns en utilisant le dns "DNS=1.1.1.1"
# script actuellemetn en prod
rm -f /etc/resolv.conf;
ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf;
sed -i -n -E -e '/^#?DNSStubListener=/!p' -e '$aDNSStubListener=yes' /etc/systemd/resolved.conf;
sed -i -n -E -e '/^#?DNS=/!p' -e '$aDNS=1.1.1.1 8.8.8.8' /etc/systemd/resolved.conf;
sed -i -n -E -e '/^#?FallbackDNS=/!p' -e '$aFallbackDNS=9.9.9.9' /etc/systemd/resolved.conf;
systemctl restart systemd-resolved;
  1. si on met adguard ça sert a rien car adguard fait deja ça.
    donc on peut mettre DNSStubListener=no et DNS=127.0.0.1
    et on demarre adguard sur 127.0.0.1
    et on regle le dns upstream dans adguard (1.1.1.1)
    ou carement eteindre systemd-resolved et forcer le fichier directement /etc/resolv.conf
systemctl disable --now systemd-resolved
rm -f /etc/resolv.conf
echo "nameserver 127.0.0.1" > /etc/resolv.conf
  1. on peut aussi mettre DNSStubListener=no et "DNS=1.1.1.1"
    127.0.0.53 ne marchera pas.
    on peut directement forcer le fichier /etc/resolv.conf : nameserver 1.1.1.1
    le requetes dns partiront directement à 1.1.1.1
systemctl disable --now systemd-resolved
rm -f /etc/resolv.conf
echo "nameserver 1.1.1.1" > /etc/resolv.conf
  1. on met systemd-resolved, qui envoie à adguard mais garde 1.1.1.1 en fallback
rm -f /etc/resolv.conf;
ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf;
sed -i -n -E -e '/^#?DNSStubListener=/!p' -e '$aDNSStubListener=yes' /etc/systemd/resolved.conf;
sed -i -n -E -e '/^#?DNS=/!p' -e '$aDNS=127.0.0.1' /etc/systemd/resolved.conf;
sed -i -n -E -e '/^#?FallbackDNS=/!p' -e '$aFallbackDNS=1.1.1.1' /etc/systemd/resolved.conf;
systemctl restart systemd-resolved;

forcer docker à utiliser le bon dns

jq '.dns = ["172.17.0.1"]' "/etc/docker/daemon.json" > "/etc/docker/daemon.json.tmp" && mv "/etc/docker/daemon.json.tmp" "/etc/docker/daemon.json"
systemctl restart docker

installer adguard

Il faut que adguard ecoute 127.0.0.1 pour répondre aux requetes de l'OS.
et 172.17.0.1 pour répondre aux requetes de docker.

docker rm -f adguard
docker run -d \
--name adguard \
-v /opt/adguard/work:/opt/adguardhome/work \
-v /opt/adguard/conf:/opt/adguardhome/conf \
-p 127.0.0.1:53:53/tcp \
-p 127.0.0.1:53:53/udp \
-p 172.17.0.1:53:53/tcp \
-p 172.17.0.1:53:53/udp \
-p 0.0.0.0:80:80 \
-p 0.0.0.0:3000:3000 \
--restart=unless-stopped \
adguard/adguardhome

vérifier l'état de systemd-resolved;

resolvectl status;
resolvectl dns
resolvectl statistics

Test réel (le plus fiable)

Fais une requête DNS directe :

dig google.com
# forcer un dig sur un serveur précis : 
# dig @127.0.0.1 google.com
# dig @1.1.1.1 google.com
# dig @127.0.0.53 google.com

faire une requete depuis un conteneur docker

docker run --rm alpine nslookup google.com

Puis regarde :

resolvectl query google.com

Et surtout :

journalctl -u systemd-resolved -f