Différences entre versions de « DNS »
(72 versions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
+ | {|border=1 class="wikitable" | ||
+ | ! !! Serveur !! RNDC | ||
+ | |-align="center" | ||
+ | | '''Protocole''' || udp || tcp | ||
+ | |-align="center" | ||
+ | | '''Port''' || 53 || 953 | ||
+ | |-align="center" | ||
+ | | '''Configuration Iptables''' || iptables -I INPUT 2 -p udp --dport 53 -j ACCEPT || iptables -I INPUT 3 -p tcp --dport 953 -j ACCEPT | ||
+ | |} | ||
+ | = Préparation = | ||
+ | |||
+ | Dans un premier temps, il faudra avoir une connexion à Internet, utiliser un "autre" serveur DNS et désactiver SELinux. | ||
+ | |||
+ | Pour ceux qui auraient manqué des étapes les voici: | ||
+ | * [[resolv.conf|Configuration du client DNS]] | ||
+ | * [[ifcfg-ethX|Paramétrer sa carte réseau]] | ||
+ | * [[SELinux#Changement_d.27.C3.A9tat|Désactiver SELinux]] | ||
+ | |||
+ | Une fois ces étapes effectuées, entrons dans le vif du sujet ! | ||
+ | |||
= Installation = | = Installation = | ||
Tout d'abord il faut installer les paquetages suivants: | Tout d'abord il faut installer les paquetages suivants: | ||
+ | * CentOS6-7: | ||
+ | <pre> | ||
+ | # yum -y install bind bind-utils | ||
+ | </pre> | ||
+ | * CentOS8: | ||
<pre> | <pre> | ||
− | # yum -y install bind bind-utils | + | # yum -y install bind-chroot bind-utils |
</pre> | </pre> | ||
− | * bind → c'est le serveur DNS (Berkeley Internet Name Daemon) | + | * bind / bind-chroot → c'est le serveur DNS (Berkeley Internet Name Daemon) |
* bind-utils → des utilitaires pour s'assurer que le serveur est correctement configuré (nslookup, dig, ...) | * bind-utils → des utilitaires pour s'assurer que le serveur est correctement configuré (nslookup, dig, ...) | ||
= Configuration du serveur = | = Configuration du serveur = | ||
+ | == Point de départ == | ||
L'essentiel de la configuration se déroule dans le fichier /etc/named.conf | L'essentiel de la configuration se déroule dans le fichier /etc/named.conf | ||
+ | Ci-dessous un exemple de fichier ''de base'': | ||
+ | <pre> | ||
+ | options { | ||
+ | # Adresse d'écoute pour IPv4 | ||
+ | listen-on port 53 { 127.0.0.1; }; | ||
+ | # Adresse d'écoute pour IPv6 | ||
+ | listen-on-v6 port 53 { ::1; }; | ||
+ | # Emplacement des fichiers de zones | ||
+ | directory "/var/named"; | ||
+ | # | ||
+ | dump-file "/var/named/data/cache_dump.db"; | ||
+ | # | ||
+ | statistics-file "/var/named/data/named_stats.txt"; | ||
+ | memstatistics-file "/var/named/data/named_mem_stats.txt"; | ||
+ | # Réseaux auxquels BIND répondra | ||
+ | allow-query { localhost; }; | ||
+ | # Autorise les recherches récursives | ||
+ | recursion yes; | ||
+ | |||
+ | dnssec-enable yes; | ||
+ | dnssec-validation no; | ||
+ | dnssec-lookaside auto; | ||
+ | |||
+ | /* Path to ISC DLV key */ | ||
+ | bindkeys-file "/etc/named.iscdlv.key"; | ||
+ | |||
+ | managed-keys-directory "/var/named/dynamic"; | ||
+ | }; | ||
+ | |||
+ | logging { | ||
+ | channel default_debug { | ||
+ | file "data/named.run"; | ||
+ | severity dynamic; | ||
+ | }; | ||
+ | }; | ||
+ | |||
+ | zone "." IN { | ||
+ | type hint; | ||
+ | file "named.ca"; | ||
+ | }; | ||
+ | |||
+ | include "/etc/named.rfc1912.zones"; | ||
+ | include "/etc/named.root.key"; | ||
+ | </pre> | ||
+ | |||
+ | == Déclarations == | ||
+ | Les déclarations suivantes peuvent être utilisées: | ||
+ | *acl → configure une liste de contrôles d'accès | ||
+ | *any → correspond à toutes les adresses IP | ||
+ | *localhost → correspond aux IP du système local | ||
+ | *localnets → correspond aux adresses IP utilisées par le système au travers d'interfaces | ||
+ | *none → correspond à aucune adresse IP | ||
+ | |||
+ | == Exemples == | ||
+ | === acl === | ||
+ | En dehors de la rubrique ''options'', la déclaration ''acl'' permet de rassembler plusieurs réseaux ensemble: | ||
+ | <pre> | ||
+ | acl authorized { | ||
+ | 192.168.0.0/24; | ||
+ | 10.0.1.0/24; | ||
+ | 192.168.50.0/24; | ||
+ | 127.0.0.0/8; | ||
+ | }; | ||
+ | |||
+ | acl unauthorized { | ||
+ | 192.168.60.0/24; | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | On pourra ensuite remplacer avantageusement la ligne suivante: | ||
+ | <pre> | ||
+ | allow-query { localhost; }; | ||
+ | </pre> | ||
+ | Par: | ||
+ | <pre> | ||
+ | allow-query { authorized; }; | ||
+ | </pre> | ||
+ | Cela sera plus propre de rassembler les déclarations en début de fichier et de ne plus avoir à parcourir l'intégralité du fichier pour apporter une modification ! | ||
+ | |||
+ | === none === | ||
+ | On pourra remplacer la ligne suivante: | ||
+ | <pre> | ||
+ | listen-on-v6 port 53 { ::1; }; | ||
+ | </pre> | ||
+ | Par: | ||
+ | <pre> | ||
+ | listen-on-v6 port 53 { none; }; | ||
+ | </pre> | ||
+ | |||
+ | === localnets === | ||
+ | On pourra remplacer la ligne suivante: | ||
+ | <pre> | ||
+ | listen-on port 53 { 127.0.0.1; }; | ||
+ | </pre> | ||
+ | Par: | ||
+ | <pre> | ||
+ | listen-on port 53 { localnets; }; | ||
+ | </pre> | ||
+ | |||
+ | = Options supplémentaires = | ||
+ | Dans la section ''options'' on peut ajouter: | ||
+ | |||
+ | == Forwarders == | ||
+ | |||
+ | Quand le serveur DNS est incapable de répondre à une requête, il la ''forward'' aux serveurs spécifiés l'option ''forwarders'' | ||
+ | |||
+ | <pre> | ||
+ | forwarders { 8.8.8.8; 212.217.0.1; }; | ||
+ | </pre> | ||
+ | |||
+ | == Recherche récursives == | ||
+ | |||
+ | Pour un client, il est plus simple de s'adresser à un seul serveur DNS et, autoriser les requêtes récursives, signifie que le serveur DNS s'adressera '''récursivement''' à plusieurs autres DNS jusqu'à la résolution complète de la requête. | ||
+ | |||
+ | <pre> | ||
+ | allow-recursion { authorized; }; | ||
+ | </pre> | ||
+ | |||
+ | == Cacher la version de BIND == | ||
+ | |||
+ | Pour des raisons évidentes de sécurité, il vaut mieux masquer la version de BIND ! | ||
+ | |||
+ | <pre> | ||
+ | version "SECRET"; | ||
+ | </pre> | ||
+ | |||
+ | = Démarrage = | ||
+ | |||
+ | Au premier démarrage, le démon ''named'' génére les clés RNDC: | ||
+ | * Pour SystemVInit: | ||
+ | <pre> | ||
+ | service named start | ||
+ | </pre> | ||
+ | * Pour SystemD: | ||
+ | <pre> | ||
+ | systemctl start named.service | ||
+ | </pre> | ||
+ | <pre> | ||
+ | Generating /etc/rndc.key: [ OK ] | ||
+ | Démarrage de named : [ OK ] | ||
+ | </pre> | ||
+ | == Vérification de l'écoute == | ||
+ | On peut utiliser la commande ''netstat'' pour s'assurer que ''named'' écoute sur les interfaces désirées | ||
+ | <pre> | ||
+ | # netstat -aunp | grep named | ||
+ | udp 0 0 127.0.0.1:53 0.0.0.0:* 10787/named | ||
+ | udp 0 0 192.168.200.253:53 0.0.0.0:* 10787/named | ||
+ | </pre> | ||
+ | |||
+ | == Test de résolution == | ||
+ | |||
+ | Utilisons ''nslookup'' pour s'assurer que notre serveur fonctionne en lui demandant l'adresse de ''google.fr'' | ||
+ | |||
+ | <pre> | ||
+ | # nslookup google.fr 127.0.0.1 | ||
+ | Server: 127.0.0.1 | ||
+ | Address: 127.0.0.1#53 | ||
+ | |||
+ | Non-authoritative answer: | ||
+ | Name: google.fr | ||
+ | Address: 173.194.41.23 | ||
+ | Name: google.fr | ||
+ | Address: 173.194.41.24 | ||
+ | Name: google.fr | ||
+ | Address: 173.194.41.31 | ||
+ | </pre> | ||
+ | |||
+ | Il ne nous reste plus qu'à déclarer une zone ! | ||
+ | |||
+ | = Ajout d'une zone de recherche directe = | ||
+ | == Le fichier de zone == | ||
+ | |||
+ | Le fichier de zone de recherche directe se trouve dans le répertoire ''/var/named'' et respecte la syntaxe suivante, pour un réseau tala.informatique.fr: | ||
+ | *tala-informatique.fr | ||
+ | ou | ||
+ | *tala-informatique.fr.db | ||
+ | |||
+ | Le contenu du fichier ''/var/named/tala-informatique.fr'' est le suivant: | ||
+ | <pre> | ||
+ | ; Précise au client que la durée de validité des informations de noms | ||
+ | $TTL 86400 | ||
+ | ; Début de la déclaration State Of Autority (SOA) | ||
+ | tala-informatique.fr. IN SOA dns.tala-informatique.fr. root.tala-informatique.fr. ( | ||
+ | 0 ; serial | ||
+ | 21600 ; refresh after 6 hours | ||
+ | 3600 ; retry after 1 hour | ||
+ | 604800 ; expires after 1 week | ||
+ | 86400 ) ; minimum TTL of 1 day | ||
+ | |||
+ | ; NS pour les serveurs de nom | ||
+ | IN NS dns.tala-informatique.fr. | ||
+ | ; MX pour les serveurs de mails, on indique également un poid / priorité | ||
+ | IN MX 10 mail.tala-informatique.fr. | ||
+ | IN MX 20 mail2.tala-informatique.fr. | ||
+ | ;Enregistrement par défaut pour le domain | ||
+ | IN A 192.168.200.254 | ||
+ | ; Enregistrement direct | ||
+ | dns.tala-informatique.fr. IN A 192.168.200.253 | ||
+ | ; Enregistrement direct | ||
+ | mail.tala-informatique.fr. IN A 192.168.200.252 | ||
+ | ; Enregistrement direct | ||
+ | mail2.tala-informatique.fr. IN A 192.168.200.251 | ||
+ | ; Alias mx <=> mail <=> 192.168.200.252 | ||
+ | mx.tala-informatique.fr. IN CNAME mail.tala-informatique.fr. | ||
+ | ; Alias mx2 <=> mail2 <=> 192.168.200.251 | ||
+ | mx2.tala-informatique.fr. IN CNAME mail2.tala-informatique.fr. | ||
+ | </pre> | ||
+ | |||
+ | == Déclaration dans la configuration de ''named'' == | ||
+ | |||
+ | Maintenant que le fichier de recherche directe est créé, il faut indiquer à ''named'' de quoi il retourne. A la fin du fichier ''/etc/named.conf'' ajoutons les lignes suivantes: | ||
+ | <pre> | ||
+ | zone "tala-informatique.fr" IN { | ||
+ | ; Le serveur est maître pour cette zone | ||
+ | type master; | ||
+ | ; On indique le fichier de zone | ||
+ | file "tala-informatique.fr"; | ||
+ | ; On précise si on autorise les mises à jours (ici non, parce que le serveur est maître) | ||
+ | allow-update { none; }; | ||
+ | }; | ||
+ | </pre> | ||
+ | == Test == | ||
+ | |||
+ | Toujours avec ''nslookup'' | ||
+ | <pre> | ||
+ | # nslookup dns.tala-informatique.fr 127.0.0.1 | ||
+ | Server: 127.0.0.1 | ||
+ | Address: 127.0.0.1#53 | ||
+ | |||
+ | Name: dns.tala-informatique.fr | ||
+ | Address: 192.168.200.100 | ||
+ | </pre> | ||
+ | |||
+ | Pour s’affranchir d'avoir à ajouter le nom de domaine, il faut modifier la [[resolv.conf|configuration du client dns]] | ||
+ | |||
+ | = Ajout d'un zone de recherche inverse = | ||
+ | Les fichiers de zones de recherche inverse se trouvent dans le répertoire /var/named et respectent la syntaxe suivante, pour un plan d'adressage 192.168.200.0/24: | ||
+ | |||
+ | *200.168.192.in-addr.arpa | ||
+ | |||
+ | == Le fichier de zone == | ||
+ | <pre> | ||
+ | $TTL 86400 | ||
+ | 200.168.192.in-addr.arpa. IN SOA dns.tala-informatique.fr. root.tala-informatique.fr. ( | ||
+ | 0 ; serial | ||
+ | 21600 ; refresh after 6 hours | ||
+ | 3600 ; retry after 1 hour | ||
+ | 604800 ; expire after 1 week | ||
+ | 86400 ) ; minimum TTL of 1 day | ||
+ | |||
+ | IN NS dns.tala-informatique.fr. | ||
+ | IN MX 10 mail.tala-informatique.fr. | ||
+ | IN MX 20 mail2.tala-informatique.fr. | ||
+ | |||
+ | 253 IN PTR dns.tala-informatique.fr. | ||
+ | 252 IN PTR mail.domain.com. | ||
+ | 251 IN PTR mail2.domain.com. | ||
+ | </pre> | ||
+ | |||
+ | == Déclaration dans la configuration de ''named'' == | ||
+ | <pre> | ||
+ | zone "200.168.192.in-addr.arpa" IN { | ||
+ | type master; | ||
+ | file "200.168.192.in-addr.arpa"; | ||
+ | allow-update { none; }; | ||
+ | }; | ||
+ | </pre> | ||
+ | == Test == | ||
+ | <pre> | ||
+ | # nslookup 192.168.200.253 127.0.0.1 | ||
+ | Server: 127.0.0.1 | ||
+ | Address: 127.0.0.1#53 | ||
+ | |||
+ | 253.200.168.192.in-addr.arpa name = dns.tala-informatique.fr. | ||
+ | </pre> | ||
+ | |||
+ | = Forward de zone = | ||
+ | Vous pouvez rediriger une requête lorsque vous connaissez le DNS en charge de la zone : | ||
+ | <pre> | ||
+ | zone "other.tala-informatique.fr" IN { | ||
+ | type forward; | ||
+ | forward only; | ||
+ | forwarders { 192.168.100.100; }; | ||
+ | }; | ||
+ | </pre> | ||
+ | Dans cette exemple le serveur ''192.168.100.100'' s'occupe de la zone ''other.tala-informatique.fr'' | ||
+ | |||
+ | = Résolution en fonction de l'adresse IP source = | ||
+ | Dans l'exemple suivant on créer deux ''vues'', une pour le réseau interne et une pour le gens qui viennent d'Internet. | ||
+ | |||
+ | La vue ''inside'' permet de faire des résolution avec les adresses du réseau interne | ||
+ | <pre> | ||
+ | view "inside" { | ||
+ | match-clients { 192.168.200.0/24; 127.0.0.0/8; }; | ||
+ | recursion yes; | ||
+ | include "/etc/named.rfc1912.zones"; | ||
+ | include "/etc/named.root.key"; | ||
+ | zone "." IN { | ||
+ | type hint; | ||
+ | file "named.ca"; | ||
+ | }; | ||
+ | zone "tala-informatique.fr" IN { | ||
+ | type master; | ||
+ | file "local.tala-informatique.fr"; | ||
+ | allow-update { none; }; | ||
+ | }; | ||
+ | }; | ||
+ | </pre> | ||
+ | La vue ''outside'' permet les résolutions pour les externes et renvoie normalement l'adresse IP publique de la passerelle : | ||
+ | <pre> | ||
+ | view "outside" { | ||
+ | match-clients { any; }; | ||
+ | zone "tala-informatique.fr" IN { | ||
+ | type master; | ||
+ | file "outside.tala-informatique.fr"; | ||
+ | allow-update { none; }; | ||
+ | }; | ||
+ | }; | ||
+ | </pre> | ||
+ | Notez bien que '''toutes''' les zones doivent être inclues dans une vue, notamment : | ||
+ | <pre> | ||
+ | include "/etc/named.rfc1912.zones"; | ||
+ | include "/etc/named.root.key"; | ||
+ | zone "." IN { | ||
+ | type hint; | ||
+ | file "named.ca"; | ||
+ | }; | ||
+ | </pre> | ||
+ | Doit être déplacé de la section globale dans une vue (ici ''inside'') ! | ||
+ | = Enregistrement dans le chargeur de démarrage = | ||
+ | * Pour SystemVInit: | ||
+ | <pre> | ||
+ | chkconfig named on | ||
+ | </pre> | ||
+ | * Pour SystemD: | ||
+ | <pre> | ||
+ | systemctl enable named.service | ||
+ | </pre> | ||
+ | |||
+ | = Parcours des logs = | ||
+ | {{#lst:Les_logs|log_named}} | ||
+ | |||
+ | = Mise à jour sécurisée = | ||
+ | == Création d'une clé (dnssec) == | ||
+ | |||
+ | La commande ''dnssec-keygen'' permet de générer une clé pour faire des mises à jour sécurisées | ||
+ | |||
+ | <pre> | ||
+ | # dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 256 -n USER DHCP_DAEMON | ||
+ | Kdhcp_daemon.+157+30508 | ||
+ | </pre> | ||
+ | |||
+ | * -r → ajoute une source aléatoire | ||
+ | * -a → permet de choisir l'algorithme de cryptage | ||
+ | * -b → spécifie la taille de la clé (256 est correct) | ||
+ | * -n → précise l'utilisation de la clé [ZONE|HOST|ENTITY] | ||
+ | |||
+ | Une fois cette commande terminée les deux clés sont générées | ||
+ | |||
+ | <pre> | ||
+ | # ls | ||
+ | Kdhcp_daemon.+157+30508.key Kdhcp_daemon.+157+30508.private | ||
+ | </pre> | ||
+ | |||
+ | On contrôle la clé générée | ||
+ | |||
+ | <pre> | ||
+ | # cat Kdhcp_daemon.+157+30508.key | ||
+ | DHCP_DAEMON. IN KEY 0 3 157 m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= | ||
+ | </pre> | ||
+ | |||
+ | == Modification de la configuration de ''named'' == | ||
+ | |||
+ | === Ajout de la clé === | ||
+ | |||
+ | Dans le fichier ''/etc/named.conf'' il faudra ajouter, après la rubrique ''options'' par exemple, la section suivante: | ||
+ | |||
+ | <pre> | ||
+ | key DHCP_DAEMON { algorithm hmac-md5; secret "m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM="; }; | ||
+ | </pre> | ||
+ | |||
+ | N'oubliez pas les ''double quote'' pour délimiter la clé ! | ||
+ | |||
+ | === Update des zones === | ||
+ | |||
+ | Ainsi que dans la déclaration de chaque zone concernée | ||
+ | |||
+ | <pre> | ||
+ | allow-update { key DHCP_DAEMON; }; | ||
+ | </pre> | ||
+ | |||
+ | === Configuration de RNDC === | ||
+ | |||
+ | Le démon chargé de mettre à jour ''named'' s'appelle ''RNDC'' et sa configuration se trouve également dans ''/etc/named.conf'' (au début par exemple) | ||
+ | |||
+ | <pre> | ||
+ | controls { | ||
+ | inet * allow { tala; } keys { DHCP_DAEMON; }; | ||
+ | }; | ||
+ | </pre> | ||
+ | |||
+ | === Test === | ||
+ | |||
+ | Une fois que vous avez redémarré ''named'', il écoute maintenant sur le port TCP/953 | ||
+ | |||
+ | <pre> | ||
+ | ]# netstat -atnp | grep named | ||
+ | tcp 0 0 192.168.200.253:53 0.0.0.0:* LISTEN 2611/named | ||
+ | tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 2611/named | ||
+ | tcp 0 0 0.0.0.0:953 0.0.0.0:* LISTEN 2611/named | ||
+ | </pre> | ||
+ | |||
+ | === Configuration du pare-feu === | ||
+ | |||
+ | Il ne faut pas oublier d'ouvrir un port dans le pare-feu et de sauvegarder la configuration | ||
+ | |||
+ | <pre> | ||
+ | # iptables -I INPUT 2 -p tcp --dport 953 -j ACCEPT | ||
+ | # service iptables save | ||
+ | </pre> | ||
+ | |||
+ | === Paramétrage des droits === | ||
+ | |||
+ | Et assigner les bon droits sur les fichiers de ''named'' | ||
+ | |||
+ | <pre> | ||
+ | # chown named.named -R /var/named/ | ||
+ | </pre> | ||
+ | |||
+ | == Vérifications du bon fonctionnement == | ||
+ | |||
+ | On peut tester le bon fonctionnement des mises à jour sécurisées grâce à la commande ''nsupdate'' | ||
+ | |||
+ | === recherche directe === | ||
+ | <pre> | ||
+ | # nsupdate | ||
+ | > server 127.0.0.1 | ||
+ | > key DHCP_DAEMON m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= | ||
+ | > zone tala-informatique.fr | ||
+ | > update add test.tala-informatique.fr. 86400 A 192.168.200.50 | ||
+ | > send | ||
+ | > quit | ||
+ | </pre> | ||
+ | |||
+ | Si on affiche les deux dernières ligne de ''/var/log/messages'' | ||
+ | |||
+ | <pre> | ||
+ | # tail -n 2 /var/log/messages | ||
+ | Dec 27 21:30:22 dns named[2086]: client 127.0.0.1#40392: signer "dhcp_daemon" approved | ||
+ | Dec 27 21:30:22 dns named[2086]: client 127.0.0.1#40392: updating zone 'tala-informatique.fr/IN': adding an RR at 'test.tala-informatique.fr' A | ||
+ | </pre> | ||
+ | |||
+ | Et que l'on utilise ''nslookup'' | ||
+ | |||
+ | <pre> | ||
+ | # nslookup test 127.0.0.1 | ||
+ | Server: 127.0.0.1 | ||
+ | Address: 127.0.0.1#53 | ||
+ | |||
+ | Name: test.tala-informatique.fr | ||
+ | Address: 192.168.200.50 | ||
+ | </pre> | ||
+ | |||
+ | Enfin, on efface cet enregistrement | ||
+ | |||
+ | <pre> | ||
+ | # nsupdate << EOF | ||
+ | server 127.0.0.1 | ||
+ | key DHCP_DAEMON m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= | ||
+ | zone tala-informatique.fr | ||
+ | update delete test.tala-informatique.fr. 86400 A 192.168.200.50 | ||
+ | send | ||
+ | EOF | ||
+ | </pre> | ||
+ | |||
+ | === recherche inverse === | ||
+ | <pre> | ||
+ | nsupdate | ||
+ | > server 127.0.0.1 | ||
+ | > key DHCP_DAEMON m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= | ||
+ | > zone 200.168.192.in-addr.arpa | ||
+ | > update add 50.200.168.192.in-addr.arpa 86400 PTR test.tala-informatique.fr. | ||
+ | > send | ||
+ | > quit | ||
+ | </pre> | ||
+ | |||
+ | Si on affiche les deux dernières lignes de ''/var/log/messages'' | ||
+ | |||
+ | <pre> | ||
+ | # tail -n 2 /var/log/messages | ||
+ | Dec 27 21:23:21 dns named[2086]: client 127.0.0.1#35469: signer "dhcp_daemon" approved | ||
+ | Dec 27 21:23:21 dns named[2086]: client 127.0.0.1#35469: updating zone '200.168.192.in-addr.arpa/IN': adding an RR at '50.200.168.192.in-addr.arpa' PTR | ||
+ | </pre> | ||
+ | |||
+ | Et que l'on utilise ''nslookup'' | ||
+ | |||
+ | <pre> | ||
+ | # nslookup 192.168.200.50 127.0.0.1 | ||
+ | Server: 127.0.0.1 | ||
+ | Address: 127.0.0.1#53 | ||
+ | |||
+ | 50.200.168.192.in-addr.arpa name = test.tala-informatique.fr. | ||
+ | </pre> | ||
+ | |||
+ | Enfin, on efface cet enregistrement | ||
+ | |||
+ | <pre> | ||
+ | # nsupdate << EOF | ||
+ | server 127.0.0.1 | ||
+ | key DHCP_DAEMON m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= | ||
+ | zone 200.168.192.in-addr.arpa | ||
+ | update delete 50.200.168.192.in-addr.arpa 86400 PTR test.tala-informatique.fr. | ||
+ | send | ||
+ | EOF | ||
+ | </pre> | ||
+ | |||
+ | = Utilisation avec un contrôleur de domaine ''Active Directory''= | ||
+ | Quand vous voulez utilisez votre serveur ''Bind'' pour qu'il redirige les requêtes des clients ''Windows'' vers un contrôleur de domaine ''Active Directory'', il vous faut ajouter les lignes suivantes, après l’enregistrement ''NS'': | ||
<pre> | <pre> | ||
+ | _ldap._tcp.tala-informatique.fr. SRV 0 0 389 ad.tala-informatique.fr. | ||
+ | _kerberos._tcp.tala-informatique.fr. SRV 0 0 88 ad.tala-informatique.fr. | ||
+ | _ldap._tcp.dc._msdcs.tala-informatique.fr. SRV 0 0 389 ad.tala-informatique.fr. | ||
+ | _kerberos._tcp.dc._msdcs.tala-informatique.fr. SRV 0 0 88 ad.tala-informatique.fr. | ||
+ | ad.tala-informatique.fr IN A 192.168.1.250 | ||
</pre> | </pre> | ||
+ | Dans cet exemple on part du principe que : | ||
+ | * le domaine est ''tala-informatique.fr''; | ||
+ | * le serveur AD à le FQDN ''ad.tala-informatique.fr''; | ||
+ | * le serveur AD à l'adresse IP 192.168.1.250. |
Version actuelle datée du 5 décembre 2023 à 11:32
Serveur | RNDC | |
---|---|---|
Protocole | udp | tcp |
Port | 53 | 953 |
Configuration Iptables | iptables -I INPUT 2 -p udp --dport 53 -j ACCEPT | iptables -I INPUT 3 -p tcp --dport 953 -j ACCEPT |
Préparation
Dans un premier temps, il faudra avoir une connexion à Internet, utiliser un "autre" serveur DNS et désactiver SELinux.
Pour ceux qui auraient manqué des étapes les voici:
Une fois ces étapes effectuées, entrons dans le vif du sujet !
Installation
Tout d'abord il faut installer les paquetages suivants:
- CentOS6-7:
# yum -y install bind bind-utils
- CentOS8:
# yum -y install bind-chroot bind-utils
- bind / bind-chroot → c'est le serveur DNS (Berkeley Internet Name Daemon)
- bind-utils → des utilitaires pour s'assurer que le serveur est correctement configuré (nslookup, dig, ...)
Configuration du serveur
Point de départ
L'essentiel de la configuration se déroule dans le fichier /etc/named.conf Ci-dessous un exemple de fichier de base:
options { # Adresse d'écoute pour IPv4 listen-on port 53 { 127.0.0.1; }; # Adresse d'écoute pour IPv6 listen-on-v6 port 53 { ::1; }; # Emplacement des fichiers de zones directory "/var/named"; # dump-file "/var/named/data/cache_dump.db"; # statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; # Réseaux auxquels BIND répondra allow-query { localhost; }; # Autorise les recherches récursives recursion yes; dnssec-enable yes; dnssec-validation no; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key";
Déclarations
Les déclarations suivantes peuvent être utilisées:
- acl → configure une liste de contrôles d'accès
- any → correspond à toutes les adresses IP
- localhost → correspond aux IP du système local
- localnets → correspond aux adresses IP utilisées par le système au travers d'interfaces
- none → correspond à aucune adresse IP
Exemples
acl
En dehors de la rubrique options, la déclaration acl permet de rassembler plusieurs réseaux ensemble:
acl authorized { 192.168.0.0/24; 10.0.1.0/24; 192.168.50.0/24; 127.0.0.0/8; }; acl unauthorized { 192.168.60.0/24; }
On pourra ensuite remplacer avantageusement la ligne suivante:
allow-query { localhost; };
Par:
allow-query { authorized; };
Cela sera plus propre de rassembler les déclarations en début de fichier et de ne plus avoir à parcourir l'intégralité du fichier pour apporter une modification !
none
On pourra remplacer la ligne suivante:
listen-on-v6 port 53 { ::1; };
Par:
listen-on-v6 port 53 { none; };
localnets
On pourra remplacer la ligne suivante:
listen-on port 53 { 127.0.0.1; };
Par:
listen-on port 53 { localnets; };
Options supplémentaires
Dans la section options on peut ajouter:
Forwarders
Quand le serveur DNS est incapable de répondre à une requête, il la forward aux serveurs spécifiés l'option forwarders
forwarders { 8.8.8.8; 212.217.0.1; };
Recherche récursives
Pour un client, il est plus simple de s'adresser à un seul serveur DNS et, autoriser les requêtes récursives, signifie que le serveur DNS s'adressera récursivement à plusieurs autres DNS jusqu'à la résolution complète de la requête.
allow-recursion { authorized; };
Cacher la version de BIND
Pour des raisons évidentes de sécurité, il vaut mieux masquer la version de BIND !
version "SECRET";
Démarrage
Au premier démarrage, le démon named génére les clés RNDC:
- Pour SystemVInit:
service named start
- Pour SystemD:
systemctl start named.service
Generating /etc/rndc.key: [ OK ] Démarrage de named : [ OK ]
Vérification de l'écoute
On peut utiliser la commande netstat pour s'assurer que named écoute sur les interfaces désirées
# netstat -aunp | grep named udp 0 0 127.0.0.1:53 0.0.0.0:* 10787/named udp 0 0 192.168.200.253:53 0.0.0.0:* 10787/named
Test de résolution
Utilisons nslookup pour s'assurer que notre serveur fonctionne en lui demandant l'adresse de google.fr
# nslookup google.fr 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Non-authoritative answer: Name: google.fr Address: 173.194.41.23 Name: google.fr Address: 173.194.41.24 Name: google.fr Address: 173.194.41.31
Il ne nous reste plus qu'à déclarer une zone !
Ajout d'une zone de recherche directe
Le fichier de zone
Le fichier de zone de recherche directe se trouve dans le répertoire /var/named et respecte la syntaxe suivante, pour un réseau tala.informatique.fr:
- tala-informatique.fr
ou
- tala-informatique.fr.db
Le contenu du fichier /var/named/tala-informatique.fr est le suivant:
; Précise au client que la durée de validité des informations de noms $TTL 86400 ; Début de la déclaration State Of Autority (SOA) tala-informatique.fr. IN SOA dns.tala-informatique.fr. root.tala-informatique.fr. ( 0 ; serial 21600 ; refresh after 6 hours 3600 ; retry after 1 hour 604800 ; expires after 1 week 86400 ) ; minimum TTL of 1 day ; NS pour les serveurs de nom IN NS dns.tala-informatique.fr. ; MX pour les serveurs de mails, on indique également un poid / priorité IN MX 10 mail.tala-informatique.fr. IN MX 20 mail2.tala-informatique.fr. ;Enregistrement par défaut pour le domain IN A 192.168.200.254 ; Enregistrement direct dns.tala-informatique.fr. IN A 192.168.200.253 ; Enregistrement direct mail.tala-informatique.fr. IN A 192.168.200.252 ; Enregistrement direct mail2.tala-informatique.fr. IN A 192.168.200.251 ; Alias mx <=> mail <=> 192.168.200.252 mx.tala-informatique.fr. IN CNAME mail.tala-informatique.fr. ; Alias mx2 <=> mail2 <=> 192.168.200.251 mx2.tala-informatique.fr. IN CNAME mail2.tala-informatique.fr.
Déclaration dans la configuration de named
Maintenant que le fichier de recherche directe est créé, il faut indiquer à named de quoi il retourne. A la fin du fichier /etc/named.conf ajoutons les lignes suivantes:
zone "tala-informatique.fr" IN { ; Le serveur est maître pour cette zone type master; ; On indique le fichier de zone file "tala-informatique.fr"; ; On précise si on autorise les mises à jours (ici non, parce que le serveur est maître) allow-update { none; }; };
Test
Toujours avec nslookup
# nslookup dns.tala-informatique.fr 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Name: dns.tala-informatique.fr Address: 192.168.200.100
Pour s’affranchir d'avoir à ajouter le nom de domaine, il faut modifier la configuration du client dns
Ajout d'un zone de recherche inverse
Les fichiers de zones de recherche inverse se trouvent dans le répertoire /var/named et respectent la syntaxe suivante, pour un plan d'adressage 192.168.200.0/24:
- 200.168.192.in-addr.arpa
Le fichier de zone
$TTL 86400 200.168.192.in-addr.arpa. IN SOA dns.tala-informatique.fr. root.tala-informatique.fr. ( 0 ; serial 21600 ; refresh after 6 hours 3600 ; retry after 1 hour 604800 ; expire after 1 week 86400 ) ; minimum TTL of 1 day IN NS dns.tala-informatique.fr. IN MX 10 mail.tala-informatique.fr. IN MX 20 mail2.tala-informatique.fr. 253 IN PTR dns.tala-informatique.fr. 252 IN PTR mail.domain.com. 251 IN PTR mail2.domain.com.
Déclaration dans la configuration de named
zone "200.168.192.in-addr.arpa" IN { type master; file "200.168.192.in-addr.arpa"; allow-update { none; }; };
Test
# nslookup 192.168.200.253 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 253.200.168.192.in-addr.arpa name = dns.tala-informatique.fr.
Forward de zone
Vous pouvez rediriger une requête lorsque vous connaissez le DNS en charge de la zone :
zone "other.tala-informatique.fr" IN { type forward; forward only; forwarders { 192.168.100.100; }; };
Dans cette exemple le serveur 192.168.100.100 s'occupe de la zone other.tala-informatique.fr
Résolution en fonction de l'adresse IP source
Dans l'exemple suivant on créer deux vues, une pour le réseau interne et une pour le gens qui viennent d'Internet.
La vue inside permet de faire des résolution avec les adresses du réseau interne
view "inside" { match-clients { 192.168.200.0/24; 127.0.0.0/8; }; recursion yes; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; zone "." IN { type hint; file "named.ca"; }; zone "tala-informatique.fr" IN { type master; file "local.tala-informatique.fr"; allow-update { none; }; }; };
La vue outside permet les résolutions pour les externes et renvoie normalement l'adresse IP publique de la passerelle :
view "outside" { match-clients { any; }; zone "tala-informatique.fr" IN { type master; file "outside.tala-informatique.fr"; allow-update { none; }; }; };
Notez bien que toutes les zones doivent être inclues dans une vue, notamment :
include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; zone "." IN { type hint; file "named.ca"; };
Doit être déplacé de la section globale dans une vue (ici inside) !
Enregistrement dans le chargeur de démarrage
- Pour SystemVInit:
chkconfig named on
- Pour SystemD:
systemctl enable named.service
Parcours des logs
Les logs de named se trouve en majeure partie dans /var/log/message
Feb 14 13:17:30 dns named[1559]: ---------------------------------------------------- Feb 14 13:17:30 dns named[1559]: BIND 9 is maintained by Internet Systems Consortium, Feb 14 13:17:30 dns named[1559]: Inc. (ISC), a non-profit 501(c)(3) public-benefit Feb 14 13:17:30 dns named[1559]: corporation. Support and training for BIND 9 are Feb 14 13:17:30 dns named[1559]: available at https://www.isc.org/support Feb 14 13:17:30 dns named[1559]: ---------------------------------------------------- Feb 14 13:17:30 dns named[1559]: adjusted limit on open files from 4096 to 1048576 Feb 14 13:17:30 dns named[1559]: found 2 CPUs, using 2 worker threads Feb 14 13:17:30 dns named[1559]: using up to 4096 sockets Feb 14 13:17:30 dns named[1559]: loading configuration from '/etc/named.conf' Feb 14 13:17:30 dns named[1559]: reading built-in trusted keys from file '/etc/named.iscdlv.key' Feb 14 13:17:30 dns named[1559]: using default UDP/IPv4 port range: [1024, 65535] Feb 14 13:17:30 dns named[1559]: using default UDP/IPv6 port range: [1024, 65535] Feb 14 13:17:30 dns named[1559]: listening on IPv4 interface lo, 127.0.0.1#53 Feb 14 13:17:30 dns named[1559]: listening on IPv4 interface eth0, 192.168.200.253#53 Feb 14 13:17:30 dns named[1559]: generating session key for dynamic DNS Feb 14 13:17:30 dns named[1559]: sizing zone task pool based on 8 zones Feb 14 13:17:30 dns named[1559]: using built-in DLV key for view _default Feb 14 13:17:30 dns named[1559]: set up managed keys zone for view _default, file '/var/named/dynamic/managed-keys.bind' Feb 14 13:17:30 dns named[1559]: Warning: 'empty-zones-enable/disable-empty-zone' not set: disabling RFC 1918 empty zones Feb 14 13:17:30 dns named[1559]: automatic empty zone: 127.IN-ADDR.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 254.169.IN-ADDR.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 2.0.192.IN-ADDR.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 100.51.198.IN-ADDR.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 113.0.203.IN-ADDR.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 255.255.255.255.IN-ADDR.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: D.F.IP6.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 8.E.F.IP6.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 9.E.F.IP6.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: A.E.F.IP6.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: B.E.F.IP6.ARPA Feb 14 13:17:30 dns named[1559]: automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA Feb 14 13:17:30 dns named[1559]: command channel listening on 0.0.0.0#953 Feb 14 13:17:30 dns named[1559]: zone 0.in-addr.arpa/IN: loaded serial 0 Feb 14 13:17:30 dns named[1559]: zone 1.0.0.127.in-addr.arpa/IN: loaded serial 0 Feb 14 13:17:30 dns named[1559]: zone 200.168.192.in-addr.arpa/IN: loaded serial 10 Feb 14 13:17:30 dns named[1559]: zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 0 Feb 14 13:17:30 dns named[1559]: zone tala-informatique.fr/IN: loaded serial 20 Feb 14 13:17:30 dns named[1559]: zone localhost.localdomain/IN: loaded serial 0 Feb 14 13:17:30 dns named[1559]: zone localhost/IN: loaded serial 0 Feb 14 13:17:30 dns named[1559]: managed-keys-zone ./IN: loaded serial 81 Feb 14 13:17:30 dns named[1559]: running
Chargement des fichiers de zones
Il faut repérer dans cet amas de lignes celles qui sont font référence au chargement des zones spécifiques :
Feb 14 13:17:30 dns named[1559]: zone 200.168.192.in-addr.arpa/IN: loaded serial 10 Feb 14 13:17:30 dns named[1559]: zone tala-informatique.fr/IN: loaded serial 20
Mise à jour sécurisée
Création d'une clé (dnssec)
La commande dnssec-keygen permet de générer une clé pour faire des mises à jour sécurisées
# dnssec-keygen -r /dev/urandom -a HMAC-MD5 -b 256 -n USER DHCP_DAEMON Kdhcp_daemon.+157+30508
- -r → ajoute une source aléatoire
- -a → permet de choisir l'algorithme de cryptage
- -b → spécifie la taille de la clé (256 est correct)
- -n → précise l'utilisation de la clé [ZONE|HOST|ENTITY]
Une fois cette commande terminée les deux clés sont générées
# ls Kdhcp_daemon.+157+30508.key Kdhcp_daemon.+157+30508.private
On contrôle la clé générée
# cat Kdhcp_daemon.+157+30508.key DHCP_DAEMON. IN KEY 0 3 157 m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM=
Modification de la configuration de named
Ajout de la clé
Dans le fichier /etc/named.conf il faudra ajouter, après la rubrique options par exemple, la section suivante:
key DHCP_DAEMON { algorithm hmac-md5; secret "m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM="; };
N'oubliez pas les double quote pour délimiter la clé !
Update des zones
Ainsi que dans la déclaration de chaque zone concernée
allow-update { key DHCP_DAEMON; };
Configuration de RNDC
Le démon chargé de mettre à jour named s'appelle RNDC et sa configuration se trouve également dans /etc/named.conf (au début par exemple)
controls { inet * allow { tala; } keys { DHCP_DAEMON; }; };
Test
Une fois que vous avez redémarré named, il écoute maintenant sur le port TCP/953
]# netstat -atnp | grep named tcp 0 0 192.168.200.253:53 0.0.0.0:* LISTEN 2611/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 2611/named tcp 0 0 0.0.0.0:953 0.0.0.0:* LISTEN 2611/named
Configuration du pare-feu
Il ne faut pas oublier d'ouvrir un port dans le pare-feu et de sauvegarder la configuration
# iptables -I INPUT 2 -p tcp --dport 953 -j ACCEPT # service iptables save
Paramétrage des droits
Et assigner les bon droits sur les fichiers de named
# chown named.named -R /var/named/
Vérifications du bon fonctionnement
On peut tester le bon fonctionnement des mises à jour sécurisées grâce à la commande nsupdate
recherche directe
# nsupdate > server 127.0.0.1 > key DHCP_DAEMON m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= > zone tala-informatique.fr > update add test.tala-informatique.fr. 86400 A 192.168.200.50 > send > quit
Si on affiche les deux dernières ligne de /var/log/messages
# tail -n 2 /var/log/messages Dec 27 21:30:22 dns named[2086]: client 127.0.0.1#40392: signer "dhcp_daemon" approved Dec 27 21:30:22 dns named[2086]: client 127.0.0.1#40392: updating zone 'tala-informatique.fr/IN': adding an RR at 'test.tala-informatique.fr' A
Et que l'on utilise nslookup
# nslookup test 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 Name: test.tala-informatique.fr Address: 192.168.200.50
Enfin, on efface cet enregistrement
# nsupdate << EOF server 127.0.0.1 key DHCP_DAEMON m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= zone tala-informatique.fr update delete test.tala-informatique.fr. 86400 A 192.168.200.50 send EOF
recherche inverse
nsupdate > server 127.0.0.1 > key DHCP_DAEMON m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= > zone 200.168.192.in-addr.arpa > update add 50.200.168.192.in-addr.arpa 86400 PTR test.tala-informatique.fr. > send > quit
Si on affiche les deux dernières lignes de /var/log/messages
# tail -n 2 /var/log/messages Dec 27 21:23:21 dns named[2086]: client 127.0.0.1#35469: signer "dhcp_daemon" approved Dec 27 21:23:21 dns named[2086]: client 127.0.0.1#35469: updating zone '200.168.192.in-addr.arpa/IN': adding an RR at '50.200.168.192.in-addr.arpa' PTR
Et que l'on utilise nslookup
# nslookup 192.168.200.50 127.0.0.1 Server: 127.0.0.1 Address: 127.0.0.1#53 50.200.168.192.in-addr.arpa name = test.tala-informatique.fr.
Enfin, on efface cet enregistrement
# nsupdate << EOF server 127.0.0.1 key DHCP_DAEMON m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM= zone 200.168.192.in-addr.arpa update delete 50.200.168.192.in-addr.arpa 86400 PTR test.tala-informatique.fr. send EOF
Utilisation avec un contrôleur de domaine Active Directory
Quand vous voulez utilisez votre serveur Bind pour qu'il redirige les requêtes des clients Windows vers un contrôleur de domaine Active Directory, il vous faut ajouter les lignes suivantes, après l’enregistrement NS:
_ldap._tcp.tala-informatique.fr. SRV 0 0 389 ad.tala-informatique.fr. _kerberos._tcp.tala-informatique.fr. SRV 0 0 88 ad.tala-informatique.fr. _ldap._tcp.dc._msdcs.tala-informatique.fr. SRV 0 0 389 ad.tala-informatique.fr. _kerberos._tcp.dc._msdcs.tala-informatique.fr. SRV 0 0 88 ad.tala-informatique.fr. ad.tala-informatique.fr IN A 192.168.1.250
Dans cet exemple on part du principe que :
- le domaine est tala-informatique.fr;
- le serveur AD à le FQDN ad.tala-informatique.fr;
- le serveur AD à l'adresse IP 192.168.1.250.