+++

title = "Faire mentir un serveur DNS"
date = 2011-08-30
aliases = [ "post/2011/08/30/Faire-mentir-un-serveur-DNS"]
[taxonomies]
tags = [ "internet", "dns" ]
+++

Tout ce qu'il faut pour passer pour un pédo-nazi terroriste…

<!-- more -->

entir, c'est mal. Tout le monde te le dit tout le temps, faut pas mentir. Ouais, ptet bien, mais des fois, t'as besoin de cacher des choses, d'empêcher les méchants de regarder tes petits trafics ou simplement de protéger ton réseau domestique des sociétés américaines qui ne te veulent que du bien en collectant les infos personnelles de ta grand-mère.

Et un bon moyen d'empêcher les innocents de se faire espionner, c'est tout simplement de les empêcher d'accéder à un certains nombres de services…

# Petit mot sur les vues

Les vues sont un mécanisme de bind qui permet de servir une zone différente (donc un/des enregistrements différents) en fonction de la source de la requête ou de la destination de la requête.

C'était très pratique dans le vieil Internet v4 pour répondre des choses différentes côté LAN et côté WAN pour une zone que tu gères, comme l'adresse d'un serveur par exemple : il est évident que si l'on indique la même chose en interne et en externe, soit Internet va voir une adresse LAN privée et ne pourra pas la joindre, soit les machines du LAN vont voir la propre adresse WAN de la connexion et ne vont pas arriver à joindre la machine directement…

Et bien entendu, on peut se servir de cette mécanique pour faire des choses super sales, comme ne pas servir une zone pour certains résolveurs. On pourrait par exemple empêcher les résolveurs d'Orange d'accéder à une zone ou leur répondre de la merde chaque fois qu'ils demandent…

La méthode étant super fastidieuse et pas forcément toujours intéressante parce que trop facilement contournable, on va plutôt se concentrer sur des mensonges plus simples à raconter.

# À la bourrin

Quand on a un serveur DNS qui fait du cache, la première chose est de s'assurer que les clients concernés (qui s'en servent comme résolveur) ne peuvent pas accéder aux DNS sur Internet (genre le trop célèbre `8.8.8.8`). Parce que sinon, tu auras beau te démener autant que tu veux, ça ne servira à rien du tout ! Une fois que c'est fait, pour empêcher complètement la résolution d'une zone, la méthode de bourrin consiste à déclarer qu'on en ait le maître :

```
zone "gouv.fr" {
    type master;
    file "bidon";
};
```

Où évidemment `bidon` est un fichier de zone parfaitement valide mais qui renvoit localhost pour toutes les requêtes (`/etc/bind/db.empty` est un bon candidat sous Debian).

Le souci, c'est que ce n'est pas bien souple et c'est surtout encore une fois très fastidieux parce qu'il faut répéter le processus sur chaque zone qu'on souhaite bloquer. Donc pour faire des choses un peu performante, c'est relativement lourd et on y passe des plombes, puisqu'il faut créer une zone pour chaque… Sans compter le fait qu'il faut répéter l'opération sur chaque résolveur…

# Plus subtil

Du coup, les derniers développement de bind ont amené une méthode un peu plus subtil, j'ai nommé RPZ (response policy zone). Là, on est dans l'artillerie lourde puisqu'il suffit d'ajouter un nom DNS dans une seule zone pour empêcher complètement sa résolution avec la réponse NXDOMAIN (le domaine n'existe pas…). C'est quand même vachement plus propre que de répondre systématiquement localhost.

Tout cela est d'ailleurs d'une facilité déconcertante à mettre en place, à maintenir et à répliquer puisqu'il s'agit d'une vulgaire zone ! On commence par ajouter la nouvelle instructions dans les options :

```
options {
    response-policy { zone "gofuckyourmoth.er"; };
…
}
```

Puis on crée la référence de la zone en question :

```
zone "gofuckyourmoth.er" {
    type master;
    file "fuckyouapple";
};
```

Le fichier `fuckyouapple` doit alors contenir une zone valide où l'on place simplement des enregistrements CNAME bidon…

```
$TTL 36H

@   SOA gofuckyourmoth.er. robert.oot.fr (13 6h 10m 15d 30m)
    NS gofuckyourmoth.er.

; on renvoit simplement NXDOMAIN pour apple.com
apple.com    CNAME    .
*.apple.com    CNAME    .

; ou carrément pour .ru !
*.ru    CNAME    .
```

Et toutes les possibilités sont ouvertes puisqu'on peut interdire tout ou presque et très facilement en prime.

On peut même faire plus vicelard en renvoyant une autre adresse que celle demandée :
```
*.megasexxx.com    CNAME    disney.fr.
```

Et pour vérifier que ça marche, suffit de demander les résolutions :

```
$ dig +short @localhost www.megasexxx.com
disney.fr.
68.71.220.121
```

Voilà, maintenant toi aussi tu peux transformer ton réseau domestique en succursale de la Syrie…
