Comment forcer un client DHCP à renouveller son adresse IP
L’autre jour un ami m’a demandé « Comment puis-je forcer un client DHCP à renouveler son adresse IP sur une station Ubuntu ou Debian comme on peut le faire dans le dans la famille des fenêtrés (pour ne pas les citer) par un simple « ipconfig /renew »? ».
Effectivement c’est une question intéressante à laquelle je vais tenter de répondre au travers de cet article.
On aurait pu penser qu’une option de la commande « ifconfig » permettrait cela aisément mais ce n’est pas le cas.
On peut aussi penser que de redémarrer tout simplement l’interface suffirait mais non (en tout cas pas sur un système à base Debian):
1 2 | $ sudo ifconfig eth1 down $ ifconfig eth1 up |
On pourrait également imaginer que le fait de redémarrer le service réseau (networking) suffirait mais la réponse est toujours négative.
Alors comment faire?
Pour pallier à cette problématique il existe le paquet dhcpN-client ou N correspondant à la version.
A l’instant où j’écris cet article la version disponible dans les dépôts officiels est la 3.
Ce paquet embarque le binaire « /sbin/dhclient »:
1 2 | $ type dhclient dhclient is hashed (/sbin/dhclient) |
Attention, un utilisateur ne disposant des privilèges « root » ne pourra pas utiliser ce binaire.
Pour forcer un client DHCP à libérer (release) une adresse IP il faut passer l’option « -r » ce qui nous donne pour l’interface réseau eth1:
1 2 3 4 5 6 7 8 9 10 11 12 | $ sudo dhclient -r eth1 There is already a pid file /var/run/dhclient.pid with pid 5075 killed old client process, removed PID file Internet Systems Consortium DHCP Client V3.1.1 Copyright 2004-2008 Internet Systems Consortium. All rights reserved. For info, please visit http://www.isc.org/sw/dhcp/ Listening on LPF/eth1/08:00:27:f9:d5:5c Sending on LPF/eth1/08:00:27:f9:d5:5c Sending on Socket/fallback DHCPRELEASE on eth1 to 10.0.2.2 port 67 |
A ce stade notre interface réseau ne dispose plus d’adresse IP:
1 2 3 4 5 6 7 8 | $ sudo ifconfig eth1 eth1 Link encap:Ethernet HWaddr 08:00:27:f9:d5:5c adr inet6: fe80::a00:27ff:fef9:d55c/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:30742 errors:0 dropped:0 overruns:0 frame:0 TX packets:17516 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 RX bytes:24139521 (23.0 MiB) TX bytes:1036322 (1012.0 KiB) |
Maintenant nous devons demander à notre client DHCP d’interroger le réseau (effectuer un broadcast) afin de récupérer une adresse IP qui lui permettra de dialoguer à nouveau avec le reste du réseau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ sudo dhclient eth1 Internet Systems Consortium DHCP Client V3.1.1 Copyright 2004-2008 Internet Systems Consortium. All rights reserved. For info, please visit http://www.isc.org/sw/dhcp/ Listening on LPF/eth1/08:00:27:f9:d5:5c Sending on LPF/eth1/08:00:27:f9:d5:5c Sending on Socket/fallback DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 5 DHCPOFFER from 10.0.2.2 DHCPREQUEST on eth1 to 255.255.255.255 port 67 DHCPACK from 10.0.2.2 bound to 10.0.2.15 -- renewal in 35265 seconds. |
Notre interface à bien récupérer une adresse IP:
1 2 3 4 5 6 7 8 9 | $ sudo ifconfig eth1 eth1 Link encap:Ethernet HWaddr 08:00:27:f9:d5:5c inet adr:10.0.2.15 Bcast:10.0.2.255 Masque:255.255.255.0 adr inet6: fe80::a00:27ff:fef9:d55c/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:30757 errors:0 dropped:0 overruns:0 frame:0 TX packets:17580 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 RX bytes:24143151 (23.0 MiB) TX bytes:1048463 (1023.8 KiB) |
Conclusion
J’espère que ce petit article vous sera utile. Si vous connaissez d’autres méthodes ou tout simplement comment on fait sur d’autres distributions n’hésitez pas à m’en faire part je complèterai ainsi l’article.


27 octobre 2011 à 20 h 01 min
Déconfigurer et reconfigurer l’interface voulue fonctionne aussi.
En 2 commandes, donc (avec wlan0 parce que je m’en sers avec celle-ci, lorsque j’active ou pas mon wifi pour des raisons d’économie de batterie):
#ifdown wlan0
#ifup wlan0
Et pour le faire en une seule ligne (mais toujours 2 commandes…)
#ifdown wlan0 && ifup wlan0
J’espère toujours trouver plus pratique quand même… parce que quand l’interface est désactivée alors que le matériel l’est aussi, elle met du temps à répondre.
Pour pallier à l’invonvénient des 2 commandes à tapper à la main, on peut en faire un script (a exécuter sous root, naturellement):
$echo #!/bin/sh >updown.sh
$echo ifdown $1 && ifup $1 >>updown.sh
$chmod +x updown.sh
#./updown.sh wlan0
Et si l’on souhaite qu’un utilisateur puisse s’en servir, il suffit de créer un groupe, d’accorder les droits d’exe de ce script à ce groupe et d’y ajouter les utilisateurs souhaités. Je vais pas écrire comment, je n’en suis pas sûr moi-même, je ne suis pas super bon dans ce domaine. Je sais juste que c’est possible, j’imagine que quelques recherches sur le net devraient permettre de le faire en un tour de main.
PS: le $ en début de ligne signifie bien sûr qu’il s’agit de commandes non root, contrairement au # qui implique d’être root. Que ce soit par un sudo ou par une connexion de l’utilisateur root directement (via su par exemple, chose que je préfère à sudo, question de goûts je dirai)
28 octobre 2011 à 12 h 04 min
Comme je l’ai spécifié en début de l’article le ifdown n’était pas suffisant car le bail DHCP n’est pas réinitialiser mais merci du commentaire qui, j’en suis certain, pourra être utile