\documentclass{article}
\title{ Serveur DNS}
\author{Julien Danjou \\jdanjou@linuxenrezo.org}
\date{}
\begin{document}
\maketitle


        Pour convertir les noms d'ordinateurs en adresses IP, la m\'ethode la plus simple consiste \`a tenir \`a jour un fichier hosts contenant les adresses IP suivies des noms de chaque machine composant le r\'eseau.\\
	\indent{En voici un exemple:}\\

        \indent{\textbf{127.0.0.1 localhost}}\\
        \indent{\textbf{192.168.1.1 quark}}\\
        \indent{\textbf{192.168.1.2 mulder}}\\
 
        Cette m\'ethode n'est valable que pour un petit r\'eseau comportant un nombre r\'eduit (une dizaine) de machines connect\'ees, g\'er\'ees par un seul administrateur et ayant aucun contact avec le monde ext\'erieur, c'est-\`a-dire n'\'etant pas raccord\'e directement Internet.\\
 
        Avec un grand nombre de machine, une solution alternative consiste \`a utiliser le programme bind pour la r\'esolution des noms en adresses IP.\\ 
        
	Avant de cr\'eer un serveur de nom, il faut attribuer un nom de domaine \`a votre r\'eseau. Surtout ne choisissez pas un nom qui existe d\'ej\`a sur l'Internet, sinon vous risqueriez d'avoir quelques probl\`emes. J'utilise le nom nunux.fr dans mes exemples.\\ 
	
        \section{ Le fichier /etc/resolv.conf\\}
 
	Avant de configurer le DNS (Domain Name System - Syst\`eme des noms de domaines), il faut v\'erifier le contenu du fichier /etc/resolv.conf. Il doit contenir un champ domain suivi du nom de votre domaine (nunux.fr dans mon exemple).\\ 
        
	Il doit aussi contenir une ligne commen\c cant par nameserver suivi de l'adresse IP du serveur DNS. Si ce dernier est votre PC personnel, alors l'adresse sera 127.0.0.1. \\
\newpage
       
	Voici un exemple de fichier \textbf{/etc/resolv.conf}:\\ 
        
	\indent{domain nunux.fr}\\
	\indent{nameserver 127.0.0.1}\\

        Vous devez aussi installer le package bind qui contient le programme named qui est le serveur de nom.\\ 
	
        \section { Cr\'eation du fichier /etc/named.conf\\}

        	Ce fichier est g\'en\'eralement de tr\`es petite taille (quelques octets) et ne contient que des pointeurs vers les fichiers de r\'ef\'erence.\\
 
        Voici ici un exemple de fichier \textbf{/etc/named.conf}, que vous pourrez adapter selon votre r\'eseau: \\
 	
	\begin{verbatim}
       	zone 0.0.127.in-addr.arpa 
	{
	type master;
    	file /var/named/pz/127.0.0;
	};
	zone 0.168.192.in-addr.arpa 
	{
    	type master;
    	file /var/named/pz/192168.0;
	};
	zone nunux.fr
	{
    	type master;
    	file /var/named/pz/nunux.fr;
	};
	\end{verbatim}
	
        La premi\`ere partie sert \`a la r\'esolution invers\'ee des noms. Cela permet de conna\^\i tre le nom d'un PC \`a partir de son adresse IP. La deuxi\`eme partie sert \`a la r\'esolution de noms du domaine nunux.fr. 
\newpage
        
	\section{Cr\'eation des fichiers de zone\\}
        
	Un fichier de zone est compos\'e de RR. RR est l'abr\'eviation de Ressource Record, et est la plus petite donn\'ee du serveur DNS. Chaque RR a un type: A, par exemple, fait correspondre un nom avec une adresse IP.\\
        
	Voici une liste de quelques-uns des principaux RR utilis\'es:\\

        \textbf{SOA:} signifie Start Of Authority et signale que l'enregistrement qui suit contient les informations ayant autorit\'e pour ce domaine. Chaque fichier de zone doit contenir un RR de type SOA. Il contient les champs suivants. Le num\'ero de r\'evision du fichier. On peut aussi le remplacer par la date.\\
        Le temps de rafra\^\i chissement (en secondes) des informations lues \`a partir du serveur principal (ou primaire).\\
        Le temps (en secondes) pendant lequel le serveur va essayer de joindre le serveur primaire si une requ\^ete ou le rafra\^\i chissement \'echoue.\\
        Le temps (en secondes) au bout duquel un serveur secondaire doit \'eliminer toutes les informations de zones s'il n'a pas pu contacter un serveur primaire.\\
        Le temps (en secondes aussi :-) pendant lequel les autres serveurs doivent conserver le RR (Ressource Record) dans leur cache.\\
        Le temps peut aussi \^etre \'ecris sous une autre forme: 8H = 8 heures, 1W = 1 semaine, 1D = 1 jour, etc...\\

        \textbf{A:} cet enregistrement associe une adresse IP \'a un nom de machine. Il ne doit y avoir qu'un seul champ A par machine.\\

        \textbf{NS:} les enregistrements NS servent \`a sp\'ecifier un serveur primaire de zone, et tous ses serveurs secondaires. Le champ de donn\'ees contient le nom du serveur de noms primaire de cette zone.\\

        \textbf{CNAME:} cet enregistrement associe un alias au nom canonique d'un h\^ote. Le nom canonique est celui indiqu\'e par l'enregistrement A.\\

        \textbf{PTR:} ce type d'enregistrement est utilis\'e pour associer les noms dans le domaine in-addr.arpa avec les noms d'h\^otes. Il sert \`a la r\'esolution invers\'e. Le nom indiqu\'e doit \^etre le nom canonique.\\

        \textbf{MX:} cet enregistrement annonce un \'echangeur de courrier (Mail eXchanger) pour un domaine. il faut faire pr\'ec\'eder le nom de l'\'echangeur par un nombre entier, qui correspond \'a la pr\'ef\'erence. Un agent de transport de courrier d\'esirant d\'elivrer un message \`a un domaine (par exemple sendmail) essaiera tous les h\^otes qui ont un enregistrement MX en commen\c cant par celui qui a le plus petit num\'ero de pr\'ef\'erence.\\

        \textbf{HINFO:} cet enregistrement donne des informations sur le mat\'eriel et le syst\`eme d'exploitation utilis\'e. Tout d'abord il faut cr\'eer le fichier /var/named/pz/127.0.0 qui contiendra le nom des PC du r\'eseau 127.0.0.0. En fait, ceci sera fait sur n'importe quel r\'eseau, puisque l'adresse IP 127.0.0.1 est celle de l'interface loopback (votre machine). Il est donc fortement recommand\'ee, voir obligatoire :-) d'avoir ce fichier. Il sert \`a la r\'esolution de nom inverse, ce qui permet de demander le nom d'un PC \`a partir de son adresse IP.\\

        Voici un fichier \textbf{/var/named/pz/127.0.0}:\\

	\begin{verbatim}

        @               IN      SOA     quark.nunux.fr surfman.nunux.fr (
                                1
                                8H
                                2H
                                1W
                                1D)
                        NS      quark.nunux.fr
	1               PTR     localhost.
	\end{verbatim}

        L'enregistrement PTR a pour premier champ le num\'ero de l'h\^ote, ici 1, ce qui donne 127.0.0.1. Il est suivi du nom correspondant \`a l'adresse IP, le nom se finissant par un point. Tous les autres types de RR sont indiqu\'es plus haut, lisez leur d\'efinition pour en savoir plus.\\
        
	On a vu dans le fichier /etc/named.conf que les adresses IP des machines de nunux.fr se trouvaient dans \textbf{/var/named/pz/nunux.fr}.\\

        Nous allons donc créer ce fichier, dont voici un exemple:\\
	
	\begin{verbatim}

        @               IN      SOA     quark.nunux.fr surfman.nunux.fr (
                                199907241
                                8H
                                2H
                                1W
                                1D)
                        NS      quark
                        MX      10 mail
	localhost       A       127.0.0.1
	quark           A       192.168.1.1
	mail            CNAME   192.168.1.1
	quark           HINFO   Pentium 150 MHz Linux 2.2.9
	ns1             CNAME   quark
	www             CNAME   quark
	ftp             CNAME   quark
	pop             CNAME   quark
	mulder          A       192.168.1.2
	mulder          HINFO   Celeron 500 MHz Windows 98
	quake           CNAME   mulder
	\end{verbatim}

        On voit d'abord que nunux.fr est compos\'e de deux machines:\\
        
	\indent{quark.nunux.fr avec 192.168.1.1 comme adresse}\\
        \indent{mulder.nunux.fr avec 192.168.1.2 comme adresse}\\
        
	quark.nunux.fr a aussi d'autres nom (CNAME):\\

        \indent{mail.nunux.fr}\\
        \indent{www.nunux.fr}\\
        \indent{ftp.nunux.fr}\\
        \indent{pop.nunux.fr}\\
        
	mulder.nunux.fr a un seul autre nom, qui est quake.nunux.fr\\ 
        
	Le champ de l'enregistrement MX est mail, ce qui signifie mail.nunux.fr. Si on veut indiquer le nom en entier, il faudra écrire mail.nunux.fr.. Notez bien le point à la fin !\\ 

        Il reste un probl\`eme: si on veut connaitre le nom d'une machine \`a partir de son adresse IP. Cela s'appele la recherche de noms inverse: il faut cr\'eer un fichier \textbf{/var/named/pz/192.168.1}.\\
 
        En voici un exemple:\\ 
	
	\begin{verbatim}

        @       IN  SOA quark.nunux.fr surfman.nunux.fr (
                1
                8H
                2H
                1W
                1D)
            NS  quark.nunux.fr
	1   PTR quark.nunux.fr.
	2   PTR mulder.nunux.fr.
	\end{verbatim}
        
	Pensez \`a mettre un point apr\`es le nom, sinon vous aures des surprises ! Tout est fini, vous pouvez lancez le serveur en tapant ndc start et l'arr\^eter en tapant ndc stop. Il est bien sur conseiller de le mettre au d\'emarrage :-)\\ 

        \section{Utilisation de nslookup\\}

        nslookup est un programme permettant l'interrogation d'un serveur de noms. Il lit les adresses des serveurs de noms dans le fichier /etc/resolv.conf.\\

	Voici un exemple de session avec nslookup:

	\begin{verbatim}
	
        [root@quark /]# nslookup 
	Default Server:  localhost
	Address:  127.0.0.1

	[root@quark /]# nslookup quark.nunux.fr
	Server:  localhost
	Address:  127.0.0.1
	Name:    quark.nunux.fr
	Address:  192.168.1.1

	[root@quark /]# nslookup www.nunux.fr
	Server:  localhost
	Address:  127.0.0.1
	Name:    quark.nunux.fr
	Address:  192.168.1.1
	Aliases:  www.nunux.fr
	
	[root@quark /]# nslookup 
	set q=ns
	nunux.fr.
	Server:  localhost
	Address:  127.0.0.1
	nunux.fr	nameserver = quark.nunux.fr
	quark.nunux.fr	internet address = 192.168.1.1
	set q=any
	mulder.nunux.fr
	Server:  localhost
	Address:  127.0.0.1
	mulder.nunux.fr	CPU = Celeron 500 MHz	OS = Windows 98
	mulder.nunux.fr	internet address = 192.168.1.2
	nunux.fr	nameserver = quark.nunux.fr
	quark.nunux.fr	internet address = 192.168.1.1
        \end{verbatim}
\newpage
	
	\section{Serveur DNS pour le réseau local et l'Internet\\}
        
	Mon r\'eseau \'etant parfois connect\'e à l'Internet (je dis souvent l'Internet, car un internet est un r\'eseau, tout comme l'intranet ou l'extranet) j'en avais marre de changer le fichier resolv.conf pour qu'il utilise mon serveur DNS quand je ne suis pas connect\'e, et le serveur DNS de mon FAI lorsque je me connecte \'a l'Internet.\\

        Alors j'ai transform\'e mon serveur DNS. Je lui ai ajout\'e une option afin qu'il aille chercher tous les autres domaines sur d'autres serveurs. Il faut rajouter ceci dans votre /etc/named.conf:\\
        
	\begin{verbatim}
	zone . 
	{
    	type hint;
	file /var/named/root.hints;
	};
	\end{verbatim}
        
	Il faut aussi cr\'eer le fichier /var/named/root.hints qui contiendra les serveurs de noms de l'Internic. Pour obtenir un tel fichier il faut utiliser le programme dig et lancer:\\
        
	\begin{verbatim}
	dig @rs.internic.net . ns &gt;/var/named/root.hints
        \end{verbatim}
	
	Le probl\`eme est que lorsque vous demanderez, par exemple, une image dans un fichier HTML sur un serveur qui n'est pas sur le réseau, named va interroger un serveur dont le nom apparaît dans le fichier root.hints et cela ne va jamais, s'arrêter (il ne vous reste plus qu'à killer Netscape quand il se met à faire çà)\\

        Pour \'eviter cela, il suffit de cr\'eer un fichier root.hints vide lorsque l'on n'est pas connect\'e \`a l'Internet. A chaque connexion, on lance un script qui remplace temporairement le fichier root.hints vide par un fichier root.hints cr\'e\'e avec la commande dig ci-dessus.\\ 
        
	De cette mani\`ere, lorsque vous serez d\'econnect\'e, le fichier root.hints sera vide et aucun autre serveur ne sera interrog\'e !\\

\newpage        
	En pratique, cr\'eez un fichier root.hints vide et un fichier root.hints.full qui contient le r\'esultat de la commande dig, et vous pourrez ajouter \`a vos scripts ip-up et ip-down:\\

	\begin{verbatim}
          ip-up
            mv /var/named/root.hints /var/named/root.hints.empty
            mv /var/named/root.hints.full /var/named/root.hints
          ip-down
            mv /var/named/root.hints /var/named/root.hints.full
            mv /var/named/root.hints.empty /var/named/root.hints
        \end{verbatim}


\end{document}