blog:invites_et_dhcp

Invités et DHCP

Position du problème : sur un réseau 192.0.2.0/24, on veut :

  • deux plages :
    1. 192.0.2.32/27 : pour les invités, adressage dynamique ;
    2. 192.0.2.96/27 : pour les clients connus, adressage statique.
  • la mise à jour automatique des enregistrements DNS par le serveur DHCP.

Ainsi, en séparant les deux, le filtrage sera facilité par le masque distinct entre les deux plages.

En suivant pas à pas le manuel de dhcpd.conf(5) et Dynamic DNS and DHCP - Easy to do, and you'll thank yourself later, c'est facile.

Pour commencer, définissons les deux plages dans dhcpd.conf :

subnet 192.0.2.0 netmask 255.255.255.0 {
        option routers 192.0.2.254;
        option subnet-mask 255.255.255.0;
        option domain-name "local";
        option domain-name-servers 192.0.2.2;
        option ip-forwarding off;

        pool {
                deny known clients;
                range 192.168.1.33 192.168.1.61;
        }
        pool {  
                deny unknown-clients;
                option log-servers 192.0.2.3;
                next-server 192.0.2.4;
                filename "pxeboot_ia32.bin";
                option root-path "/usr/exports/amd64";
                range 192.168.1.96 192.168.1.126;
        }
}

On a défini :

  • une plage de clients connus : 192.0.2.96/27 ; on offre un serveur de boot et un serveur syslog(3) à ces clients ;
  • une plage d'inconnus : 192.0.2.32/27.

Après, on ajoute les hôtes connus pour lesquels on fait de l'adressage statique :

host foo { hardware ethernet 01:23:45:67:89:ab; fixed-address 192.0.2.115; }

À ce stade, les clients invités obtiennent une adresse IPv4 dans 192.0.2.32/27 mais sont encore inconnus du DNS.

Créons un secret partagé (clef TSIG) :

$ sudo dnssec-keygen -a hmac-md5 -b 128 -n USER DHCPUPDATE

il en résulte deux fichiers lisibles (bien vérifier !) uniquement par root :

  • Kdhcpupdate.+157+08719.key
  • Kdhcpupdate.+157+08719.private

Le fichier Kdhcpupdate.+157+08719.key contient par exemple :

DHCPUPDATE. IN KEY 0 3 157 WwxcUmpO0fhxiu4nEDG6dA==

Le dernier champ est notre secret partagé, seul ce champ nous intéresse.

Ensuite, adaptons les deux zones DNS dans /etc/named.conf :

  • ajoutons tout en haut de named.conf la clef :
key DHCPUPDATE {
        algorithm hmac-md5;
        secret WwxcUmpO0fhxiu4nEDG6dA==;

};
  • enfin, indiquons au serveur que cette clef sert à mettre à jour les zones :
zone "2.0.192.in-addr.arpa" {
        type master;
        file "db.192.0.2";
        allow-query { any; };
        allow-update { key DHCPUPDATE; };
};

zone "local" {
        type master;
        file "db.local";
        allow-query { any; };
        allow-update { key DHCPUPDATE; };
};

Relancer named(8) et s'assurer qu'il fonctionne après avoir enregistré ces modifications. À ce stade, le serveur DNS est prêt à recevoir les notifications de mises à jour.

Dernière étape : le DHCP. Indiquons à dhcpd(8) qu'il doit mettre à jour le serveur DNS pour le pool 192.0.2.32/27 :

  • modifier les droits sur le fichier dhcpd.conf, seul root doit maintenant pouvoir le lire étant donné que la clef va y être enregistrée en clair ;
  • parmi les options globales (en haut) dans dhcpd.conf, ajouter la clef et l'associer aux zones à mettre à jour :
key DHCPUPDATE {
        algorithm hmac-md5;
        secret "WwxcUmpO0fhxiu4nEDG6dA==";
}
zone 2.0.192.in-addr.arpa {
        primary ns-server.local;
        key DHCPUPDATE;
}
zone local. {
        primary ns-server.local;
        key DHCPUPDATE;
}
  • enfin, modifier le pool dynamique comme suit :
        pool {
                deny known clients;
                ddns-domainname local;
                range 192.0.2.33 192.0.2.61;
                ddns-hostname = concat ("dhcp-", binary-to-ascii (10, 8, "-", leased-address));
        }

La dernière ligne forme un nom basé sur l'adresse IP allouée et préfixée par dhcp-.

Relancer le daemon DHCP après enregistrement de ces modifications. S'assurer une dernière fois que les fichiers où est stockée la clef partagée ne sont lisibles que par root et que les daemons fonctionnent malgré ces modifications.

Plus qu'à tester avec un client. Ici, le client obtient 192.0.2.61 ; dans le journal, named(8) dit :

update-security: info: client 192.0.2.2#57804: signer "dhcpupdate" approved
update: info: client 192.0.2.2#57804: updating zone 'local/IN': adding an RR at 'dhcp-192-0-2-61.local' A
update: info: client 192.0.2.2#57804: updating zone 'local/IN': adding an RR at 'dhcp-192-0-2-61.local' TXT
notify: info: zone local/IN: sending notifies (serial 2011071317)
update-security: info: client 192.0.2.2#57802: signer "dhcpupdate" approved
update: info: client 192.0.2.2#57802: updating zone '2.0.192.in-addr.arpa/IN': deleting rrset at '61.2.0.192.in-addr.arpa' PTR
update: info: client 192.0.2.2#57802: updating zone '2.0.192.in-addr.arpa/IN': adding an RR at '61.2.0.192.in-addr.arpa' PTR
notify: info: zone 2.0.192.in-addr.arpa/IN: sending notifies (serial 2011071317)

Testons :

$ host 192.0.2.61
61.2.0.192.in-addr.arpa domain name pointer dhcp-192-0-2-61.local.
$ host dhcp-192-0-2-61.local.
dhcp-192-0-2-61.local has address 192.0.2.61

Le DNS a bien été mis à jour.

  • blog/invites_et_dhcp.txt
  • Dernière modification : 2011/09/06 06:46
  • de pc