Annexe H. Monter un proxy-ARP

1. L'idée
2. Le principe de fonctionnement
3. Montage
[Note] Note

Annexe écrite à partir d'une première version de Robert Cheramy.

[Important] Important

Cette partie requiert des connaissances de base en réseau Ethernet et IP. Lien vers une formation VIA à ce sujet.

1. L'idée

Le proxy-ARP rejoint le principe du bridge (expliqué au Chapitre 39) dans le sens où il permet de connecter plusieurs machines au réseau avec une machine centrale sous Linux. Par contre, contrairement au bridge qui agit au niveau Ethernet (i.e. layer 2), le proxy-ARP agit au niveau IP (i.e. layer 3). Cette annexe va donc vous apprendre à faire des tables de routage sous Linux !

Figure H.1. Schéma d'un proxy-ARP

Schéma d'un proxy-ARP

2. Le principe de fonctionnement

La théorie

Le proxy-ARP marche un peu comme un routeur :

  • points communs : il possède une table de routage et modifie les headers du niveau 2 en regardant les headers du niveau 3 ;

  • différences : les clients qui sont derrière le proxy-ARP sont configurés normalement, comme si le proxy-ARP n'existait pas.

En pratique

  • Communication de la machine extérieur1 vers la machine client1 :

    1. La machine extérieur1 émet une requête ARP :

      "Qui est client1 ?" [ARP who-has client1]
      
    2. Le proxy-arp répond à la place de client1 :

      "Je suis client1, j'attends tes paquets" [ARP client1 is-at MAC_de_proxy-arp].
      
    3. Désormais, la machine extérieur1 va transmettre tous ses paquets à destination de client1 à proxy-arp. Proxy-arp se charge ensuite de les retransmettre à client1 en mettant sa MAC comme MAC source.

  • Communication de client1 vers extérieur1 :

    1. La machine client1 émet une requête ARP :

      "Qui est extérieur1 ?" [ARP who-has extérieur1]
      
    2. Le proxy-arp répond à la place d' extérieur1 :

      "Je suis extérieur1, j'attends tes paquets" [ARP extérieur1 is-at MAC_de_proxy-arp].
      
    3. Désormais, la machine client1 va transmettre tous ses paquets à destination d' extérieur1 à proxy-arp. Proxy-arp se charge ensuite de les retransmettre à extérieur1 en mettant sa MAC comme MAC source.

3. Montage

3.1. Préliminaires

Tout d'abord, la machine qui sert de proxy-ARP doit avoir plusieurs cartes réseau (autant que de machines derrière le proxy-ARP plus une carte réseau à connecter vers le réseau extérieur). Les modules correspondant à ces multiples cartes réseau doivent être compilés et installés. Les alias faisant la correspondance entre les interfaces réseau et les noms des modules à charger doivent être écrits dans un fichier du type /etc/modprobe.d/reseau contenant :

alias eth0 nom_du_module_de_la_carte_réseau_n°1
alias eth1 nom_du_module_de_la_carte_réseau_n°2
alias eth2 nom_du_module_de_la_carte_réseau_n°3

N'oubliez pas d'exécuter la commande update-modules après toute modification d'un fichier dans le répertoire /etc/modprobe.d/.

Vérifiez que toutes vos cartes réseau sont bien reconnues au démarrage.

3.2. Configuration du réseau du proxy-ARP

Pour plus de précisions concernant ce qui suit, je vous invite à consulter man interfaces et man route.

Nous allons maintenant modifier le fichier de configuration des interfaces réseau /etc/network/interfaces en utilisant mon fichier de configuration d'exemple et en le personnalisant :

# mv /etc/network/interfaces /etc/network/interfaces.old
# cp ~/fichiers-config/interfaces-proxy-arp /etc/network/interfaces

ou :

% wget http://formation-debian.via.ecp.fr/fichiers-config/interfaces-proxy-arp
# mv /etc/network/interfaces /etc/network/interfaces.old
# mv interfaces-proxy-arp /etc/network/interfaces

Personnalisez le nouveau fichier /etc/network/interfaces ; les lignes de commentaire doivent vous permettre de comprendre chaque paramètre :

# /etc/network/interfaces
# Fichier de configuration d'exemple des interfaces réseau
# pour faire un Proxy-ARP
# Formation Debian GNU/Linux par Alexis de Lattre
# http://formation-debian.via.ecp.fr/

# Plus d'informations dans "man interfaces" et "man route"


# L'interface de loopback
auto lo
iface lo inet loopback
    # Activation du "forwarding IP" et du "proxy-arp" au niveau du noyau :
    up echo "1" > /proc/sys/net/ipv4/ip_forward
    up echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp

# Configuration de l'interface eth0, connectée au réseau extérieur
auto eth0
iface eth0 inet static
    # Adresse IP du proxy-arp :
    address 192.168.0.12
    # Masque de sous-réseau du réseau extérieur :
    netmask 255.255.255.0
    # Adresse de la passerelle du réseau extérieur :
    gateway 192.168.0.1

# Configuration de l'interface eth1, connectée à client1
auto eth1
iface eth1 inet static
    # Adresse IP du proxy-arp :
    address 192.168.0.12
    # Masque du sous-réseau du réseau extérieur :
    netmask 255.255.255.0
    # Route qui dit que client1 est derrière eth1 :
    up route add 192.168.0.42 dev eth1
    # Suppression d'une route ajoutée à tort par la ligne précédente
    # 192.168.0.0 = adresse du réseau extérieur
    # 255.255.255.0 = masque de sous-réseau du réseau extérieur
    up route del -net 192.168.0.0 netmask 255.255.255.0 dev eth1

# Configuration de l'interface eth2, connectée à client2
auto eth2
iface eth2 inet static
    # Adresse IP du proxy-arp :
    address 192.168.0.12
    # Masque du sous-réseau du réseau extérieur :
    netmask 255.255.255.0
    # Route qui dit que client2 est derrière eth2 :
    up route add 192.168.0.43 dev eth2
    # Suppression d'une route ajoutée à tort par la ligne précédente
    # 192.168.0.0 = adresse du réseau extérieur
    # 255.255.255.0 = masque de sous-réseau du réseau extérieur
    up route del -net 192.168.0.0 netmask 255.255.255.0 dev eth2

Relancez la configuration des interfaces réseau :

# /etc/init.d/networking restart

Vérifiez que les changements ont bien été pris en compte :

% ifconfig

Vérifiez que la table de routage est bonne :

% route -n

Dans l'exemple de ce chapitre, la table de routage est la suivante :

Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
192.168.0.42  0.0.0.0         255.255.255.255 UH    0      0        0 eth1
192.168.0.43  0.0.0.0         255.255.255.255 UH    0      0        0 eth2
192.168.0.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.0.1   0.0.0.0         UG    0      0        0 eth0

3.3. Configuration du réseau des clients

Configurer un client Linux

La configuration des clients est strictement identique à la configuration qu'ils auraient s'ils n'étaient pas derrière le proxy-ARP. Par contre, il faut définir leur IP en dur, pas par DHCP, car le broadcast est bloqué par le proxy-ARP.

Si le client est aussi une Debian, éditez le fichier /etc/network/interfaces :

# /etc/network/interfaces de client1

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    # Adresse IP de client1 :
    address 192.168.0.42
    # Masque de sous-réseau du réseau extérieur :
    netmask 255.255.255.0
    # Adresse de la passerelle du réseau extérieur :
    gateway 192.168.0.1

Pour que le système tienne compte des modifications :

# /etc/init.d/networking restart
Reconfiguring network interfaces: done.

Configurer un client Windows

La configuration Windows est semblable, si vous avez compris, ça devrait aller.

Faire du DHCP relay

Le proxy-ARP bloque le broadcast des clients ; donc si ces derniers font une requête DHCP, elle n'atteindra pas le réseau extérieur. Pour pallier ce problème et faire en sorte que les clients puissent être configurés par DHCP, il faut installer un relais DHCP sur le proxy-ARP.

Pour cela, installez le paquet suivant :

# aptitude install dhcp3-relay

Lors de la configuration du paquet, il vous demande :

  1. What DHCP servers should the DHCP relay forward requests to ? Entrez l'adresse IP du serveur DHCP du réseau extérieur.

  2. On what network interfaces should the DHCP server listen ? Si toutes les interfaces sont utilisées pour faire le proxy-ARP, comme c'est le cas dans cet exemple, laissez le champ vide et validez.

Le fichier de configuration /etc/default/dhcp3-relay est alors généré, et le démon dhcrelay3 lançé. Si vous avez besoin d'arrêter ou de relancer le démon, utilisez le script /etc/init.d/dhcp3-relay avec le bon argument.

Vous pouvez maintenant configurer le réseau de client1 et client2 par DHCP.

3.4. Astuce

Pensez a rajouter les IP de client1, client2 et proxy-arp dans les /etc/hosts des trois machines ; c'est plus pratique pour travailler quand on est coupé du réseau...