Comment puis-je utiliser Linux comme passerelle?

16

REMARQUE: Si les périphériques clients ( computer Bdans cet exemple) souhaitent obtenir Internet via l'ordinateur passerelle, ils doivent peut-être encore configurer la résolution du serveur de noms. Cela n'est pas expliqué ici (une passerelle ne dessert pas nécessairement Internet).

J'essaie de comprendre les principes fondamentaux du routage des réseaux.
J'expérimente donc avec mon LAN (je n'ai pas besoin d'Internet pour l'instant, juste des communications LAN).

Je sais que les questions de configuration du réseau sont quelque chose d'assez complexe, mais j'essaie juste de faire d'un ordinateur (disons A) pour servir de passerelle pour un autre (disons B) (tous deux exécutant Ubuntu Linux).
Je n'ai besoin que de B pour pouvoir atteindre le routeur, qui n'est accessible que 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 correctement au routeur .
Les ordinateurs A et B se connectent bien (ping, SSH ... etc) entre eux .
L'ordinateur B ne peut pas atteindre le routeur de l'ordinateur A.

Je pensais que l'ajout de l'ordinateur B comme passerelle par défaut et l'activation du transfert IP sur A permettraient à B 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 envoyer une requête ping à 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 agisse comme une passerelle pour un autre ordinateur de manière simple?

Sopalajo de Arrierez
la source

Réponses:

21

Vous êtes presque là, vous avez juste besoin de vous assurer que le trafic retourne à B. En ce moment, vous avez transféré le trafic de B vers le monde extérieur, mais A ne sait pas comment ramener le trafic vers B. Vous avez besoin de A pour garder un état sur les connexions qui le traversent. Pour ce faire, vous souhaiterez activer NAT . Vous avez déjà la première étape qui est d'autoriser le transfert. Ensuite, vous devez ajouter quelques règles de pare-feu en utilisant iptables:

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

Cela dit: sur la table de traduction d'adresse réseau, après avoir déterminé le routage d'un paquet sur la sortie eth0 (externe), remplacez les informations d'adresse de retour par les nôtres afin que les paquets de retour nous parviennent. N'oubliez pas non plus que nous l'avons fait (comme une table de recherche qui se souvient de cette connexion).

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

Autorisez les paquets qui veulent provenir de eth1 (l'interface interne) à sortir eth0 (l'interface externe).

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

Utilisez cette table de recherche que nous avions avant pour voir si le paquet arrivant sur l'interface externe appartient réellement à une connexion qui a déjà été initiée à partir de l'interne.

user1794469
la source
Une explication concise, en effet. Tous les blocs de code doivent-ils être exécutés sur l'ordinateur A?
Sopalajo de Arrierez
@SopalajodeArrierez Oui, elles sont toutes exécutées sur l'ordinateur "passerelle". Le système B n'a besoin de rien savoir du routage, sauf s'il veut atteindre une autre machine, il envoie les paquets à B (c'est GW par défaut).
user1794469
Testé sur Ubuntu v14 sur le bureau et Ubuntu v12 sur Utilite Pro (un périphérique intégré de CompuLabs). Merci beaucoup d'avoir développé ce que fait exactement chaque ligne. J'ai fait des recherches et trouvé de nombreuses explications à long-long-long qui ne fonctionnaient pas. J'espère que ce fil de questions-réponses pourrait être utile pour d'autres à l'avenir.
Sopalajo de Arrierez
@ user1794469 est-ce la même chose lorsque l'interface de passerelle est virtuelle, c'est-à-dire une interface tactile? pouvez-vous voir ici ?
ram
1

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

  • Les deux passerelles doivent avoir un lien physique l'une avec l'autre (ou virtuelle si vous liez 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 paquets pour le réseau distant. La passerelle doit être l'adresse IP de l'ordinateur qui enverra les paquets 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 devrez spécifier les deux sur les ordinateurs qui ont besoin d'accéder à la fois à Internet et à l'autre réseau (par exemple, la passerelle Internet via DHCP et la passerelle de l'autre réseau via une route).
  • Le transfert IP doit être actif pour les deux passerelles.
  • Le masquage IP 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 car vous utilisez la même interface pour le masquage:

    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 du réseau local doit être accepté sur l'interface appropriée comme ceci:

    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 questions similaires pouvant être référencés pour résoudre les problèmes que vous rencontrez.

Ce qui semble erroné dans ce cas particulier, c'est que la configuration de la route et de la passerelle n'est pas terminée sur les deux ordinateurs et que la traduction d'adresses réseau (NAT) n'a pas été activée à l'aide d'iptables, permettant aux passerelles de transporter la demande depuis un ordinateur sur l'autre sous-réseau en leur nom.

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

John Pettit
la source