1° IntroductionLe DNS ou Domain Name Server (Serveur de Nom de Domaine) permet de faire la corrélation entre des noms de serveur et leur adresse IP.
Sur Internet, toutes les machines sont identifiées par leur adresse IP qui est unique dans tout le réseau. Malheureusement pour un humain, il est plus simple de se souvenir de "www.google.com" que de 74.125.77.147 !! D'où la présence nécessaire de serveurs DNS.
Le cache DNS permet de garder en mémoire le résultat des requètes DNS accélérant ainsi les transmissions sur le réseau.
WindowsXP dispose par défaut d'un cache DNS.
Ce n'est pas le cas de Linux (par défaut). Ainsi à chaque accès à une page web par exemple (mais c'est aussi valide pour tout les accès, email, irc, ftp, im, ...etc) , votre machine Linux doit d'abord accéder au DNS pour connaitre l'adresse IP du serveur.
Si vous êtes dans un réseau local (Intranet) qui dispose de son propre DNS, ou sur un accès à haut débit (et que le DNS de votre ISP est rapide et pas trop surchargé) cela n'est pas vraiment un soucis.
Par contre, si vous avez un ordinateur portable, que vous connectez sur différent réseaux plus ou moins lent, les accès DNS peuvent avoir un impact non négligeable sur la navigation.
J'ai constaté ca lorsque j'étais au Mexique sur une liaison Wifi qui devait plafonner à 10Mb/s, en utilisant Google Chrome. J'accédais à une page web, puis 10 min plus tard je rafraichissais la page, alors je voyais dans le bas de Chrome une mention "resolving name" (qui correspond à un accès DNS) et qui durait plusieures secondes.
A noter que les navigateurs garde l'adresse IP du site en mémoire, le temps que la page soit chargé mais qu'une page peux contenir des éléments provenant de plusieurs serveurs (images, pubs, flash, ...) impliquant une résolution de nom à chaque fois !!
A l'opposé, à la maison, j'utilise un routeur qui sert aussi de DNS et de cache. Dans ce cas ce qui suit ne m'apporte rien ...
Comment savoir si vous avez déjà un cache DNS dans votre réseau ?Assez simple, il suffit de faire une interrogation du DNS avec une adresse que vous utilisez normalement pas ! Prenons par exemple : ietf.org (qui est le site de l'Internet Task Force, organisme sensé géré l'Internet)
La commande "dig" (sous linux) intérroge votre DNS par défaut
ericc:~# dig ietf.org
; <<>> DiG 9.6.1-P2 <<>> ietf.org
;; global options: +cmd
;; Got answer:
;; - >>HEADER<<- opcode: QUERY, status: NOERROR, id: 37012
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 6, ADDITIONAL: 6
;; QUESTION SECTION:
;ietf.org. IN A
;; ANSWER SECTION:
ietf.org. 1800 IN A 64.170.98.32
;; AUTHORITY SECTION:
ietf.org. 1746 IN NS ns1.ams1.afilias-nst.info.
ietf.org. 1746 IN NS ns1.hkg1.afilias-
nst.info.
ietf.org. 1746 IN NS ns1.mia1.afilias-nst.info.
ietf.org. 1746 IN NS ns1.sea1.afilias-
nst.info.
ietf.org. 1746 IN NS ns1.yyz1.afilias-nst.info.
ietf.org. 1746 IN NS ns0.ietf.org.
;; ADDITIONAL SECTION:
ns1.ams1.afilias-nst.info. 2665 IN A 199.19.48.79
ns1.ams1.afilias-nst.info. 2665 IN AAAA 2001:500:6::79
ns1.hkg1.afilias-nst.info. 2665 IN A 199.19.51.79
ns1.hkg1.afilias-nst.info. 2665 IN AAAA 2001:500:9::79
ns1.sea1.afilias-nst.info. 2665 IN A 199.19.50.79
ns1.sea1.afilias-nst.info. 2665 IN AAAA 2001:500:8::79
;; Query time: 285 msec
;; SERVER: 192.168.28.251#53(192.168.28.251)
;; WHEN: Thu Jan 21 09:13:31 2010
;; MSG SIZE rcvd: 323
(j'ai mis en jaune les informations importantes)
On voit que le temps de réponse est de 285msec.
Vous relancer la même commande une deuxième fois, si le temps de réponse est franchement inférieur (plus de 100 fois) alors vous avez surement déjà un cache dans votre réseau. Chez moi par exemple le temps de réponse à la deuxième interrogation est de 2msec
2° SolutionComme souvent pour ce genre de problème sous Linux, il existe plusieurs solutions plus ou moins efficaces, plus ou moins simple à mettre en place.
Je vais vous en présenter une basé sur
dnsmasq parce quelle me semble simple à mettre en œuvre. Je ne garanti pas que cela soit la plus efficace ou la meilleure.
Si vous pensez avoir mieux, n'hésitez pas à nous présenter votre solution.
dnsmasq est un petit logiciel spécialement fait pour résoudre ce genre de problème pour les utilisateurs nomades avec des adresses IP non fixe (mais fonctionne aussi si vous avez une IP fixe !!)
- Tout d'abord installer le package qui est disponible sous Debian et Ubuntu :
pour les utilisateurs d'Ubuntu
$sudo apt-get install dnsmasq
le paquet fait 13.5kB ! autrement dit c'est vite fait
- Ensuite il faut éditer le fichier de configuration : /etc/dnsmasq.conf
Le fichier est très long car il contient énormément de commentaires. Recherchez la ligne contenant "listen-address="
(chez moi dans la version actuelle, cela correspond à la ligne 90)
supprimez le "#" en début de ligne et tapez :
listen-address=127.0.0.1
cette modification permet à dnsmasq d'écouter les requêtes DNS interne de la machine
sauvegardez le fichier
- Si votre machine est configuré avec une adresse IP fixe, vous pouvez passer au point suivant.
Si vous utilisez un DHCP, vous devez éditer le fichier de configuration du client DHCP pour lui dire d'utiliser l'adresse interne en premier pour les requêtes DNS.
En effet, lorsque votre machine reçois une nouvelle adresse IP du serveur DHCP, celui ci envois aussi les adresses IP des serveurs DNS qui sont écrit dans le fichier "/etc/resolv.conf".
Recherchez la ligne :
#prepend domain-name-servers 127.0.0.1;
et supprimez le "#"
Ceci aura pour effet de rajouter l'adresse IP interne en tête des serveurs DNS dans le fichier "resolv.conf" (et donc deviendra le DNS par défaut)
- On va en dernier lieu éditer le fichier : /etc/resolv.conf
Ce fichier est utilisé par votre machine pour connaitre l'adresse IP des serveurs DNS. Si vous êtes en DHCP, il est recréé à chaque fois que vous recevez une adresse du serveur DHCP.
Ce fichier ne contient en général que quelques lignes, comme par exemple :
search < le domaine de votre ISP >
nameserver <@IP du 1er DNS de votre ISP>
nameserver <@IP du DNS de secours de votre ISP>
On va simplement ajouter avant la 1ere ligne "nameserveur", la ligne suivante :
nameserver 127.0.0.1
Cette manipulation est obligatoire si vous avez une adresse IP fixe !
Si vous êtes en DHCP et que vous avez effectuez la modification du client DHCP, rebooter la machine ou simplement redémarrer le network-manager, produira le même effet.
- Finalement, on va redémarrer dnsmasq pour qu'il prenne en compte nos modification (il a été automatiquement démarrer après l'installation)
ericc:~# /etc/init.d/dnsmasq restart
Et voila, c'est fini !
Faites 2 fois un "dig" vers une adresse web pour voir le résultat :
ericc:/etc# dig ietf.org
; <<>> DiG 9.6.1-P2 <<>> ietf.org
;; global options: +cmd
;; Got answer:
;; - >>HEADER<<- opcode: QUERY, status: NOERROR, id: 30798
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;ietf.org. IN A
;; ANSWER SECTION:
ietf.org. 1787 IN A 64.170.98.32
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Jan 21 15:20:13 2010
;; MSG SIZE rcvd: 42
On voit que mon DNS est maintenant 127.0.0.1 soit l'adresse interne de ma machine et que le temps de réponse (à la deuxième demande) est de 0 msec

difficile de faire plus vite ! et ce peux importe la qualité de ma connexion internet
3° Informations additionellesCombien de temps les informations sont elles retenue par dnsmasq ? Les informations sont stockés en mémoire. Par défaut, dnsmasq retient les 150 dernières requêtes. Il est possible d'augmenter ou diminuer cette limite en modifiant le paramètre "cache-size" dans le fichier de configuration /etc/dnsmasq.conf
Donc chaque nouvelle requête supprime la plus ancienne si vous avez atteint le nombre max de requêtes.
Autrement, les informations qui proviennent du "vrai" DNS à dnsmasq contiennent une information appelé "Time To Live" (TTL) ou "Temps de vie". Cette information définie la durée de validité de l'information au dela de laquelle dnsmasq devra la supprimé de son cache.
Comment vider le cache de dnsmasqParfois il peux être utile de vider le cache, par exemple lorsque l'adresse IP d'un serveur vient de changer mais que dnsmasq continue de vous fournir l'ancienne adresse (et que vous n'avez pas la patience d'attendre).
le cache de dnsmasq étant en mémoire, il suffit simplement de le redémarrer pour vidé son cache :
/etc/init.d/dnsmasq restart
nota : vider le cache local de la machine n'est pas la solution définitive à ce type de soucis ! Le DNS de votre ISP doit déjà avoir la bonne information pour pouvoir la transmettre à dnsmasq
Utiliser dnsmasq pour filtrer les pubs dans les pages webVoici une utilisation intéressante de dnsmasq, bien plus efficace que tout les bloqueurs de pub que pourriez avoir dans votre navigateur.
La seule chose à faire est de définir le serveur d'où viennent les publicités. Par exemple, prenons le domaine "doubleclick.net" qui est un gros fournisseur de page de pub.
Dans le fichier /etc/dnsmasq.conf, vous ajoutez la ligne :
address=/doubleclick.net/127.0.0.1
Ainsi toutes les requêtes vers "doubleclick.net" seront revoyés vers votre machine ... qui ne pourras pas les fournir et donc plus de pub !!
(cette ligne existe déjà dans le fichier de configuration mais elle est commenté)
Si vous voulez bloquer plusieurs noms de domaine, vous pouvez mettre plusieures lignes "address=" ou mettre les domaines à la suite les uns des autres
address=/doubleclick.net/this-domain-for-sale.com/127.0.0.1
dnsmasq peu aussi servir de serveur DHCP ainsi que BootFTP ou PXE ou TFTP (protocoles utilisé pour démarré une machine à partir du réseau) mais la configuration de ces services sort du cadre de cette explication.
Je vous revois à la man page et/ou aux commentaires du fichier de configuration qui sont très clair
Si vous utilisez une machine Linux comme passerelle vers Internet, il est préférable d'installer dnsmasq sur celle-ci et de pointer les DNS de toutes les machines de votre réseau vers celle-ci
ericc