Comment puis-je utiliser Linux comme passerelle?

REMARQUE: si les périphériques client ( computer B dans cet exemple) veulent get Internet via l'ordinateur de la passerelle, ils doivent peut-être encore configurer la résolution du server de noms. Ceci n'est pas expliqué ici (une passerelle ne dessert pas nécessairement Internet).

J'essaie de comprendre les principes fondamentaux du routing des réseaux.
Donc, je suis en train d'expérimenter avec mon LAN (je n'ai pas besoin d'internet pour le moment, juste des communications LAN).

Je sais que la configuration du réseau est une chose assez complexe, mais j'essaie juste de faire un ordinateur (par exemple A) pour faire office de passerelle pour un autre (par exemple B) (Ubuntu Linux).
J'ai seulement besoin de B pour être capable d'atteindre le routeur, c'est seulement accessible pour A.

C'est le cas:

 Router for computer A --> 192.168.0.1 Computer A - eth0 --> 192.168.0.2 Computer A - eth1 --> 192.168.1.1 Computer B - eth0 --> 192.168.1.2 

L'ordinateur A se connecte bien au routeur .
Les ordinateurs A et B se connectent bien (ping, SSH … etc) entre eux .
L'ordinateur B ne peut pas atteindre le routeur pour l'ordinateur A.

Je pensais que simplement append sur B ordinateur A comme passerelle par défaut et activer IP Forwarding sur A ferait B pour être en mesure d'atteindre le routeur pour A:

 luis@ComputerB:~$ sudo route add default gw 192.168.1.1 luis@ComputerB:~$ sudo routel target gateway source proto scope dev tbl 127.0.0.0 broadcast 127.0.0.1 kernel link lo local 127.0.0.0 8 local 127.0.0.1 kernel host lo local 127.0.0.1 local 127.0.0.1 kernel host lo local 127.255.255.255 broadcast 127.0.0.1 kernel link lo local 192.168.1.0 broadcast 192.168.1.2 kernel link eth0 local 192.168.1.2 local 192.168.1.2 kernel host eth0 local 192.168.1.255 broadcast 192.168.1.2 kernel link eth0 local default 192.168.1.1 eth0 169.254.0.0 16 link eth0 192.168.1.0 24 192.168.1.2 kernel link eth0 

Et sur l'ordinateur A (la passerelle intermédiaire):

 root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward 

L'ordinateur B peut toujours cingler l'ordinateur A, mais le routeur pour A ne répond pas:

 luis@ComputerB:~$ ping 192.168.0.1 PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data. ^C 

(Pas de réponse ping)

Est-ce la bonne procédure pour qu'un ordinateur exécutant Linux fonctionne comme une passerelle pour un autre ordinateur d'une manière simple?

Vous êtes presque là, il vous suffit de vous assurer que le trafic revient à B. En ce moment, vous avez transféré le trafic de B vers le monde extérieur, mais A ne sait pas comment récupérer le trafic vers B. Vous avez besoin de A pour garder un état de les connections qui le traversent. Pour ce faire, vous voudrez activer NAT . Vous avez déjà la première étape qui autorise le transfert. Ensuite, vous devez append quelques règles de pare-feu à l'aide d' iptables :

 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

Ceci dit: sur la table de traduction d'adresses réseau, après avoir déterminé le routing d'un package sur la sortie eth0 (l'externe), remplacez l'information d'adresse de return par la nôtre afin que les packages de return nous parviennent. En outre, callbackez-vous que nous l'avons fait (comme une table de consultation qui se souvient de cette connection).

 iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT 

Autoriser les packages qui veulent provenir de eth1 (l'interface interne) pour sortir eth0 (l'interface externe).

 iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT 

Utilisez cette table de consultation d'avant pour voir si le package arrivant sur l'interface externe appartient réellement à une connection qui a déjà été initiée depuis l'interne.

Pour que le routing fonctionne correctement entre deux ordinateurs Linux faisant office de passerelle, plusieurs éléments doivent être mis en place:

  • Les deux passerelles doivent avoir un lien physique l'une avec l'autre (ou virtuelles si vous reliez des machines virtuelles).
  • Les routes doivent être ajoutées aux deux interfaces du routeur.

     route add -net 192.168.0.0/24 gw 192.168.0.1 route add -net 192.168.1.0/24 gw 192.168.1.1 
  • Une passerelle locale doit être spécifiée pour le réseau distant sur les deux passerelles. Cela permet aux ordinateurs du réseau local de savoir où envoyer des packages pour le réseau distant. La passerelle doit être l'adresse IP de l'ordinateur qui enverra des packages au réseau distant.

  • Les ordinateurs souhaitant envoyer du trafic entre les réseaux doivent également être informés de la passerelle locale qui gère le trafic vers et depuis le réseau distant. Cela se fait généralement via le protocole DHCP (Dynamic Host Control Protocol), mais si vous avez l'intention d'utiliser une passerelle distincte pour Internet, vous devez spécifier les ordinateurs qui ont besoin d'accéder à Internet et à l'autre réseau DHCP et la passerelle de l'autre réseau via une route).
  • Le transfert IP doit être actif pour les deux passerelles.
  • IP Masquerading doit être activé pour permettre au NAT de fonctionner entre les passerelles.

     modprobe iptable_nat echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -A FORWARD -i eth1 -j ACCEPT 

    Vous devrez peut-être spécifier une source et une destination puisque vous utilisez la même interface pour masquerading:

     iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE 

    et l'autre passerelle:

     iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE 

    Pour chaque passerelle, le trafic réseau local doit être accepté comme suit sur l'interface appropriée:

     iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT 

    ou

     iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT 

Il existe de nombreux liens et des questions similaires pouvant être référencés pour résoudre les problèmes que vous rencontrez.

Ce qui semble être faux dans ce cas particulier est que la configuration de l'itinéraire et de la passerelle n'est pas complète sur les deux ordinateurs et que la traduction d'adresses réseau n'a pas été activée en utilisant iptables, permettant aux passerelles de transmettre la requête depuis un ordinateur sur l'autre sous-réseau en leur nom.

Cela est également crucial lors de la configuration d'une connection Internet car vous êtes responsable d'une extrémité de la connection (par exemple, en utilisant un ordinateur Linux comme passerelle pour une connection PPPoE).