quentin.dufour.io/_posts/2017-02-10-dhcp-gateways.md

117 lines
4.4 KiB
Markdown
Raw Normal View History

2017-02-10 13:00:05 +00:00
---
layout: post
2017-02-10 13:24:16 +00:00
slug: passerelles-et-dhcp
2017-02-10 13:00:05 +00:00
status: published
2017-02-10 13:24:16 +00:00
title: DHCP et la gestion des passerelles
description: DHCP DISCOVER
2017-02-10 13:00:05 +00:00
disqus: true
categories:
- systeme
- linux
tags:
---
Après une récente modification de mon serveur DHCP, je me retrouvais dans l'impossibilité de connecter une tablette à mon réseau.
Cette dernière restait bloquée à `Récupération de l'adresse IP`. Après avoir un peu cherché sur internet, je n'ai pas trouvé de solution satisfaisante.
Le serveur DHCP fonctionnait avec les autres ordinateurs.
2017-02-10 13:24:16 +00:00
## Le protocole
C'est une version simplifiée et probablement plutot fausse des échanges de message entre un client et un serveur DHCP.
Il faut savoir que certains messages sont envoyés en UNICAST, d'autres en BROADCAST, qu'il y a d'autres messages et bein d'autres cas.
2017-02-10 13:00:05 +00:00
```raw
2017-02-10 13:14:39 +00:00
Client Serveur
|---- DISCOVER --->|
|<----- OFFER -----|
|---- REQUEST ---->|
|<------ ACK ------|
2017-02-10 13:00:05 +00:00
```
2017-02-10 13:24:16 +00:00
Pour faire simple, le client demande une adresse, le serveur lui en propose une, le client la prend, le serveur accuse bonne réception.
2017-02-10 13:00:05 +00:00
2017-02-10 13:24:16 +00:00
*Il est intéressant de noter que BOOTP est l'ancêtre de DHCP et que DHCP est rétro compatible avec BOOTP. De ce fait, la plus part du paquet DHCP va être vide, et les paramètres DHCP vont se trouver dans les options du paquet BOOTP.*
2017-02-10 13:00:05 +00:00
2017-02-10 13:24:16 +00:00
## Logs
2017-02-10 13:14:39 +00:00
2017-02-10 13:24:16 +00:00
J'ai commencé par regarder les logs de `isc-dhcp-server` :
2017-02-10 13:00:05 +00:00
```raw
dhcpd[2207]: DHCPREQUEST for 192.168.1.77 (192.168.1.254) from aa:aa:aa:aa:aa:aa (android-xx) via br0
dhcpd[2207]: DHCPOFFER on 192.168.1.77 to aa:aa:aa:aa:aa:aa (android-xx) via br0
dhcpd[2207]: DHCPREQUEST for 192.168.1.77 (192.168.1.254) from aa:aa:aa:aa:aa:aa (android-xx) via br0
dhcpd[2207]: DHCPOFFER on 192.168.1.77 to aa:aa:aa:aa:aa:aa (android-xx) via br0
```
2017-02-10 13:24:16 +00:00
J'ai des doutes sur la terminologie utilisée par le serveur DHCP vis à vis du nom des messages envoyés sur le réseau.
D'autant que Bootp utilise aussi les termes Request et Reply pour des cas différents :
* Une *Request* Bootp peut-être un message *Discover* DHCP
* Un *Reply* Bootp peut-être un message *Offer* DHCP
2017-02-10 13:14:39 +00:00
Il semble ici que le terme *DHCPREQUEST* fasse référence à un message *DISCOVER* DHCP.
2017-02-10 13:00:05 +00:00
2017-02-10 13:24:16 +00:00
Je suppose donc que la tablette envoie des requêtes *DISCOVER* et que le serveur lui envoie un paquet *OFFER* auquel la tablette ne répond pas.
2017-02-10 13:00:05 +00:00
## Modification de la configuration en aveugle
J'ai donc modifié la configuration de mon serveur DHCP en la simplifiant le plus possible, jusqu'à ce que ma tablette réussisse à se connecter.
Le coupable était la ligne :
```raw
option routers 192.168.1.254, 192.168.1.1;
```
En ne spécifiant qu'une seule passerelle, le problème est résolu :
```raw
option routers 192.168.1.254;
```
Mais d'où vient ce problème ?
## Traffic réseau
Je me suis demandé ce que pouvait bien envoyer `isc-dhcp-server` à ma tablette pour qu'elle n'en veuille pas.
J'ai donc comparé les paquets envoyé avec les deux configurations différentes.
Pour écouter le traffic réseau j'ai utilisé `tcpdump`. L'option `-vv` est bien pratique car elle permet d'expliquer le contenu du paquet.
Dans le cas d'un protocole inconu, `-XX` permet d'avoir un hexdump. Les deux sont combinables.
```raw
sudo tcpdump -i br0 -vv -e -n port 67 or port 68 and ether host aa:aa:aa:aa:aa:aa
```
2017-02-10 13:14:39 +00:00
Tout d'abord, dans le mode avec les deux gateways, on observe en boucle un message `DISCOVER` suivi d'un message `OFFER` et jamais de paquet `REQUEST`.
2017-02-10 13:24:16 +00:00
Ce qui confirme bien ma thèse suite à la lecture des logs.
2017-02-10 13:14:39 +00:00
Les paquets `OFFER` sont quasiment identiques. Les deux seules différences sont :
* Celui avec les deux gateways fait 4 octets de plus (on notera que c'est aussi la taille d'une ipv4).
* Des valeurs générés aléatoirements sont aussi différentes.
2017-02-10 13:00:05 +00:00
En tout cas, `tcpdump` n'a pas de problème à décoder nos champs `gateway` dans les deux cas.
```raw
Default-Gateway Option 3, length 4: 192.168.1.254
```
```raw
Default-Gateway Option 3, length 8: 192.168.1.254,192.168.1.1
```
2017-02-10 13:24:16 +00:00
A la suite de ça, je suppose donc que c'est le client DHCP qui ne sait pas quoi faire de ces deux gateways.
2017-02-10 13:00:05 +00:00
## Etude du client DHCP
Le protocole DHCP indique que le client doit envoyer son nom :
```raw
Vendor-Class Option 60, length 16: "android-dhcp-6.0"
```
2017-02-10 13:24:16 +00:00
Je connais maintenant le nom du client DHCP utilisé par la tablette.
Mais comment débugger ça du côté d'Android ? Retouver le code source ? Regarder les logs ? Mais où et comment faire quand on est pas root ?
2017-02-10 13:14:39 +00:00
2017-02-10 13:00:05 +00:00
*A suivre*