5.2 KiB
+++ author = "Yann Verry" categories = ["dns"] date = 2022-01-15T23:27:45Z description = "NXDOMAIN sur les trackers !" draft = false image = "lie_to_me.png" slug = "rpz" tags = ["dns"] title = "DNS RPZ: Mentir proprement"
+++
Faire un DNS menteur ce n'est pas quelque chose de nouveau. Ça éxiste depuis très longtemps. Des épisodes très connu par la loi avec la célèbre main rouge à rendu public cette pratique. Une liste est fourni aux quatre plus gros ISP français.On entend régulièrement parler de cette mesure "de protection" à chaque mesure de blocage demandé par des majors, association, terrorisme ...
Mais sinon, on peut en faire des choses pour nous servir à nous ?
Oui biensur ! comme filtrer en amont tout ce qui publicité, tracker de pub, télémétrie un peu trop bavarde ou encore la communication de votre caméra estampillé chinoisium à 15€ acheté chez aliexpress qui est bien bien trop bavarde sur un truc qui fini en .cn. Ok, ok, taper sur la chine est si facile mais vous avez compris l'idée.
Ce n'est pas une solution magique loin de là. Les sites ou vous êtes le produit ne se font pas bloquer car le contenu est directement servi par les serveurs de pub.
Sous le capot
Tout d'abord il faut posséder son propre serveurs récursif chez sois. C'est facile avec un mini ordinateur, une VM sur votre freebox delta ou même en local sur votre ordinateur.
Plusieurs méthodes éxistent comme l'override de la zone mais ça casse DNSSEC ce qui est mal.Dans unbound on va forcer un/des enregistrements via les options local-data ou local-zone.Une zone complète ou j'avais plusieurs milliers de lignes :
wc -l /etc/unbound/unbound-nxdomain.blacklist
33073 /etc/unbound/unbound-nxdomain.blacklist
avec dedans des choses comme ceci :
local-zone: "ibs.lgappstv.com" always_nxdomain
local-zone: "eic-ngfts.lge.com" always_nxdomain
local-zone: "s.sh" always_nxdomain
local-zone: "m2.ai" always_nxdomain
local-zone: "cw.nu" always_nxdomain
local-zone: "6m.pl" always_nxdomain
local-zone: "ip.ro" always_nxdomain
local-zone: "rs.sh" always_nxdomain
Mais c'est pas ouf non ? Non, pas du tout.
Il est donc l'heure d'avoir quelque chose de plus solide, standard qui va fonctionner partout. Une pointure s'y colle côté IETF pour faire le boulot, à savoir Paul Vixie (entre autres).
L'idée est donc de créer une zone DNS presque classique qui va contenir tout ce qu'on souhaite modifier avec la possibilité de renvoyer du NXDOMAIN, une réponse de notre choix comme ::1 ou le legacy 127.0.0.1 pour par exemple éviter des messages d'erreur comme le fait ma TV LG. C'est donc modulable en fonction de ce qu'on souhaite
Si on fait les choses bien on va catégoriser plusieurs listes et les aligner une à une dans la configuration.
Cette zone se matérialise comment ? Voici le fichier de la zone en question, un petit clin d'œil :
; Beginning of the zone, some mandatory values
$TTL 1H
@ SOA lie.to.me. red.pills (42 2h 30m 30d 1h)
NS blue.pills.
lgtvsdp.com CNAME .
*.lgtvsdp.com CNAME .
On va donc ici dire de répondre NXDOMAIN grâce au points final.
Comment distribuer cette zone au plus grand nombre ? J'utilise unbound et il permet de récupérer ses zones d'une manière simple à savoir HTTPS. C'est du DNS la seconde plus évidente est de faire une zone DNS récupérable via un transfert de zone (IXFR).J'ai préféré HTTP car plus simple dans mon setup actuel. La mise à jour est plus simple. C'est donc parti, je fait un nouveau vhost
avec une belle page indéxé qui contient plusieurs fichiers de RPZ
Unbound side
Côté DNS récursif, ici unbound il faut tout d'abord activer deux modules :
server:
module-config: "respip validator iterator"
Et ensuite on déclare en fin de fichier les multiples RPZ souhaités :
rpz:
name: "oisd"
url: https://rpz.oisd.nl
rpz-log: yes
rpz-log-name: "rpz-oisd"
rpz:
name: "youtube"
url: https://rpz.verry.org/youtube.zone
rpz-log: yes
rpz-log-name: "rpz-youtube"
rpz:
name: "adaway"
url: https://rpz.verry.org/adaway.zone
rpz-log: yes
rpz-log-name: "rpz-adaway"
rpz:
name: "easylist-full"
url: https://rpz.verry.org/easylist.zone
rpz-log: yes
rpz-log-name: "rpz-easylist"
rpz:
name: "easylist-fr"
url: https://rpz.verry.org/easylist_fr.zone
rpz-log: yes
rpz-log-name: "rpz-easylistfr"
Nous avons plusieurs section, pour chaque mention de rpz une configuration différente qui sera évalué de haut en bas.On lui donne un petit nom, l'url pour la récupérer. Afin d'avoir du logging on indique le nom à afficher ce qui sera pratique pour savoir quel RPZ rentre en action.
Côté logging ça donne quelque chose du genre :
info: RPZ applied [rpz-adaway] currency.prebid.org. nxdomain
Et voila !
La suite ?
Automotiser la génération des fichiers situé sur rpz.verry.org. Aujourd'hui j'ai récupéré plusieurs listes un peu n'importe comment, fait des grep/sed/awk
ce qui n'est pas du tout optimal, ensuite il faut créditer les sources cleaner les doublons et ajouter une petite cron pour faire bien dans un projet git