Catégories
Serveurs Linux

DNS-Over-TLS, selfhosted !

Cette bidouille vise à monter un serveur DNS-Over-TLS pour un client Android par exemple, ou tout autre système compatible avec ce standard. Elle s’inspire très largement du wiki de DNSPrivacy.org dans lequel on trouve plein de choses sympa! Merci à eux!

L’infrastructure se base sur 2 machines virtuelles:

  • VM1: passerelle Internet OPNsense
    • HAProxy et Let’s Encrypt
    • IP: 192.168.0.254 dans notre exemple
  • VM2: DNS avec AdBlocking
    • Pi-Hole pour le blocage des pubs et autres télémétries indésirables sur l’ensemble du réseau local
    • IP: 192.168.0.250 dans notre exemple

VM1

Commençons par la VM1: c’est la passerelle Internet OPNsense qui permettra d’exposer le DoT à la DMZ et négociera la liaison TLS. Il est nécessaire que HAProxy et Let’s Encrypt soient configurés ensembles dans OPNsense (bidouille non détaillée ici). L’idée est de disposer d’un FQDN signé par Let’s Encrypt, ou d’un wildcard Let’S Encrypt dans mon cas, et que HAProxy soit au courant de l’emplacement des certificats et des clefs L.E.

HAProxy

Commençons par HAproxy. Il faut tout d’abord un nouveau « Real Server ». Dans Services > HAProxy > Settings > onglet Real Servers > +

Nommons le « backend_private_dns » et faisons le se mettre en relation avec notre futur vrai serveur DNS « 192.168.0.250 » (flouté) dont le service « pihole-FTL » écoutera sur le port 53:

Ensuite, il faudra un « pool » de backend(s), même s’il n’y a qu’un seul backend. Dans Services > HAProxy > Settings > onglet Virtual Services > Backend Pools > +

Nommons le pool « pool_private_dns » et demandons lui d’inclure notre serveur de backend en TCP (Layer 4):

HAProxy pool DoT

Une fois le backend et son pool opérationnels, passons à la dernière étape dans HAProxy: le frontend, que nous exposerons à la DMZ.

Ça se passe dans Services > HAProxy > Settings > onglet Virtual Services > Public Services > +

Nommons le frontend « front_853 », 853 étant le port DoT supporté par Android. Il est tout à fait possible de changer ce port par autre chose, l’essentiel est que ce soit raccord avec la partie Firewalling plus bas.
C’est dans le frontend aussi que va se jouer la partie Let’S Encrypt.

  • Listen Address: le FQDN signé par Let’s Encrypt, suivi du port DoT
  • Type: SSL/HTTPS (TCP mode)
  • Default Backend Pool: pool_private_dns
  • Enable SSL Offloading: oui
  • Bind options: force-tlsv12
  • Cipher list: ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
HAProxy frontend DoT

Ne pas oublier de cliquer sur le bouton Apply en fin de manip.

Firewall

Création de la règle exposant notre futur DNS à la DMZ: dans Firewall > Rules > WAN > +

Idem, ne pas oublier de cliquer sur le bouton Apply en fin de manip.

VM2

La VM2 se base sur une distribution Ubuntu Server 18.10 x64 minimal virtual et Pihole.

Pi-Hole

Pi-Hole, pour ceux qui ne le connaissent pas, est un système très efficace de blocage de publicités, trackers, télémétrie, et autres flux superflus ou indésirables qu’il faut avoir sur son réseau! Il se base sur dnsmasq, et dispose en option d’une belle interface Web permettant de se satisfaire du nombre parfois hallucinant de requêtes bloquées (et de trafic potentiellement gagné!!). Il s’alimente via des blacklists publiques disponibles en ligne.

Pi-Hole!

Pas grand chose à dire concernant l’installation. Que ce soit sur un Raspbian ou tout autre Nux, rien de mieux que de passer par leur site pour connaitre l’unique ligne de commande permettant de le déployer: https://pi-hole.net/ !

Une fois le Pi-Trou installé, voici les listes avec lequel je l’ai alimenté (les 2 271 768 domaines blacklistés!), via l’interface Web ou via:

/etc/pihole/adlists.list
http://hosts-file.net/ad_servers.txt
http://someonewhocares.org/hosts/hosts
http://sysctl.org/cameleon/hosts
http://v.firebog.net/hosts/HPHosts-ads.txt
http://v.firebog.net/hosts/HPHosts-emd.txt
http://v.firebog.net/hosts/HPHosts-exp.txt
http://v.firebog.net/hosts/HPHosts-psh.txt
http://winhelp2002.mvps.org/hosts.txt
http://www.joewein.net/dl/bl/dom-bl.txt
http://www.networksec.org/grabbho/block.txt
https://adaway.org/hosts.txt
https://adblock.mahakala.is/
https://bitbucket.org/ethanr/dns-blacklists/raw/8575c9f96e5b4a1308f2f12394abd86d0927a4a0/bad_lists/Mandiant_APT1_Report_Appendix_D.txt
https://easylist-downloads.adblockplus.org/easylist_noelemhide.txt
https://easylist.to/easylist/easylist.txt
https://easylist.to/easylist/easyprivacy.txt
https://easylist.to/easylist/fanboy-annoyance.txt
https://easylist.to/easylist/fanboy-social.txt
https://gist.githubusercontent.com/BBcan177/4a8bf37c131be4803cb2/raw/343ff780e15205b4dd0de37c86af34cfb26b2fbe/MS-2
https://gist.githubusercontent.com/BBcan177/b6df57cef74e28d90acf1eec93d62d3b/raw/f0996cf5248657ada2adb396f3636be8716b99eb/MS-4
https://gist.githubusercontent.com/anudeepND/adac7982307fec6ee23605e281a57f1a/raw/5b8582b906a9497624c3f3187a49ebc23a9cf2fb/Test.txt
https://github.com/StevenBlack/hosts/blob/master/extensions/fakenews/hosts
https://github.com/StevenBlack/hosts/blob/master/extensions/gambling/hosts
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-blocklist.txt
https://gitlab.com/quidsup/notrack-blocklists/raw/master/notrack-malware.txt
https://hosts-file.net/ad_servers.txt
https://hosts-file.net/emd.txt
https://hosts-file.net/exp.txt
https://hosts-file.net/fsa.txt
https://hosts-file.net/grm.txt
https://hosts-file.net/mmt.txt
https://hosts-file.net/pha.txt
https://hosts-file.net/psh.txt
https://hostsfile.mine.nu/hosts0.txt
https://hostsfile.org/Downloads/hosts.txt
https://isc.sans.edu/feeds/suspiciousdomains_Low.txt
https://isc.sans.edu/feeds/suspiciousdomains_Medium.txt
https://mirror.cedia.org.ec/malwaredomains/immortal_domains.txt
https://mirror1.malwaredomains.com/files/justdomains
https://openphish.com/feed.txt
https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=0&mimetype=plaintext
https://pgl.yoyo.org/as/serverlist.php?showintro=0&startdate%5Byear%5D=2000
https://ransomwaretracker.abuse.ch/downloads/CW_C2_DOMBL.txt
https://ransomwaretracker.abuse.ch/downloads/LY_C2_DOMBL.txt
https://ransomwaretracker.abuse.ch/downloads/RW_DOMBL.txt
https://ransomwaretracker.abuse.ch/downloads/TC_C2_DOMBL.txt
https://ransomwaretracker.abuse.ch/downloads/TL_C2_DOMBL.txt
https://raw.githubusercontent.com/CHEF-KOCH/Audio-fingerprint-pages/master/AudioFp.txt
https://raw.githubusercontent.com/CHEF-KOCH/CKs-FilterList/master/CK's-FilterList.txt
https://raw.githubusercontent.com/CHEF-KOCH/NSABlocklist/master/HOSTS
https://raw.githubusercontent.com/CHEF-KOCH/Spotify-Ad-free/master/Spotify.txt
https://raw.githubusercontent.com/CHEF-KOCH/Canvas-Font-Fingerprinting-pages/master/Canvas.txt
https://raw.githubusercontent.com/CHEF-KOCH/Canvas-fingerprinting-pages/master/Canvas.txt
https://raw.githubusercontent.com/CHEF-KOCH/WebRTC-tracking/master/WebRTC.txt
https://raw.githubusercontent.com/Dawsey21/Lists/master/main-blacklist.txt
https://raw.githubusercontent.com/EnergizedProtection/block/master/ultimate/formats/hosts.txt
https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/fakenews-gambling-porn-social/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/social/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/data/KADhosts/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/data/StevenBlack/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/data/UncheckyAds/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/data/add.2o7Net/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/data/add.Risk/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/data/add.Spam/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/data/tyzbit/hosts
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://gitlab.com/ZeroDot1/CoinBlockerLists/raw/master/hosts
https://raw.githubusercontent.com/anudeepND/blacklist/master/CoinMiner.txt
https://raw.githubusercontent.com/anudeepND/blacklist/master/adservers.txt
https://raw.githubusercontent.com/chadmayfield/pihole-blocklists/master/lists/pi_blocklist_porn_top1m.list
https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/spy.txt
https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/data/hosts/win10/spy.txt
https://raw.githubusercontent.com/jerryn70/GoodbyeAds/master/Hosts/GoodbyeAds.txt
https://raw.githubusercontent.com/mitchellkrogza/Badd-Boyz-Hosts/master/hosts
https://raw.githubusercontent.com/mitchellkrogza/The-Big-List-of-Hacked-Malware-Web-Sites/master/hacked-domains.list
https://raw.githubusercontent.com/piwik/referrer-spam-blacklist/master/spammers.txt
https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardMobileAds.txt
https://raw.githubusercontent.com/r-a-y/mobile-hosts/master/AdguardMobileSpyware.txt
https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer-filters.txt
https://raw.githubusercontent.com/vokins/yhosts/master/hosts
https://reddestdream.github.io/Projects/MinimalHosts/etc/MinimalHostsBlocker/minimalhosts
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_malvertising.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://smokingwheels.github.io/Pi-hole/allhosts
https://tspprs.com/dl/abuse
https://tspprs.com/dl/ads
https://tspprs.com/dl/cl1
https://tspprs.com/dl/crypto
https://tspprs.com/dl/gambling
https://tspprs.com/dl/malware
https://tspprs.com/dl/ransomware
https://tspprs.com/dl/spam
https://tspprs.com/dl/spotify
https://tspprs.com/dl/tracking
https://v.firebog.net/hosts/AdguardDNS.txt
https://v.firebog.net/hosts/Airelle-hrsk.txt
https://v.firebog.net/hosts/Airelle-trc.txt
https://v.firebog.net/hosts/BillStearns.txt
https://v.firebog.net/hosts/Easylist.txt
https://v.firebog.net/hosts/Easyprivacy.txt
https://v.firebog.net/hosts/Prigent-Ads.txt
https://v.firebog.net/hosts/Prigent-Malware.txt
https://v.firebog.net/hosts/Prigent-Phishing.txt
https://v.firebog.net/hosts/Shalla-mal.txt
https://v.firebog.net/hosts/static/SamsungSmart.txt
https://v.firebog.net/hosts/static/w3kbl.txt
https://www.dshield.org/feeds/suspiciousdomains_Low.txt
https://www.joewein.net/dl/bl/dom-bl-base.txt
https://www.malwaredomainlist.com/hostslist/hosts.txt
https://zerodot1.gitlab.io/CoinBlockerLists/list.txt
https://zerodot1.gitlab.io/CoinBlockerLists/list_browser.txt
https://zerodot1.gitlab.io/CoinBlockerLists/list_optional.txt
https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist

Il n’y a pas vraiment de spot officiel sur lequel elles seraient toutes regroupées (elles changent d’URL de temps en temps, surtout celles hébergées sur Github), mais certains maintiennent quand même des listes à jour:
https://www.google.com/search?q=pi-hole+lists

Quelques options non-disponibles via l’interface Web:

/etc/pihole/pihole-FTL.conf
BLOCKINGMODE=NULL
RESOLVE_IPV4=yes
RESOLVE_IPV6=yes
AAAA_QUERY_ANALYSIS=yes
IGNORE_LOCALHOST=no
PRIVACYLEVEL=0

Ensuite, dans la section Settings > DNS > Upstream DNS Servers, c’est le DNS de la passerelle OPNsense (un bon vieux Unbound) qui sera en charge de résoudre en dernier toutes les requêtes, en interrogeant directement les ROOTS.HINTS. Ici, pas question de passer par des intermédiaires comme un FAI/ISP, Google ou tout autre DNS soit-disant OpenSource ou anonyme:

Pi-Hole /!\ LOCAL /!\ Upstream Server

Au passage, on se fait plaisir aussi sur la partie DNSSEC. Par les temps qui courent, c’est prudent.

Tout ça pour en arriver là 🙂

2 réponses sur « DNS-Over-TLS, selfhosted ! »

Bonjour

Je viens de tomber sur cette page en cherchant à rendre mon pihole compatible DNS over TLS pour mon smartphone Android.
Ça fonctionne actuellement très bien via wifi mais pas vraiment via la 4G.

Est-ce qu’il est possible de ne pas avoir la VM1 en DMZ mais de s’y connecter en VPN ? Ou est-ce que le serveur haproxy et let’s encrypt doit être accessible via Internet obligatoirement (donc sans vpn) ?

Bonjour Franck,

Merci pour votre message. Vous pouvez tout à fait utiliser votre DNS interne au travers de votre VPN, sans avoir à exposer en DMZ le port 853 de votre routeur. Cela vous permettra de profiter du bloqueur de pubs en dehors de votre réseau.
Il faudra simplement bien veiller à renseigner l’IP de votre DNS dans la configuration de votre serveur VPN. Il faudra aussi y autoriser le routage entre votre réseau local et votre réseau VPN (différents en général), afin que vos clients VPN puissent joindre votre DNS interne.

A noter que malgré la très bonne intégration du client VPN dans Android, cette solution consommera probablement un peu plus de batterie que simplement le DNS-over-TLS (sans VPN donc), le client VPN mobilisant certainement plus de ressources que juste le client DoT.

Pour une solution sans VPN, vous l’avez mentionné, il faudra à minima un moyen de signer un certificat SSL (Let’s Encrypt ici), que ce soit pour du DNS over TLS (DoT), ou over HTTPS (DoH). HAProxy n’est nécessaire ici que pour héberger ce fameux certificat, et gérer le chiffrement/déchiffrement.
Sans HAProxy, il faudrait que le serveur DNS expose directement son port 853 ou 443 dans la DMZ (via du port-forwarding par exemple), et qu’il assure le chiffrement/déchiffrement SSL avec Let’s Encrypt ou une autre autorité de certification. Peut-être dans une prochaine bidouille!

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.