arp proxy et dhcp relay

Sous ce titre pompeux se cache en fait un problème tout simple qui vous est certainement déjà arrivé: la *box est branchée sur la prise téléphonique qui se trouve être loin de l’endroit ou se concentrent les machines à brancher sur le net. Pour régler ce problème il y a plusieurs solutions:

  • Tirer un câble de 20m de la *box vers un switch où se branchent les autres machines, en espérant que le câble passe sous les portes. Pas top.
  • Avoir du wifi sur toutes les machines, c’est loin d’être le cas chez moi.
  • Avoir du CPL entre la box et le switch. Je n’en ai pas.

Une autre solution c’est d’avoir une machine allumée 24h/24 avec wifi et lien filaire vers le switch, c’est la solution que j’ai retenue. Sauf que faire un bridge wlan0 <=> eth0 c’est pas si simple que ça en a l’air, il y a bien une solution avec ebtables, mais avec ma carte wifi et son driver proprio ça ne fonctionne pas, le lien wifi boucle entre connexion et déconnexion.

J’ai donc cherché à faire autrement, le NAT j’aime pas trop parce que ça m’obligerais à avoir deux réseau puis a pusher la nouvelle route sur tous mes réseaux (vpn etc). J’ai donc trouvé une solution avec un proxy arp.

C’est assez simple:

iface eth0 inet static
address 192.168.31.253
broadcast 192.168.31.255
netmask 255.255.255.0
# Empèche ifup d'ajouter la route 192.168.31.0/24 sur eth0
up ip route del 192.168.31.0/24 dev eth0
# On doit avoir une route pour chaque machine derrière le switch
# Ici 192.168.31.3
up ip route add 192.168.31.3/32 dev eth0

iface wlan0 inet static
wpa-ssid rhizome # J'aime mon ssid :)
wpa-psk SECRET
address 192.168.31.253
broadcast 192.168.31.255
netmask 255.255.255.0
gateway 192.168.31.1

Et activer le proxy arp dans /etc/sysctl.conf

net.ipv4.conf.all.proxy_arp=1

Ensuite, comme je suis feignant, j’aimerais bien que ma machine 192.168.31.3 obtienne son IP par dhcp, il suffit d’utiliser dhcprelay:

apt-get install isc-dhcp-relay

Le script post-inst nous demande l’IP du serveur dhcp et voilà.

Pour aller encore plus loin dans l’automatisation, j’aurais aimé rajouter les routes sur eth0 automatiquement, j’ai trouvé une solution très moche en coupant mon /24 en deux /25 et d’utiliser l’option dhcp agent.circuit-id pour allouer l’adresse IP dans un des deux blocs suivant si le dhcp-relay a été utilisé, au final c’était vraiment trop moche alors je l’ai pas fait.

Pour expérimenter différents setup, j’ai utilisé un script permettant de simuler un environnement réseau avec User Mode Linux et des switchs virtuels avec vde.

J’ai commité mes tests sur github.

git clone git://github.com/philpep/network-lab.git
cd network-lab
git checkout -b lab-arp-proxy-dhcp origin/lab-arp-proxy-dhcp
cd lab-arp-proxy-dhcp
./setup