Outils pour utilisateurs

Outils du site


serveur_dhcp

Ceci est une ancienne révision du document !


dhcp(d)

serveur

Installons :

 # apt-get install dhcp3-server

Ajoutons l'interface qu'on va ecouter pour repondre au requete dhcp

 # vi /etc/default/dhcp

Et avoir par exemple:

 # On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
 #       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
 INTERFACES="eth0"

Adaptons la configuration du dhcpd:

 # vi /etc/dhcp3/dhcpd.conf

Et par exemple:

 option domain-name "microsoft.com";
 option domain-name-servers 10.20.0.6, 212.27.33.1, 212.27.33.3;
 option subnet-mask 255.255.255.0;
 default-lease-time 86400;
 max-lease-time 172800;
 subnet 192.168.0.0 netmask 255.255.255.0 {
   range 192.168.0.1 192.168.0.50;
   default-lease-time 600; max-lease-time 7200;
   option subnet-mask 255.255.255.0;
   option broadcast-address 192.168.0.255;
   option routers 192.168.0.254;
   option domain-name-servers 212.27.39.2,212.27.32.5;
   option domain-name "microsoft.com";
 }

Et si on veut qu'une IP soit fixe pour une MAC:

 host kubulap {
   hardware ethernet 00:0b:cd:a7:0b:0c;
   fixed-address 192.168.0.200;
   default-lease-time 600; max-lease-time 7200;
   option subnet-mask 255.255.255.0;
   option broadcast-address 192.168.0.255;
   option routers 192.168.0.254;
   option domain-name-servers 212.27.39.2,212.27.32.5;
 }

Relancer dhcpd:

 # /etc/init.d/dhcpd3 restart

Voir ce qui ce passe:

 # tail -f /var/log/syslog

La base des IP liberes et utilisé est dans: /var/lib/dhcp3/dhcpd.leases

cd

status

Pour savoir l'etat des attributions, il faut regarder dans le fichier “dhcpd.leases”…

Scripte en Perl pour aider a la lecture: http://dhcpstatus.sourceforge.net/

Suivre la procedure d'installation:

# cd /usr/local/src
# wget http://prdownloads.sourceforge.net/dhcpstatus/dhcpstatus_0.60.tar.gz
# tar xvzf dhcpstatus_0.60.tar.gz

# mkdir /usr/local/dhcpstatus
# cd /usr/local/dhcpstatus
# tar -xvf /usr/local/src/dhcpstatus_0.60/libraries.tar

Et la doc dit:

So, there should now be a directory:

/usr/local/dhcpstatus

with library modules:

/usr/local/dhcpstatus/dhcpstatus/*.pm

and a .ini file:

/usr/local/dhcpstatus/dhcpstatus.ini

Ok.

Donc, on adapte dhcpstatus.ini pour avoir (a adapté selon le cas) :

title=DHCP Subnet Information
conf_file=/etc/dhcp/dhcpd.conf
leases_file=/var/lib/dhcp/dhcpd.leases
show_whole_subnet=0
screen_width=80

Et enfin:

# ln -s /usr/local/src/dhcpstatus_0.60/scripts/dhcpstatus /usr/local/bin

Et enfin:

$ dhcpstatus

dhcp relay

Lien: http://www.linux-france.org/prj/edu/archinet/systeme/ch29s03.html

Le but: servir du dhcp a un reseau dont on ne peut recevoir la couche 2 … enfin, les adresses MAC.

Etat du reseau:

Reseau "underworld.local"  <==> eth1 :: PC/Routeur :: eth0 <==> le grand reseau local <==> server-dhcp 
10.22.0.0/24                    10.22.0.1    |  192.168.0.53                         192.168.0.2
gateway:10.22.0.1                            |                   gateway: 192.168.0.254

Evidement, le “PC/Routeur” contient quelques regles IPTABLES pour permettre au reseau “underworld.local” de voyager sur le Net: ca ne sera pas le sujet ici.

Package

# aptitude update
# aptitude install dhcp3-relay

dhcp relay

L'installation est interactive, et au final, on peut avoir comme config:

# cat /etc/default/dhcp3-relay | grep -v "^#" | grep -v "^\s*$"
SERVERS="192.168.0.2"
INTERFACES="eth0 eth1"
OPTIONS=""

On peut aussi demarrer le “dhcp-relay” a partir du shell:

# dhcrelay3 -d -i eth1 -i eth0 192.168.0.2

dhcp server

Sur le “veritable” serveur dhcp, un client n'aura toujours pas d'IP puisque les logs disent:

... dhcpd: DHCPDISCOVER from aa:bb:cc:dd:ee:ff via 10.22.0.1: unknown network segment

Normal.

Declarons le segment (exemple):

subnet 10.22.0.0 netmask 255.255.255.0 {
    server-identifier 10.22.0.1;
    option domain-name-servers 192.168.0.2, 212.27.40.240, 212.27.40.241;
    option routers 10.22.0.1;
    option broadcast-address 10.22.0.255;
    option domain-name "underworld.local";
    range 10.22.0.128 10.22.0.254;
    default-lease-time 10800;
    max-lease-time 43200;
}

Ajoutons la route:

# route add -net 10.22.0.1 netmask 255.255.255.255 gw 192.168.0.53

Où “192.168.0.53” a la machine qui fait relay.

test

Sur le client final:

# dhclient

Et voila.

Le problème

Et ça, c'est du poulet ? : http://www.jusouschi.org/?do=howtos/dhcp

J'en vois au moins 1, et un beau:

J'aurai souhaité que le “dhcp-relay” n'ecoute qu'une interface pour ses clients, et recherche les reponses du “dhcp-server” sur une autre…
Ce n'est pas possible !!!!
Le “dhcp-relay” doit ecouter toutes les interfaces pour fonctionner, et donc, il va aussi repondre a des clients qui sont sur un autre reseau !!! Arg!

la solution

Utiliser “dhcp-helper”

dhcp-helper

“dhcp3-relay” etant mal conçu, j'essaye “dhcp-helper”.
(Aprés avoir virer “dhcp3-relay”)

# aptitude update
# aptitude install dhcp-helper

Et puis editer le fichier /etc/default/dhcp-helper afin d'avoir:

#DHCPHELPER_OPTS="-b eth0"
DHCPHELPER_OPTS="-s 192.168.0.2 -i eth1"

Et ca marche !

DHCP et DNS

Liens:

Le problème: les clients DHCP doivent automatiquement être enregistré dans le DNS… comment faire ?

On va creer un zone “local.tjaouen.fr” …

Ce qui pose 2 problèmes:

  • c'est un sous-zone local (“local…”).
  • le “.fr” est dans la zone “public”.

C'est ainsi a cause d'un vieux problème d'installation de mon domaine Windows LOCAL avec pour domain “thierry-jaouen.fr”.

secret

le DHCP et le DNS doivent partagé une clé secrete pour communiquer.

# cd /etc/bind
# mkdir keys
# chmod o-rx keys
# cd keys
# dnssec-keygen -a hmac-md5 -b 128 -n USER dhcpupdate-local-tjaouen-fr
Kdhcpupdate-local-tjaouen-fr.+xxx+xxxxx

On a donc 2 fichiers:

  1. rw——- 1 root bind 92 déc 36 12:03 Kdhcpupdate-local-tjaouen-fr.+xxx+xxxxx.private
  2. rw——- 1 root bind 69 déc 36 12:03 Kdhcpupdate-local-tjaouen-fr.+xxx+xxxxx.key

Le seul fichier qui nous interesse est le “.key” , qui contient:

dhcpupdate-local-tjaouen-fr. IN KEY 0 3 xxx N8HxxxxxxxxxxxxA==

C'est la partie “N8HxxxxxxxxxxxA==” qu'on va utiliser par la suite: les fichiers “.private” et “.key” ne nous serons pas utile pour la suite!

named.conf.local

On prépare l'usage de la clé :

key dhcpupdate-local-thierry-jaouen-fr {
  algorithm hmac-md5;
  secret "N8HxxxxxxxxxxxxA==";
};

On créé les zones “dynamique”:

zone "local.thierry-jaouen.fr" {
  type master;
  file "/etc/bind/UPDATE-LOCAL/db.local.thierry-jaouen.fr";
  allow-update { key dhcpupdate-local-thierry-jaouen-fr; };
};
zone "8.168.192.in-addr.arpa" {
  type master;
  file "/etc/bind/UPDATE-LOCAL/db.192.168.8";
  allow-update { key dhcpupdate-local-thierry-jaouen-fr; };
};

Pour les zones ci-dessus, on ajoutera, bien sur le “allow-query” qui va bien.

Mais aussi, si, il y a des problèmes avec des noms de machine qui contiennent des “_” :

check-names ignore;

Zones

Il faut aussi créer les fichiers “zone”, qu'on va mettre dans notre “LOCAL”:

Le fichier …./UPDATE-LOCAL/db.local.thierry-jaouen.fr :

;
; zone local.thierry-jaouen.fr
;
$TTL    3600
@               IN  SOA ns.thierry-jaouen.fr. root.thierry-jaouen.fr. (
                              2010122600   ; serial number
                              6h           ; refresh
                              1h           ; retry
                              1w           ; expire
                              1h           ; minimum TTL
)
; ----------------------------------------------------------------
@                       NS              ns.thierry-jaouen.local.
; ----------------------------------------------------------------
; EOF

le fichier …./LOCAL/db.192.168.8 :

;
; reverse
;
$TTL    3600
@               IN  SOA  ns.thierry-jaouen.fr. root.thierry-jaouen.fr. (
                              2010122600   ; serial number
                              6h           ; refresh
                              1h           ; retry
                              2w           ; expire
                              1h           ; minimum TTL
)
; ----------------------------------------------------------------
@                       NS      ns.thierry-jaouen.local.
; ----------------------------------------------------------------
; EOF

Sans oublier de mettre les *bons droits* :

# chown bind: /etc/bind/UPDATE-LOCAL/db.local.thierry-jaouen.fr
# chown bind: /etc/bind/UPDATE-LOCAL/db.192.168.8
# chmod g+ws /etc/bind/UPDATE-LOCAL
# chown root:bind /etc/bind/UPDATE-LOCAL

Donc: “bind” peut a la fois modifier “db.local.thierry-jaouen.fr” et “db.192.168.8”, ainsi que créer des nouveaux fichiers…

C'est fini pour “bind” aprés ça:

# rndc reload

(ou pire: /etc/init.d/bind reload )

On peut tester avec “nsupdate” , mais c'est j'ai pas tout compris: http://www.semicomplete.com/articles/dynamic-dns-with-dhcp/

dhcpd.conf

Configurer le dhcp serveur.

Dans la partie “global”:

ddns-update-style interim;
#update-static-leases on;
update-static-leases off;

update-conflict-detection false;

ignore client-updates;

#ddns-updates on;

option domain-name "thierry-jaouen.fr";

Dans la section qui fournit les IP/range: (A adapter)

subnet 192.168.8.0 netmask 255.255.255.0 {
  pool {
      allow members of "dyn-titi";

      option domain-name "thierry-jaouen.fr";

      option domain-name-servers 8.8.8.8, 8.8.4.4;
      option routers 192.168.8.1;

      ddns-domainname "local.thierry-jaouen.fr";

      allow unknown-clients;
      range 192.168.8.192 192.168.8.223;
  }

  key dhcpupdate-local-thierry-jaouen-fr {
      algorithm hmac-md5;
      secret N8HxxxxxxxxxxxxA==;
  };
  
  zone local.thierry-jaouen.fr. {
    primary 127.0.0.1;            # DNS serveur
    key dhcpupdate-local-thierry-jaouen-fr;
  }

  zone 8.168.192.in-addr.arpa. {
    primary 127.0.0.1;
    key dhcpupdate-local-thierry-jaouen-fr;
  }
  • “primary” est l'adresse du DNS.
  • “secret” sans “”

test

Ensuite, lorsqu'un windows va recuperer une IP, le dhcp va essayer d'enregistrer son nom sous la forme:

<NOM_DU_WINDOWS>.local.thierry-jaouen.fr

Ainsi que son IP en reverse.

On a alors le répertoire “LOCAL” avec de nouveaux fichiers comme:

db.local.thierry-jaouen.fr.jnl
db.192.168.8.jnl

Mise a jour de SubZone

Je vais maintenant me placer dans un cas plus courant.

Une classe d'IP est trés souvent diviser en 2 parties:

  1. des IP fixes
  2. des IP dynamiques

Pour notre cas:

  • ensemble du reseau local 192.168.8.0/24
  • Ip dynamique dans 192.168.8.192/27

Donc, IP dynamique de 192.168.8.192 a 192.168.8.223 .

Il n'est pas nécessaire que la plage d'IP dynamique respecte le format “a.b.c.d/X” : mais ca peut aider pour les “delegation de zone”.

named.conf.local

Dans “named.conf.local” (ou équivalent), on créé les zones qui vont mise à jour:

zone "dyn.thierry-jaouen.local" {
      type master;
      file "/etc/bind/UPDATE-LOCAL/db.dyn.thierry-jaouen.local";
      allow-update { key dhcpupdate-local-thierry-jaouen-fr; };
      check-names ignore;
      allow-query {
              mylan;
      };
};

zone "8.168.192.dyn-rev" {
      type master;
      file "/etc/bind/UPDATE-LOCAL/db.192.168.8.dyn-rev";
      allow-update { key dhcpupdate-local-thierry-jaouen-fr; };
      check-names ignore;
      allow-query {
              mylan;
      };
};

Pour la zone “reverse” on remplace le classique “in-addr.arpa” par autre chose, soit: “dyn-rev”.

:!: Pour que la zone puisse être créé sous Windows, ajouter toujours “in-addr.arpa” a la fin.
Exemple: dyn-rev.in-addr.arpa

Il n'est pas nécessaire de faire un truc comme cela: zone “192/27.8.168.192.in-addr.arpa” … … simplement parce que la conf du serveur dhcp (voir plus loin) ne pourra exprimer la sous-zone de la sorte. (sauf erreur de ma part !)

Fichiers Zones

Créer les fichier “db.dyn.thierry-jaouen.local” et “db.192.168.8.dyn-rev” comme vu plus haut.

Pour mémoire:

# cd /etc/bind
# mkdir UPDATE-LOCAL
# chmod g+w UPDATE-LOCAL

Le fichier /etc/bind/UPDATE-LOCAL/db.dyn.thierry-jaouen.local :

$TTL 3600       ; 1 hour
@                       IN SOA  ns.thierry-jaouen.local. root.thierry-jaouen.local. (
                              2011022500 ; serial
                              21600      ; refresh (6 hours)
                              3600       ; retry (1 hour)
                              604800     ; expire (1 week)
                              3600       ; minimum (1 hour)
                              )
@                       NS      ns.thierry-jaouen.local.

Le fichier /etc/bind/UPDATE-LOCAL/db.192.168.8.dyn-rev :

$TTL 3600       ; 1 hour
@           IN SOA      ns.thierry-jaouen.local. root.thierry-jaouen.local. (
                              2011022500 ; serial
                              21600      ; refresh (6 hours)
                              3600       ; retry (1 hour)
                              604800     ; expire (1 week)
                              3600       ; minimum (1 hour)
                              )
@                       NS      ns.thierry-jaouen.local.

dhcpd.conf

Comme vu plus haut, ou presque:

subnet 192.168.8.0 netmask 255.255.255.0 {
  pool {
    allow members of "dyn-titi";

    #option domain-name "local.thierry-jaouen.local";

    option domain-name-servers 8.8.8.8, 8.8.4.4;
    option routers 192.168.8.1;

    ddns-domainname "dyn.thierry-jaouen.local";
    ddns-rev-domainname "dyn-rev";

    allow unknown-clients;
    range 192.168.8.192 192.168.8.223;
  }

  key dhcpupdate-local-thierry-jaouen-fr {
    algorithm hmac-md5;
    secret N8HxxxxxxxxxxxxA==;
  };

 zone dyn.thierry-jaouen.local. {
    primary 127.0.0.1;
    key dhcpupdate-local-thierry-jaouen-fr;
  }

  zone 6.168.192.dyn-rev. {
    primary 127.0.0.1;
    key dhcpupdate-local-thierry-jaouen-fr;
  }

C'est ddns-domainname et ddns-rev-domainname qui vont correctement definir les zones a modifier dans “bind”.

:!: A ce stade, la mise a jour fonctionne : mais pas le “reverse” de la resolution DNS

resolution inverse

Retour dans la configuration de “bind”, parce que la resolution inverse des IP dynamiques ne fonctionne pas encore !

Il faut ajouter dans le fichier “reverse” de la classe “192.168.8” , ceci:

; -------------
; 192.168.6.192 .. 223
; DYNAMIQUE IP
; ---------------------------------------------------------------
$GENERATE 192-223 $ CNAME $.8.168.192.dyn-rev.
; ---------------------------------------------------------------

Ce qui créé (virtuellement) des lignes comme cela:

192 CNAME 192.8.168.192.dyn-rev.
193 CNAME 193.8.168.192.dyn-rev.
... etc ...
223 CNAME 223.8.168.192.dyn-rev.

Ce qui va forcer la resolution inverse dans la zone qu'on a précédement créée.

serveur_dhcp.1323091155.txt.gz · Dernière modification : 2011/12/05 13:19 de thierry