DHCP
Updated 21 Septembre 2021
DHCP est un protocole de gestion de réseaux utilisé sur les réseaux UDP/IP.
Configuration DHCP
Configurez votre réseau :
cl-setup-network --iface eth0:192.168.50.3:24 --route default:192.168.50.1 --dns 8.8.8.8
/etc/conf.d/net
config_eth0="192.168.50.3/24" routes_eth0="default via 192.168.50.1/24" dns_servers="8.8.8.8"
Ensuite, installez les paquets DHCP et DNS :
emerge dhcp bind
Configurez le serveur DHCP :
- réseau utilisé
255.255.255.0 - Adresses IP attribuées, de
192.168.50.100à192.168.50.200. - IP transférée du serveur DNS :
192.168.50.3 - IP de la passerelle, par défaut avec routage :
192.168.50.1~. - adresse haut débit :
192.168.50.255 - domaine :
example.org - alloué pour :
une semaine
/etc/dhcp/dhcpd.conf
shared-network mylan { subnet 192.168.50.0 netmask 255.255.255.0 { range 192.168.50.100 192.168.50.200; option domain-name-servers 192.168.50.3; option domain-name "example.org"; option routers 192.168.50.1; option broadcast-address 192.168.50.255; default-lease-time 604800; max-lease-time 604800; } }
Ajoutez DHCP au démarrage automatique et démarrez-le, justement :
rc-update add dhcpd
rc-service dhcpd start
configuration DNS
Recréez la clé pour actualiser les entrées DNS :
tsig-keygen rndc-key >/etc/bind/rndc.key
Configurer l'accès à la clé :
chmod 640 /etc/bind/rndc.key
chown root:named /etc/bind/rndc.key
Utilisez les paramètres de l'exemple pour créer votre fichier de configuration :
cp -a /etc/bind/named.conf.origin /etc/bind/named.conf
Appliquez la configuration DNS :
/* * Refer to the named.conf(5) and named(8) man pages, and the documentation * in /usr/share/doc/bind-* for more details. * Online versions of the documentation can be found here: * https://kb.isc.org/article/AA-01031 * * If you are going to set up an authoritative server, make sure you * understand the hairy details of how DNS works. Even with simple mistakes, * you can break connectivity for affected parties, or cause huge amounts of * useless Internet traffic. */ acl "xfer" { /* Deny transfers by default except for the listed hosts. * If we have other name servers, place them here. */ 127.0.0.1; }; /* * You might put in here some ips which are allowed to use the cache or * recursive queries */ acl "trusted" { 127.0.0.0/8; 192.168.50.0/24; ::1/128; }; options { directory "/var/bind"; pid-file "/run/named/named.pid"; /* https://www.isc.org/solutions/dlv >=bind-9.7.x only */ //bindkeys-file "/etc/bind/bind.keys"; listen-on-v6 { ::1; }; listen-on { 127.0.0.1; 192.168.50.0/24; }; allow-query { /* * Accept queries from our "trusted" ACL. We will * allow anyone to query our master zones below. * This prevents us from becoming a free DNS server * to the masses. */ trusted; }; allow-query-cache { /* Use the cache for the "trusted" ACL. */ trusted; }; allow-recursion { /* Only trusted addresses are allowed to use recursion. */ trusted; }; allow-transfer { /* Zone tranfers are denied by default. */ xfer; }; allow-update { /* Don't allow updates, e.g. via nsupdate. */ none; }; /* * If you've got a DNS server around at your upstream provider, enter its * IP address here, and enable the line below. This will make you benefit * from its cache, thus reduce overall DNS traffic in the Internet. * * Uncomment the following lines to turn on DNS forwarding, and change * and/or update the forwarding ip address(es): */ forward first; forwarders { // 123.123.123.123; // Your ISP NS // 124.124.124.124; // Your ISP NS // 4.2.2.1; // Level3 Public DNS // 4.2.2.2; // Level3 Public DNS 8.8.8.8; // Google Open DNS 8.8.4.4; // Google Open DNS }; dnssec-enable yes; //dnssec-validation yes; /* * As of bind 9.8.0: * "If the root key provided has expired, * named will log the expiration and validation will not work." */ dnssec-validation auto; /* if you have problems and are behind a firewall: */ //query-source address * port 53; }; /* logging { channel default_log { file "/var/log/named/named.log" versions 5 size 50M; print-time yes; print-severity yes; print-category yes; }; category default { default_log; }; category general { default_log; }; }; */ include "/etc/bind/rndc.key"; controls { inet 127.0.0.1 port 953 allow { 127.0.0.1/32; ::1/128; } keys { "rndc-key"; }; }; zone "." in { type hint; file "/var/bind/named.cache"; }; zone "localhost" IN { type master; file "pri/localhost.zone"; notify no; }; /* * Briefly, a zone which has been declared delegation-only will be effectively * limited to containing NS RRs for subdomains, but no actual data beyond its * own apex (for example, its SOA RR and apex NS RRset). This can be used to * filter out "wildcard" or "synthesized" data from NAT boxes or from * authoritative name servers whose undelegated (in-zone) data is of no * interest. * See http://www.isc.org/software/bind/delegation-only for more info */ //zone "COM" { type delegation-only; }; //zone "NET" { type delegation-only; }; //zone "YOUR-DOMAIN.TLD" { // type master; // file "/var/bind/pri/YOUR-DOMAIN.TLD.zone"; // allow-query { any; }; // allow-transfer { xfer; }; //}; //zone "YOUR-SLAVE.TLD" { // type slave; // file "/var/bind/sec/YOUR-SLAVE.TLD.zone"; // masters { <MASTER>; }; /* Anybody is allowed to query but transfer should be controlled by the master. */ // allow-query { any; }; // allow-transfer { none; }; /* The master should be the only one who notifies the slaves, shouldn't it? */ // allow-notify { <MASTER>; }; // notify no; //}; zone "example.org" { type master; file "/var/bind/dyn/example.org.zone"; allow-update { key rndc-key; }; }; zone "50.168.192.in-addr.arpa" { type master; file "/var/bind/dyn/example.org.rev.zone"; allow-update { key rndc-key; }; };
- ajoutez
192.168.50.0/24aux zones de confiance - spécifiez les serveurs DNS auxquels accéder (~8.8.8.8.8~) si le serveur actuel ne parvient pas à trouver le nom ou l'adresse IP de la requête
- ajoutez la zone directe
example.orget la zone inverse50.168.192.in-addr.arpa. - renseignez les adresses d'écoute
192.168.50.0/24 - autorisez l'hôte actuel à recevoir le contenu de la zone (transfert)
Créez les fichiers nécessaires pour les zones directe et inverse déclarées :
/var/bind/dyn/example.org.zone
$ORIGIN example.org. $TTL 86400 ; 1 day @ IN SOA ns1.example.org. root.example.org. ( 2018031401 ; Serial 10800 ; Refresh (3 hours) 3600 ; Retry (1 hour) 604800 ; Expire (1 week) 86400 ; Minimum (1 day) ) IN NS ns1.example.org. @ IN A 192.168.50.3 ns1 IN A 192.168.50.3 gw IN A 192.168.50.1 localhost IN A 127.0.0.1 dns IN A 192.168.50.3
/var/bind/dyn/example.org.rev.zone
$ORIGIN 50.168.192.in-addr.arpa. $TTL 86400 ; 1 day @ IN SOA ns1.example.org. root.example.org. ( 2018031401 ; Serial 10800 ; Refresh (3 hours) 3600 ; Retry (1 hour) 604800 ; Expire (1 week) 86400 ; Minimum (1 day) ) IN NS ns1.example.org. 1 IN PTR gw.example.org. 3 IN PTR ns1.example.org.
Configurez l'accès à ces zones-là :
chgrp -R named /var/bind/dyn
chmod 660 /var/bind/dyn/*
chmod 770 /var/bind/dyn
Dans les paramètres, ajoutez les lignes suivantes pour permettre la mise à jour des enregistrements lors de l'attribution d'une adresse IP.
/etc/dhcp/dhcpd.conf
ddns-update-style interim; # update static IPs registered in DHCP update-static-leases on; # use key from bind include "/etc/bind/rndc.key" zone example.org. { primary 127.0.0.0.1; key rndc-key; } zone 50.168.192.192.in-addr.arpa. { primary 127.0.0.0.1; key rndc-key; }
Ajoutez DNS à la liste de démarrage automatique, puis démarrez-le et redémarrez DHCP :
rc-update add named
rc-service named start
rc-service dhcpd restart
Désormais, chaque fois qu'une adresse IP est attribuée à un hôte, une entrée correspondante sera ajoutée aux fichiers de description de la zone (/var/bind/example.org.zone et /var/bind/example.org.rev.zone).
rndc sync
cat /var/bind/dyn/example.org.zone
$ORIGIN . $TTL 86400 ; 1 day example.org IN SOA ns1.example.org. root.example.org. ( 2018031406 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS ns1.example.org. $ORIGIN example.org. $TTL 3600 ; 1 hour client A 192.168.50.101 TXT "317e714be5304884a0829b791e1d79b481" $TTL 86400 ; 1 day dns A 192.168.50.3 gw A 192.168.50.1 localhost A 127.0.0.1 ns1 A 192.168.50.3 $ORIGIN .
cat /var/bind/dyn/example.org.rev.zone
$TTL 86400 ; 1 day 50.168.192.in-addr.arpa IN SOA ns1.example.org. root.example.org. ( 2018031402 ; serial 10800 ; refresh (3 hours) 3600 ; retry (1 hour) 604800 ; expire (1 week) 86400 ; minimum (1 day) ) NS ns1.example.org. $ORIGIN 50.168.192.in-addr.arpa. 1 PTR gw.example.org. $TTL 3600 ; 1 hour 100 PTR client.example.org. $TTL 86400 ; 1 day 3 PTR ns1.example.org.
Modifier les informations relatives aux zones
Les zones mises à jour dynamiquement peuvent être modifiées soit à l'aide d'un outil spécial, soit en éditant des fichiers placés dans /var/bind.
Actualiser les zones dynamiques avec nsupdate
On le trouve dans le paquet net-dns/bind-tools. Ce paquet contient également dig
, qui permet de décharger une zone.
Installez bind-tools :
emerge bind-tools
Pour récupérer le contenu de la zone example.org, exécutez :
; <<>> DiG 9.11.2-P1 <<>> -t axfr example.org. ;; global options: +cmd example.org. 86400 IN SOA ns1.example.org. root.example.org. 2018031402 10800 3600 604800 86400 example.org. 86400 IN NS ns1.example.org. client.example.org. 3600 IN A 192.168.50.100 client.example.org. 3600 IN TXT "3173d9bec89af77517b8cff6e3c19edb9f" dns.example.org. 86400 IN A 192.168.50.3 gw.example.org. 86400 IN A 192.168.50.1 localhost.example.org. 86400 IN A 127.0.0.1 ns1.example.org. 86400 IN A 192.168.50.3 example.org. 86400 IN SOA ns1.example.org. root.example.org. 2018031402 10800 3600 604800 86400 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Tu mar 15 15:12:23 MSK 2018 ;; XFR size: 9 records (messages 1, bytes 314)
Pour récupérer le contenu de la zone inversée, exécutez :
; <<>> DiG 9.11.2-P1 <<>> -t axfr 50.168.192.in-addr.arpa ;; global options: +cmd 50.168.192.in-addr.arpa. 86400 IN SOA ns1.example.org. root.example.org. 2018031402 10800 3600 604800 86400 50.168.192.in-addr.arpa. 86400 IN NS ns1.example.org. 1.50.168.192.in-addr.arpa. 86400 IN PTR gw.example.org. 100.50.168.192.in-addr.arpa. 3600 IN PTR client.example.org. 3.50.168.192.in-addr.arpa. 86400 IN PTR ns1.example.org. 50.168.192.in-addr.arpa. 86400 IN SOA ns1.example.org. root.example.org. 2018031402 10800 3600 604800 86400 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Tu mar 15 15:12:04 MSK 2018 ;; XFR size: 6 records (messages 1, bytes 246)
La mise à jour de la zone étant configurée avec la clé /etc/bind/rndc.key, celle-ci doit être transmise à l'utilitaire :
nsupdate -k /etc/bind/rndc.key
La ligne de commande va s'ouvrir, afin que vous puissiez utiliser le DNS. Pour obtenir la liste complète des commandes, exécutez help, pour quitter, exécutez +quit.
Pour supprimer l'entrée client.example.org de la zone, exécutez la commande suit :
nsupdate -k /etc/bind/rndc.key
del client.example.org send quit
Vous pouvez ajouter client.example.org à la zone example.org :
nsupdate -k /etc/bind/rndc.key
nxdomain client.example.org add client.example.org 3600 A 192.168.1.100 send quit
La commande nxdomain est utilisée pour vérifier qu'il n'y a pas d'entrée client.example.org dans le DNS. La commande add ajoute un enregistrement A à client.example.org correspondant à ~192.168.1.100~~ avec une heure de TTL (3600).
Vous pouvez utiliser CNAME+ pour attribuer un alias à une zone au lieu d'un enregistrement A (le nom de domaine correspondant à une adresse IP). Ajoutez l'entrée CNAME, comp1.example.org à client.example.org :
nsupdate -k /etc/bind/rndc.key
nxdomain comp1.example.org add comp1.example.org 3600 CNAME client.example.org send quit
Pour supprimer l'entrée 192.168.50.100 de la zone inverse, exécutez la commande suivante :
nsupdate -k /etc/bind/rndc.key
del 100.50.168.192.in-addr.arpa. send quit
Pour ajouter l'entrée inverse 192.168.50.100 sur client.example.org à la zone inverse, exécutez la commande suivante :
nsupdate -k /etc/bind/rndc.key
nxdomain 100.50.168.192.in-addr.arpa add 100.50.168.192.in-addr.arpa. 3600 PTR client.example.org. send quit
Modifier des descriptions de zones
Pour modifier manuellement les fichiers de la zone, il faut désactiver temporairement la modification dynamique, avant de procéder à la modification. Une fois les fichiers modifiés, vous devez à nouveau activer la modification dynamique :
rndc sync
rndc freeze example.org
/var/bind/dyn/example.org.zone
rndc reload example.org
rndc thaw example.org
où :
- rndc sync transfère les modifications temporaires du journal vers le fichier de description de la zone ;
- rndc freeze désactive la modification dynamique ;
- rndc reload permet de relire le fichier de description ;
- rndc thaw permet une modification dynamique.
Vous devez augmenter le numéro de série chaque fois que vous modifiez la zone.
$ORIGIN .
$TTL 86400 ; 1 day
example.org IN SOA ns1.example.org. root.example.org. (
2018031406 ; serial
10800 ; refresh (3 hours)
3600 ; retry (1 hour)
604800 ; expire (1 week)
86400 ; minimum (1 day)
)
NS ns1.example.org.
$ORIGIN example.org.
$TTL 3600 ; 1 hour
client A 192.168.50.101
TXT "317e714be5304884a0829b791e1d79b481"
$TTL 86400 ; 1 day
dns A 192.168.50.3
gw A 192.168.50.1
localhost A 127.0.0.1
ns1 A 192.168.50.3
Mettre à jour l'adresse MAC de l'hôte
L'entrée DNS ne sera pas actualisée si un nœud avec un nom d'hôte identique existe déjà dans la zone actuelle, même s'il a une adresse MAC différente. Cela peut également se produire si la carte réseau a été changée sur l'ordinateur. Consultez le journal système pour vérifier :
/var/log/message
Mar 14 17:17:22 dns named[2760]: client @0x7fd25c042070 127.0.0.1#21937/key rndc-key: updating zone 'example.org/IN': update unsuccessful: client.example.org: 'name not in use' prerequisite not satisfied (YXDOMAIN) Mar 14 17:17:22 dns named[2760]: client @0x7fd25c0389f0 127.0.0.1#21937/key rndc-key: updating zone 'example.org/IN': update unsuccessful: client.example.org/TXT: 'RRset exists (value dependent)' prerequisite not satisfied (NXRRSET) Mar 14 17:17:22 dns dhcpd[2629]: Forward map from client.example.org to 192.168.50.101 FAILED: Has an address record but no DHCID, not mine.
Si vous souhaitez que cette entrée soit actualisée ultérieurement à partir d'une nouvelle adresse MAC, vous devez supprimer manuellement l'entrée existante, de l'une des manières décrites ci-dessus.