Résolution de noms

Un article de Toulouse Sans Fil, un réseau wifi libre sur Toulouse.

Image:Bloc-notes.png Cette page décrit une partie des spécifications techniques du réseau TSF. Elle est actuellement en cours de rédaction.
L'utilisation de la page de discussion est fortement conseillée.

Accueil | Technique | Specs | Résolution de noms

Proposition de Drien : Résolution de noms avec le tandem dnsmasq/nameservice

Objectifs :

  • Sur la TSFbox, permettre l'utilisation directe de noms de machine sans l'extention tsf,
  • Permettre l'utilisation des noms au delà de la TSFbox, sur le réseau local de l'utilisateur par exemple,
  • Permettre conjointement la résolution de noms de domaine sur Internet (solution globale).

Le plugin nameservice d'OLSR réécrit régulièrement le fichier /etc/hosts en y ajoutant les informations récoltées sur les autres noeuds. Le logiciel dnsmasq, qui est un serveur/relais DNS léger, peut lire ce fichier et répondre aux requètes DNS générées par les clients du réseau local.

/etc/olsrd.conf, section du plugin nameservice

LoadPlugin "olsrd_nameservice.so.0.2"
{
        PlParam "name"          "drien"                 # node name
        PlParam "suffix"        ".tsf"                  # suffix for OLSR nodes
        PlParam "hosts-file"    "/etc/hosts"            # read by dnsmasq
        PlParam "resolv-file"   "/etc/resolv.olsr"      # Writen by daemon
}

/etc/dnsmasq.conf

domain-needed
bogus-priv
localise-queries
local=/tsf/
domain=tsf
expand-hosts

note de ouinouin les options bogus-priv et domain-needed sont commentées dans mes confs suite aux conseils de galaxian

Créer un fichier /etc/resolv.dnsmasq contenant la ligne

nameserver <l'ip de votre serveur de nom habituel>

et lancer dnsmasq avec l'option -r /etc/resolv.dnsmasq. C'est cette partie qui va permettre la résolution de noms Internet.

Indiquer l'adresse du serveur DNS, qui est maintenant la TSFbox. Pour la TSFbox, le fichier /etc/resolv.conf ressemblera à

search tsf
nameserver 127.0.0.1

Pour un client Linux du réseau local, remplacer 127.0.0.1 par l'adresse de la TSFbox.

Quelques remarques...

  • L'inconvénient majeur de cette solution (ou du moins, de la solution en l'état) est que dnsmasq ne relit pas le fichier /etc/hosts à chaque modification de ce dernier par olsrd-nameservice ; la lecture du fichier ne se fait qu'au lancement de dnsmasq ou sur réception du signal HUP. Il faut donc lancer un kill -HUP <pid> soit cycliquement par exemple avec cron, soit sur modificaction du fichier et c'est plus tendu. Peut-être qu'une telle action peut être programmée dans la config de nameservice... à voir.
  • Il semblerait que nameservice ne puisse véhiculer plus d'une adresse par nom de noeud. Si olsrd tourne sur deux interfaces (typiquement wifi et tunnel) avec deux adresses différentes (typiquement 10.31.x.y et 10.254.i.j), seule l'adresse de la première interface passée dans /etc/olsrd.conf sera présente dans le fichier /etc/hosts, donc dans les tables DNS de dnsmasq.
  • Note de grompf Sauf erreur de ma part, concernant les adresses multiples : on ne s'adresse a une machine que via son adresse principale. (cf. la RFC d'OLSR, les adresses secondaires ne sont qu'une facilité de routage). La precedente limitation ne me semble pas en être une.
Interface "eth1" "tap0"
  • Le fichier /etc/resolv.conf est écrasé à chaque boot d'OpenWRT avec des paramètres de la NVRAM. La variable NVRAM lan_dns doit contenir l'adresse du serveur de nom (127.0.0.1) mais je n'ai pas trouvé la variable contenant le nom du réseau (pour la ligne "search tsf") de /etc/resolv.conf. Dans mon cas, je réécris le fichier à chaque boot comme ça :
echo "search tsf" > /etc/resolv.conf
echo "nameserver 127.0.0.1" >> /etc/resolv.conf