DHCP

Updated 21 Septembre 2021

DHCP

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 :

/etc/bind/named.conf
/*
 * 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/24 aux 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.org et la zone inverse 50.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).

Avis d'utilisateurs

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 -t axfr example.org.
; <<>> 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 -t axfr 50.168.192.in-addr.arpa
; &lt;&lt;&gt;&gt; DiG 9.11.2-P1 &lt;&lt;&gt;&gt; -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.

Exemple
$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.