<?xml version="1.0" encoding="utf-8"?>
<entry title="Avoir son propre résolveur DNS ?">
<date>2013-12-04</date>
<content>
<p>Faut-il avoir son propre résolveur <wikipedia name="Domain Name System">DNS</wikipedia>, sur
sa machine (ou, au moins, sur son réseau local à soi) ? Question
compliquée à laquelle je réponds désormais <emphasis>oui</emphasis>,
en raison de l'intensification de la censure utilisant le DNS.</p>
<p>D'abord, un petit rappel : la quasi-totalité des activités sur
l'<wikipedia>Internet</wikipedia> commencent par une requête
<wikipedia name="Domain Name System">DNS</wikipedia>, une demande faite au
<emphasis><link local="resolveur-dns">résolveur</link></emphasis> DNS par les applications  « quelle est
l'<wikipedia>adresse IP</wikipedia> de
<computer>www.slate.fr</computer> ? » Le résolveur, après
interrogation des <emphasis><link local="serveur-dns-faisant-autorite">serveurs DNS faisant autorité</link></emphasis>
(gérés, dans le cas de ce nom de domaine, par la racine, par l'<wikipedia name="Association française pour le nommage Internet en coopération">AFNIC</wikipedia>
et par <wikipedia name="Slate (magazine)">Slate</wikipedia>), va répondre aux applications et
le reste de l'activité Internet pourra continuer. Comme tout commence
par le DNS, ce service est particulièrement tentant pour tous ceux qui
veulent censurer / dévier / détourner les activités de
l'utilisateur. Il y a donc une histoire déjà ancienne de tentatives de
<link local="dns-filtering">filtrage via le DNS</link> et une histoire
tout aussi ancienne de <link
url="http://www.afnic.fr/fr/l-afnic-en-bref/actualites/actualites-generales/6573/show/le-conseil-scientifique-de-l-afnic-partage-sur-le-filtrage-internet-par-dns.html">textes
expliquant pourquoi c'est une très mauvaise idée</link>. Le filtrage
via le DNS peut se faire dans le réseau, <link
local="detournement-racine-pekin">comme en Chine</link>. Mais le plus
courant est de le faire dans le résolveur. Cette machine est
typiquement gérée,
pour un accès Internet par un particulier, par son
<wikipedia name="Fournisseur d'accès à Internet">FAI</wikipedia>. En raison de la concentration du marché,
en contraignant les quatre ou cinq plus gros FAI à effectuer ce
filtrage, on pourrait frapper un bon nombre des
MM. Michu. Techniquement, c'est simple à faire, avec des systèmes <link
local="rpz-faire-mentir-resolveur-dns">comme RPZ</link>. Et cette voie
a déjà été suivie, en France <link local="arjel">par l'ARJEL</link>.</p>
<p>Une solution évidente à ce filtrage est d'avoir son propre
résolveur DNS, de ne plus compter sur celui du FAI. Cette solution a
deux défauts, le premier est temporaire : sa mise en œuvre est encore
trop complexe, comme <link local="changer-dns">déjà expliqué
dans un de mes articles</link>. La deuxième est moins visible : si
chaque utilisateur de l'Internet a son propre résolveur DNS, ils ne
partageront plus leur mémoire (leur « cache ») et la charge sur les
serveurs faisant autorité s'aggravera. Pour cette raison, je prônais
plutôt des systèmes comme <link
local="dnssec-trigger">dnssec-trigger</link> qui installaient un
résolveur local mais faisaient suivre les requêtes non résolues aux
résolveurs (et donc aux caches) des FAI. C'est une solution simple et
élégante (et qui permettait aussi de faire de la <link
local="ou-valider-dnsssec">validation DNSSEC</link> proprement). </p>
<p>Mais dnssec-trigger a une limite. Certes, avant d'utiliser les
résolveurs du réseau local comme relais, il les teste pour s'assurer
qu'ils transmettent les données DNSSEC correctement. Mais il ne teste
pas s'ils <link local="dns-menteur">mentent ou pas</link>. Si le
résolveur officiel du réseau local applique la censure, dnssec-trigger
ne pourra plus accéder aux données (si DNSSEC est utilisé, on aura un
code d'erreur, <computer>SERVFAIL</computer>, plutôt qu'une réponse
mensongère comme l'adresse IP 127.0.0.1 dans l'exemple ci-dessous,
mais cela ne change pas grand'chose ; DNSSEC protège contre le
détournement, pas contre le déni de service qu'est la censure).</p>
<p>Or, l'usage du DNS pour la censure se répand. Ainsi, le 28 novembre
2013, un tribunal français a ordonné <link
url="http://pro.clubic.com/legislation-loi-internet/telechargement-illegal/actualite-604000-allostreaming-consorts-justice-ordonne-blocage.html">la
censure par le DNS</link> de sites Web de diffusion de films<!---
Aussi
http://www.numerama.com/magazine/27646-dpstream-et-allostreaming-seront-bloques-en-france-en-theorie.html
-->. Et cette
censure semble effectivement appliquée. En testant depuis un très gros
FAI français, avec <wikipedia name="Dig (programme informatique)">dig</wikipedia> :
<code>
% dig +short @192.168.2.254 A alloshare.com          
127.0.0.1
</code>
Or, cette adresse IP bidon (127.0.0.1 désigne la machine locale, donc
ce mensonge renvoie votre navigateur Web vers votre machine) n'est pas
la vraie. Avec mon résolveur personnel :
<code>
% dig +short A alloshare.com 
204.236.239.5
</code>
Cela
vous semble exagéré de parler de censure, pour une affaire
essentiellement commerciale (les intérêts des ayant-trop-de-droits) ?
Sauf que cela <link
url="https://hackurx.wordpress.com/2013/11/29/ca-commence-comme-ca/">commence
comme ça</link> puis, une fois que l'outil est au point, on pourra de
la même façon demander la censure de n'importe quel nom qui déplait
aux autorités. Il est donc normal que les citoyens se détournent des
résolveurs DNS menteurs et veuillent configurer leur propre résolveur.</p>
<p>La situation technique n'est pas aujourd'hui tellement meilleure 
qu'à l'époque de <link local="changer-dns">mon précédent article sur
le changement de résolveur</link>. Mais le problème devenant plus
crucial, il faut quand même se lancer.</p>
<p>Donc, d'abord, pour les systèmes que je connais le mieux, les
<wikipedia>Unix</wikipedia>. Il faut 1) installer le logiciel
résolveur 2) configurer la machine pour l'utiliser et surtout 3) faire
en sorte que <wikipedia name="Dynamic Host Configuration Protocol">DHCP</wikipedia> ne vienne pas écraser ce
réglage. Pour le logiciel résolveur, on a plusieurs choix, notamment
<wikipedia>BIND</wikipedia> et <wikipedia xml:lang="en" name="Unbound (DNS Server)">Unbound</wikipedia>,
disponibles sous forme de <wikipedia name="Paquet (logiciel)">paquetage</wikipedia> dans
n'importe quel Unix. Un
exemple de configuration BIND pour un résolveur, validant avec DNSSEC
pendant qu'on y est :
<code>
options {
	// N'écouter que sur l'interface locale. Autrement, faites
	// attention à interdire l'accès aux machines non-locales, pour
	// ne pas faire un résolveur ouvert.
        listen-on {127.0.0.1;};
        dnssec-enable yes;
        dnssec-validation yes;
};
trusted-keys {
           "." LA CLÉ DNSSEC DE LA RACINE EST EN GÉNÉRAL DISTRIBUÉE AVEC BIND (fichier bind.keys)
};
</code>
Et pour Unbound :
<code>
server:
    interface: 127.0.0.1
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
</code>
Pour récupérer de manière sûre la clé de la racine avec Unbound, le
plus simple est un <computer>unbound-anchor -a "/var/lib/unbound/root.key"</computer>.
Une fois le résolveur démarré, testez avec dig qu'il peut résoudre les
noms :
<code>
% dig @127.0.0.1 A www.techn0polis.net 
...
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
...
;; ANSWER SECTION:
www.techn0polis.net.	2917 IN	CNAME gpaas6.dc0.gandi.net.
gpaas6.dc0.gandi.net.	1156 IN	A 217.70.180.136
...
;; SERVER: 127.0.0.1#53(127.0.0.1)
...
</code>
Testez aussi depuis des machines extérieures que votre résolveur ne
répond <emphasis>pas</emphasis> aux machines extérieures. Autrement,
c'est un <link local="fermer-les-recursifs-ouverts">résolveur
ouvert</link>, ce qui est très dangereux. Si vous voulez rendre
accessible votre joli résolveur depuis tout votre réseau local, vous
devez également écouter sur les adresses IP du réseau local (et bien
utiiser le contrôle d'accès de votre serveur -
<computer>acl</computer> dans BIND et <computer>access-control:</computer> dans
Unbound - pour ne pas devenir un
résolveur ouvert).
</p>
<p>Une fois que c'est fait, configurez votre machine pour interroger
le serveur/résolveur en question. Mais attention, le problème est que
<wikipedia name="Dynamic Host Configuration Protocol">DHCP</wikipedia> vient souvent dans votre dos changer ce
réglage. Donc, simplement éditer
<computer>/etc/resolv.conf</computer>, comme on le lit parfois sur des
forums de neuneus, n'est pas suffisant. Il faut modifier la
configuration du client DHCP. Cela dépend du client mais, par exemple,
sur une <wikipedia>Debian</wikipedia>, éditer
<computer>/etc/resolvconf/resolv.conf.d/head</computer> pour y
mettre :
<code>
nameserver 127.0.0.1
</code>
suffit. Une fois que c'est fait, vous pouvez tester avec dig sans
indiquer <computer>@127.0.0.1</computer> et la ligne
<computer>SERVER</computer> dans la sortie doit vous indiquer quel
serveur vous utilisez.</p>
<p>Pour <wikipedia>Mac OS X</wikipedia>, je n'ai pas d'expérience de
ce système mais je suggère l'<link
url="http://smyck.net/2010/12/30/your-own-dns-server/">article de
hukl</link>. Sinon, Ludovic Hirlimann propose « installer <wikipedia>MacPorts</wikipedia> 
puis <computer>sudo port install unbound</computer> et c'est tout ».
Experts OS X, si vous avez d'autres idées ?</p>
<p>Et pour <wikipedia name="Microsoft Windows">Windows</wikipedia> ? 
Apparemment, Unbound tourne sur Windows (si quelqu'un a une expérience
d'utilisation à raconter...) Je ne connais pas assez Windows pour le reste
mais je vous suggère une solution pour la partie « configurer sa
machine pour accéder au résolveur local ». Un certain nombre de services
commerciaux vous fournissent des résolveurs alternatifs, pour accéder
plus rapidement à <link local="debrider-avec-dns">certains services
bridés comme YouTube</link>. Je ne vous dis pas d'utiliser ces
résolveurs, qui sont aussi menteurs (même si c'est pour la bonne
cause) mais tous viennent avec une documentation, conçue pour un large
public, indiquant comment changer de résolveur. Par exemple, c'est le
cas de la <link url="https://unlocator.com/setup/">documentation de
Unlocator</link>.</p>
<p>Enfin n'oubliez pas que, si vous avez plusieurs machines sur votre
réseau local, il n'est pas nécessaire qu'elles aient toutes
leur propre résolveur, vous pouvez mettre un seul résolveur partagé.</p>
<p>Quelle sera la prochaine étape de la course aux armements entre les
censeurs et les utilisateurs de l'Internet ? Peut-être d'essayer de
faire <link local="port53-filtre">filtrer le port 53</link>. En
attendant, voici d'autres documents sur le thème de cet article :
<enum>
<item><link url="https://calomel.org/unbound_dns.html">Installation et
configuration de Unbound</link>.</item>
<item><link
	  url="http://www.ellendhel.net/article.php?ref=2011+10+20-0">Configuration
d'Unbound sur Slackware</link> (en français)</item>
<item><link
	  url="http://korben.info/installer-serveur-dns-unbound.html">Unbound,
notamment sur Windows</link></item>
</enum></p>
</content>
</entry>



