Partage de connexion

De ArchwikiFR


Sommaire

Que veut-on faire ?

Vous avez une machine A connectée à un réseau X, et une (ou plus) machine B connectée à la machine A via un réseau Y.

Vous souhaitez que les machines du réseau Y puissent accéder au réseau X (ainsi qu'aux autres réseaux que la machine A peut joindre par X).

Dans l'exemple ci-dessous, on voudrait bien que B1 et B2 puissent accéder à Internet.

Schema passerelle.png

Eh bien c'est possible: il suffit de suivre le guide.

Note: Ce schema n'est qu'un exemple, vous n'êtes bien sûr pas obligé d'être dans la même configuration.
Note: La machine A ne sera en rien bloquée par sa configuration de passerelle; elle pourra toujours accéder à internet de son coté.

Réalisation

On imagine qu'on est dans une configuration similaire à celle du schema: la machine A est connectée à X via le wi-fi (interface wlan0, ip 192.168.1.156, accès à internet) et à Y via ethernet (interface eth0, pas encore d'IP).

Mettre en place le réseau Y

Si A et B peuvent déjà se pinger, sautez cette étape (carrément ! ;).

Le but du jeu ici est de rendre possible la communication entre A et B via la réseau Y. Pour ça, il suffit de leur attribuer des IP (après avoir branché le(s) cable(s) ...).

Important: Faites attention à la plage d'adresse que vous choisissez pour votre réseau Y: il ne faut pas qu'il y ai de confusion vis-à-vis de X, sinon la table de routage de A va être ambigue. Généralement, on a pour nos réseaux locaux des adresses en 172.16.*.* ou 192.168.*.*, alors si votre réseau X utilise l'un, utilisez l'autre sur Y.

Sur A:

ifconfig eth0 172.16.0.1 up

Sur B:

ifconfig eth0 172.16.0.2 up
Note: Si vous avez d'autres machines dans Y, faites la même chose dessus, en incrémentant à chaque fois le dernier chiffre (il ne faut pas que 2 PC aient la même IP dans le même réseau.

Normalement, il n'en faut pas plus pour que vos machines du réseau Y puissent se parler. Testez avec des ping, si vous voulez vérifier.

Configurer B

Important: Ne touchez pas à A, dans cette section ! Si vous demandez à A de s'utiliser lui même comme passerelle, ca va tout de suite moins bien fonctionner ;-)

Paserelle par défaut

On va maintenant dire à B d'utiliser A comme passerelle si on veut joindre quelqu'un qui n'est pas dans le réseau Y.

Pour cela, on va ajouter une route par defaut dans la table de routage de B:

route add -net 0.0.0.0 gw 172.16.0.1 dev eth0
Note: Remplacez 172.16.0.1 par l'adresse de A sur Y, si vous lui en avez donné une differente (en 192.168.*.* par exemple).
Note: Si vous avez d'autres machines sur Y, lancez la même commande dessus.

Serveur DNS

On veut bien sûr que B puisse naviguer sur internet autrement qu'en indiquant les IP de ses destinataires ...

On va donc lui dire quel serveur DNS utiliser. Pour cela, on met dans le /etc/resolv.conf de B:

nameserver 208.67.222.222
Note: 208.67.222.222 est l'adresse IP du serveur de nom primaire d'OpenDNS. Si vous voulez mettre autre chose (celui de votre FAI, ou votre box, ou je ne sais quoi), ne vous gênez pas.

Configurer A

Important: Ne touchez plus à B.

Activer l'IP forwarding

Par défaut, les paquets qui ne nous sont pas destinés (du point de vue IP) sont jetés par le noyau.

La première étape consiste donc à lui dire de relayer de tels paquets:

echo 1 > /proc/sys/net/ipv4/ip_forward

Activer le (S)NAT

Bon, là, vous vous demandez sûrement "Pourquoi il y a encore une section !? J'ai activer le forwarding, c'est bon, non !?".

Et bien non, ce n'est pas fini: pour le moment, votre machine A relaie bien les paquets venant de B sur X, mais elle ne touche pas au-dit paquets.

Imaginons un instant que B veuille joindre une machine C se trouvant dans X. C va recevoir un paquet venant de 172.16.0.2 et, ne connaissant pas le réseau 172.16.*.*, il ne pourra pas répondre (il ne peut pas deviner que ce dernier est derrière A et qu'il doit donc l'utiliser comme passerelle).

Du coup, comment faire ? Et bien on va utiliser le NAT (qui signifie Network Address Translation).

Kesako

Le principe est de modifier l'adresse IP source inscrite dans le paquet IP.

Quand A recevra le paquet de B à destination de C, il va modifier l'en-tête IP en mettant son adresse (sur X) dans le champ "IP Source".

Quand C va recevoir le paquet, il va donc voir que ce dernier vient de 192.168.1.156 (et non de 172.16.0.2). Comme c'est une IP de son réseau, il va pouvoir répondre. Il envoi donc sa réponse à A, qui relayera à B. Et voila, la boucle est bouclée.

Pour ceux dans l'assemblé qui se demande "Et si il y a plusieurs machines B, comment A sait que c'est une réponse pour 172.16.0.2 et non pour 172.16.0.3 ?", il faut savoir que de nos jours, à chaque fois qu'on fait du NAT, on fait du PAT (Port Adress Translation) en même temps. C'est le même principe que le NAT, sauf qu'on joue avec les ports. En gros, quand A recoit le paquet de B à destination de C, il va modifier le port source (par un port aléatoire non-utilisé) en même temps qu'il modifie l'adresse source.

Exemple: Port source d'origine 2345, adresse source d'origine 172.16.0.3; Au passage dans A, il va modifier en (disons) 4356 et 192.168.1.156. À partir de là, il sait que ce qu'il va recevoir sur le port 4356 va devoir être relayé sur le port 2345 de 172.16.0.3.

Mise en place

On utilise iptables pour dire à A de modifier les paquets à destination de X et venant de Y:

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o wlan0 -j SNAT --to-source 192.168.1.156
Important: 192.168.1.156 doit être remplacé par l'ip de A sur X.
Note: Il est également possible d'utiliser (à la place)
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o wlan0 -j MASQUERADE

Ca marche aussi bien, et on a pas à préciser l'IP de remplacement.

Mais normalement, quand on connait l'IP qui substitue celle du paquet, on est censé utiliser la première commande.

Pour aller plus loin ...

Et voila, c'est terminé ! Vos machines sur Y peuvent désormais naviguer tranquilou.

Notons qu'aux yeux du réseau X, il n'y a qu'une machine (A) qui parle, ce qui est interessant dans certaines situations ...


Rendre la configuration permanente

Tout ca c'est bien gentil, mais si vous rebootez A, ca sera perdu.

Voici comment faire pour retrouver cette configuration dès le démarrage.

Configuration de eth0

Bon, là, il n'y a pas grand chose à dire, ca dépend de ce que vous utilisez (rc.conf, networkmanager, wicd, etc). Le tout, c'est que vous ayez votre petite IP au boot.

Passerelle

Il y a differentes facons de faire (comme mettre les 2 commandes nécessaires dans le rc.local, tout bêtement).

Je m'attarde sur la méthode que je trouve la plus propre: utiliser le démon iptables:

Déjà, occupons nous de l'ip forwarding; éditez le fichier /etc/conf.d/iptables, et changez la valeur de IPTABLES_FORWARD à 1.

Pour le SNAT, ajoutez cette ligne dans le fichier /etc/iptables/iptables.rules (juste avant le commit):

-A POSTROUTING -t nat -s 172.16.0.0/16 -o wlan0 -j SNAT --to-source 192.168.1.156

Pour finir, éditez votre rc.conf pour lancer le démon iptables au démarrage.

Serveur DHCP

Vous êtes perfectionniste (ou fainéant), et vous voulez que les machines sur Y puissent utiliser un client dhcp pour configurer leur interface réseau.

Simple, il suffit de faire de A un serveur DHCP.

Important: Le sujet de l'article n'étant pas dhcpd, je vais aller vite sur cette partie.

On installe le service DHCP (depôt extra):

pacman -S dhcp

On ajoute une zone dans /etc/dhcpd.conf:

subnet 172.16.0.0 netmask 255.255.0.0 {
	range	172.16.0.10 172.16.0.50;
	option domain-name-servers 208.67.222.222;
	option routers 172.16.0.1;
}

Puis on démarre le bouzin:

/etc/rc.d/dhcpd start

Et voila, coté client, on a plus qu'à faire:

dhcpcd eth0

pour avoir IP, passerelle et DNS; c'est pas beau la vie ? ;-)

Outils personnels