Si comme moi vous êtes situé dans une zone peu déservie par le réseau ADSL, toutes les petites astuces peuvent être appréciables pour améliorer les performances de vos connexions. Un des éléments faciles à améliorer est le temps de résolution des noms de domaines en IP. Il est possible de mettre en place un daemon DNS complet comme Bind pour utiliser son cache, mais mieux vaut se tourner vers un daemon dédié à cet effet, comme pdnsd.

bandwidth-savings-with-pdnsd.jpg


C'est quoi le problème ?

Pour résumer rapidement, quand vous tapez www.unsite.com dans votre navigateur, il est nécessaire de transformer ce nom de domaine en une adresse IP, on appelle ça une résolution DNS.
Ce processus va très vite, mais sur une connexion de mauvaise qualité, il s'agit d'une perte de temps non négligeable.

Vous pouvez aisément voir le temps qu'il faut pour réaliser une résolution DNS avec la commande dig :

dig www.google.com

Qui vous donnera en plus du résultat le temps mis à résoudre le nom :

...
;; Query time: 121 msec
...

Ce temps de résolution est variable, chez moi de l'ordre de 110ms en général... C'est très bref me direz-vous, mais sur un site qui demande 1 seconde (bon d'accord, il n'y a pas beaucoup de sites aussi rapides) pour être chargé, c'est quand même 10% du temps total.

Pour faire simple, le but de pdnsd est de demander la résolution à un serveur DNS paramétrable, puis de stocker le résultat dans son cache. Ainsi, lors de la prochaine demande de résolution sur un nom déjà en cache, cette résolution sera presque instantanée.

La procédure qui suit a été réalisée sous Debian Squeeze.


Installation

apt-get install pdnsd

Si jamais l'écran suivant apparaît, spécifiez une configuration manuelle.

pdnsd-install-1.png

Et voilà pour l'installation.


Configuration

On attaque avec l'édition du fichier /etc/pdnsd.conf. Il permet de configurer le comportement global du daemon, les serveurs DNS à interroger pour les résolutions, et les éventuels domaines à ne pas résoudre.

La configuration globale par défaut est correcte, inutile de la modifier :

global {
        perm_cache=1024;
        cache_dir="/var/cache/pdnsd";
        run_as="pdnsd";
        server_ip = 127.0.0.1;
        status_ctl = on;
        paranoid=on;
//      query_method=tcp_udp;   // pdnsd must be compiled with tcp
                                // query support for this to work.
        min_ttl=15m;       // Retain cached entries at least 15 minutes.
        max_ttl=1w;        // One week.
        timeout=10;        // Global timeout option (10 seconds).

        // Don't enable if you don't recurse yourself, can lead to problems
        // delegation_only="com","net";
}

Les serveurs DNS à utiliser se présentent ainsi :

server {
        label = "Google Public DNS";
        root_server=on;
        ip =    8.8.8.8
        ,       8.8.4.4
        ;
        timeout = 5;
        uptest = query;
        interval = 30m;      // Test every half hour.
        ping_timeout = 300;  // 30 seconds.
        purge_cache = off;
        exclude = .localdomain;
        policy = included;
        preset = off;
}

Vous pouvez indiquer les IPs des serveurs DNS de votre FAI, ceux de OpenDNS, ceux de Google, peu importe. Vous pouvez donner un nom, optionnel, à votre liste de serveurs avec l'option "label". Pensez à terminer chaque ligne par un point-virgule.

Éditons maintenant le fichier /etc/default/pdnsd pour qu'il ressemble à ça :

# do we start pdnsd ?
START_DAEMON=yes
# auto-mode, overrides /etc/pdsnd.conf if set [see /usr/share/pdnsd/]
#AUTO_MODE=
# optional CLI options to pass to pdnsd(8)
START_OPTIONS=

Dans ce fichier, nous activons le daemon avec "Start_DAEMON=yes", et indiquons que nous voulons utiliser notre propre fichier /etc/pdnsd.conf en commentant la ligne "AUTO_MODE"

Enfin, si vous utilisez DHCP, il faut modifier légèrement la configuration du daemon DHCP, en éditant le fichier /etc/dhcp/dhclient.conf, pour lui indiquer de ne pas demander de serveurs DNS et d'utiliser l'adresse 127.0.0.1 pour la résolution de noms.
Pour cela trouvez la ligne ci-dessous et décommentez-la en enlevant le caractère # en début de ligne :

prepend domain-name-servers 127.0.0.1;

Reste à démarrer pdnsd avec :

/etc/init.d/pdnsd start

Et voilà, maintenant les requêtes DNS seront effectuées une première fois, puis mises en cache pour être servies immédiatement, pour preuve un nouveau :

dig www.google.com

Vous donnera un splendide :

...
;; Query time: 0 msec
...

Pour obtenir quelques informations sur votre configuration et le cache DNS, la commande suivante est utile :

pdnsd-ctl status

C'est toujours ça de gagné !