Avec le point précédent sur l’installation de Pihole, on interroge maintenant des serveurs DNS respectueux de notre vie privée tels que cloudflare ou quad9. Super! Mais il faut savoir que ces requêtes passent en claires et sont visibles par notre FAI ou tout autre intermédiaire…

Le DNSsec n’étant pas suffisamment répandu pour ne pas subir une attaque MITM, le mieux actuellement est de sécurisé son trafic jusqu’à un tiers de confiance.

Pour sécuriser encore plus la résolution de nos DNS on peut passer par DoH (dns over https) ou DoT (DNS over TLS). C’est le deuxième qui sera retenu, car il est inutile d’ajouter des couches HTTP. Le DoT est plus natif, un peu comme imaps pour les mails, https pour le web, etc

schema dns over tls cloudflare quad9

Les requêtes sortantes peuvent se faire via :

  • DNScrypt
  • DNS over https DoH
  • DNS over TLS DoT

Quel protocole utiliser ? Un article anglais explique bien que le DoT est le choix le plus judicieux

2 choix

Installation du service DoT

Unbound via l’image qmcgaw/dns permet de générer les fichiers de configuration unbound à partir de varniable d’environement pour une installation rapide et stateless.

Voici la configuration du service à ajouter à celle de l’installation de Pihole vue précédemment.

services:
  dot:
    image: qmcgaw/dns:latest
    container_name: pihole-unbound-DoT
    environment:
      PROVIDERS: 'cloudflare,quad9'
      BLOCK_MALICIOUS: 'on'
      CACHING: 'off'
    networks:
      dnsnet:
        ipv4_address: 10.10.10.34
    restart: unless-stopped

Configurer un relais DNS sécurisé dans Pihole

Après l’installation du container DoT, il faut modifier l’IP du serveur personnalisé.
Aller dans Settings > DNS pour décocher tous les serveurs de gauche et activé un custom avec l’IP de notre container docker unbound-dot :

docker inspect -f '{{ .NetworkSettings.Networks.pihole_dnsnet.IPAddress }}' unbound-dot
10.10.10.34

Attention à bien fixer les IP de vos container cette fois-ci vu que les serveurs DNS ont besoin d’IP et non de nom
changement des serveurs DNS

Tester si nos DNS sont sécurisés via https://1.1.1.1/help, le résultat qui nous intéresse est « Using DNS over TLS (DoT) » :
Test de vérification DNS DoT cloudflare

Tester la résolution DNS DoT (DNS-over-tls) en ligne de commande. Cela nécessite le paquet knot-dnsutils

kdig -d @1.1.1.1 +tls-ca +tls-host=cloudflare-dns.com mondomain.tld

Passage en revue de l’installation complète avec Pihole

Dans mon exemple, c’est le container pihole qui reçoit les requêtes des clients pour les transférer au container Unbound DoT et de manière sécurisée jusque Cloudflaire. Ils partageront donc un réseau afin de segmenter le tout, plus besoin d’avoir le port de l’host ouvert.
Dans l’exemple le réseau 10.10.10.32/29 nous donne 8 IP dispo dans l’absolut mais :

  • 10.10.10.32 est notre network
  • 10.10.10.33 étant réservée pour l’host, et faisant gateway pour les containers de ce réseau
  • il reste 5 IP dispo de 10.10.10.34 à 10.10.10.38
  • 10.10.10.39 est le broadcast

Pour les DNS cela travail essentiellement avec des IP, on fixe donc les IP des containers.
Et on oublie pas la dépendance du service pihole envers notre Unbound pour faire propre.

version: '3.7'

networks:
  dnsnet:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.10.10.32/29
  proxy-net:
    external: true

services:

  dot:
    image: qmcgaw/dns:latest
    container_name: pihole-unbound-DoT
    environment:
      PROVIDERS: 'cloudflare,quad9'
      CACHING: 'off'
      BLOCK_MALICIOUS: 'on'
    networks:
      dnsnet:
        ipv4_address: 10.10.10.34
    restart: unless-stopped

  pihole:
    image: pihole/pihole:latest
    container_name: pihole
    ports:
      - "53:53/tcp"
      - "53:53/udp"
    volumes:
      - '/var/lib/docker/data/pihole/config/etc-pihole/:/etc/pihole/'
      - '/var/lib/docker/data/pihole/config/etc-dnsmasq.d/:/etc/dnsmasq.d/'
    environment:
      TZ: 'Europe/Paris'
      ADMIN_EMAIL: 'YOUR_EMAIL'
      WEBPASSWORD: 'tttttt'
      DNS1: 10.10.10.34
      DNS2: 10.10.10.34
      VIRTUAL_HOST: pihole.domain.tld
    depends_on:
      - dot
    networks:
      proxy-net:
      dnsnet:
          ipv4_address: 10.10.10.35
    restart: unless-stopped

    labels:
      - traefik.enable=true
      - traefik.http.services.pihole.loadbalancer.server.port=80
      - traefik.http.routers.pihole.entrypoints=websecure
      - traefik.http.routers.pihole.tls.certresolver=le
      - "traefik.http.routers.pihole.rule=Host(`pihole.domain.tld`)"

On peut lancer et inspecter les IP des containers via :

docker network inspect pihole_dnsnet
Summary
Sécuriser ses DNS avec Pihole et DoT (dns-over-tls)
Article Name
Sécuriser ses DNS avec Pihole et DoT (dns-over-tls)
Description
Pour sécuriser encore plus la résolution de nos DNS on peut passer par DoH (dns over https) ou DoT (DNS over TLS). C'est le deuxième qui sera retenu, car il est inutile d'ajouter des couches HTTP. Le DoT est plus natif, un peu comme imaps pour les mails, https pour le web, etc
Author