web-dev-qa-db-fra.com

Routez tout le trafic d'une machine à travers une autre dans un sous-réseau?

J'ai deux ordinateurs, tous deux sous ubuntu 12.04 64 bits. Je dois acheminer le trafic d’un ordinateur à l’autre.

computer A: 192.168.1.3 (eth0)

computer B: 192.168.1.7 (eth0), 192.168.1.5 (eth1), 192.168.1.6 (eth2)

J'ai besoin de ces trois interfaces dans l'ordinateur B pour exécuter mes expériences finales ...

L'ordinateur BTW B s'exécute sur une machine virtuelle sur un hôte séparé.

Je change le gw par défaut de l'ordinateur A comme ceci:

Sudo sudo ip route del
Sudo ip route add default via 192.168.1.6

voici la sortie de route -n dans l'ordinateur A:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.6     0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0

Aussi, je lance ce script sur l'ordinateur B:

#!/bin/bash

IF="eth2"
ADDR="192.168.1.3"

Sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
Sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_dynaddr'

Sudo iptables -P FORWARD DROP
Sudo iptables -F FORWARD
Sudo iptables -t nat -F
Sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT
Sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT
Sudo iptables -t nat -A POSTROUTING -s $ADDR -j MASQUERADE

Après ces instructions, l’ordinateur A n’a pas accès à Internet!

Avez-vous une idée du problème et de la solution?

Modifier 1

la topologie par défaut du sous-réseau est la suivante:

                                             |--------------|  
                                             |    Comp C    |
    |----------| eth0   |----------|      en0| |----------| |
    |  CompA   |--------|   switch |---------| |   VM  B  | |
    |----------|        |-----|----|         | |----------| |
                              |              |--------------| 
                              |
                         ( Internet )
                          (        )

mise à jour

ordinateur A:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.2     0.0.0.0         UG    0      0        0 eth0.100
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0.100

machine virtuelle B:

eth0 est connecté via nat.

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.233.2    0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
172.16.233.0    0.0.0.0         255.255.255.0   U     1      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth1
192.168.2.0     0.0.0.0         255.255.255.0   U     1      0        0 eth2
1
N. S.

Vous avez trois interfaces sur l'ordinateur B, qui ont des adresses du même sous-réseau (192.168.1.0/24, n'est-ce pas?).

Regardez certaines de vos règles iptables:

  1. Sudo iptables -A FORWARD -i $IF -o $IF --source $ADDR -j ACCEPT - cette règle indique que vous autorisez le routage de eth2 à eth2 lorsque le paquet provient de 192.168.1.3 (sans les informations sur le masque de réseau). Cette règle n'a aucun sens.

  2. Sudo iptables -A FORWARD -i $IF -o $IF --destination $ADDR -m state --state ESTABLISHED,RELATED -j ACCEPT - presque le même que ci-dessus.

  3. Vous définissez la règle par défaut pour la chaîne iptables -F INPUT ACCEPT, puis supprimez iptables -F INPUT.

Alors, ce que je recommande:

  1. Sur l'ordinateur B, les trois interfaces doivent avoir des adresses de réseaux différents. Si vous en avez besoin dans le même réseau, il est préférable de les relier (créez une "interface multiple" qui les agrège toutes avec une adresse IP).

  2. En savoir plus sur iptables et essayer de le comprendre. C'est assez simple. Par exemple, lorsque vous avez un réseau 192.168.1.0/24 qui connecte les ordinateurs A et B, le moyen le plus simple consiste à créer NAT comme cela (ordinateur B):

 iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.1.0/24 -j MASQUERADE 
 iptables -A FORWARD -s 192.168.1.0/24 -d 0/0 -j ACCEPTER 
 Iptables -A FORWARD -s 0/0 -d 192.168.1.0/24 -j ACCEPTER 
  1. Ou le moyen le plus simple - reliez toutes les interfaces de l'ordinateur B à un pont. Dans ce cas, vous n'avez pas besoin d'utiliser NAT.

Mise à jour après la prolongation de la question

L’architecture réseau que vous avez n’est pas vraiment conçue pour fonctionner comme vous le souhaitez. L'ordinateur A doit être connecté à l'ordinateur C via un réseau séparé par rapport au réseau connectant l'ordinateur C à une passerelle (Internet). Mais vous avez deux solutions.

"La manière élégante"

Il est nécessaire que le commutateur soit transparent pour les trames Ethernet étiquetées vlan (car je suppose que vous n’avez pas de commutateur géré avec la possibilité de baliser les ports). Si votre commutateur prend en charge 802.1q, il devrait fonctionner comme cela.

  1. Vous devez créer des interfaces vlan sur les ordinateurs A et C. Par exemple, Sudo vconfig add eth0 100. Cette commande créera l'interface étiquetée eth0.100. Sur l'ordinateur C, exécutez la commande Sudo vconfig add en1 100. Vous aurez l'interface en1.100. Sur les paramètres de la machine virtuelle, vous devez relier l'interface virtuelle ethX avec en1.100. N'attribuez aucune adresse IP à en1.100 (ordinateur C) - cela n'est pas nécessaire.

  2. Définissez les adresses du même réseau sur eth0.100 (ordinateur A) et ethX (machine virtuelle B). Disons que ce sera 192.168.2.1/24 (ordinateur A) et 192.168.2.2/24 (machine virtuelle B).

  3. La machine virtuelle B doit avoir une interface supplémentaire qui sera pontée en1 sur l'ordinateur C (l'interface non étiquetée). Disons qu'il a l'adresse 192.168.1.3/24.

  4. Vous devez maintenant configurer NAT sur la machine virtuelle C:

iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE 
 iptables -A FORWARD -s 192.168.2.0/24 -d 0/0 -j ACCEPTER 
 iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ACCEPTER 
  1. Et ajoutez la passerelle par défaut sur l'ordinateur A:
route ajouter par défaut gw 192.168.2.2

Ça devrait marcher.

Le sale chemin Vous pouvez essayer le sale chemin. Cela ne nécessite pas de vlans mais cela crée un petit désordre sur la 3ème couche.

  1. L'ordinateur A a l'interface eth0 avec l'adresse 192.168.2.1/24.

  2. La machine virtuelle B a deux interfaces ethX et ethY. Tous deux pontés vers en1 (sur l'ordinateur C) dans les paramètres de la machine virtuelle.

  3. L'interface ethX a l'adresse 192.168.2.2/24. L'interface ethY a l'adresse 192.168.1.3/24.

  4. Appliquez les mêmes commandes qu'aux points 4 et 5 de manière élégante.

Cela devrait aussi marcher.

Le problème de votre solution était que vous essayiez d'acheminer le trafic du même réseau vers le même réseau. Vous ne pouvez acheminer le trafic qu'entre deux réseaux IP logiques (pas à partir de la même plage d'adressage). Si vous avez besoin d'un routage, vous devez disposer de deux réseaux différents - dans ce cas, 192.168.1.0/24 (le réseau existant) et 192.168.2.0/24 (le réseau connectant l'ordinateur A et la machine virtuelle B).

1
Krzysztof Sawicki

Le problème est résolu lorsque la machine B est placée dans une seule machine réelle au lieu d'une machine virtuelle. Après cela, eth0.1 avec l'adresse IP 192.168.2.2 est créé dans la machine A et eth0.1 avec l'adresse IP 192.168.2.1 dans la machine B.

Définissez la passerelle par défaut dans la machine A:

Sudo route del default gw 192.168.1.1
Sudo route add default gw 192.168.2.1

et lancez cette instruction dans la machine B:

Sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
iptables -t nat -A POSTROUTING -d 0/0 -s 192.168.2.0/24 -j MASQUERADE
iptables -A FORWARD -s 192.168.2.0/24 -d 0/0 -j ACCEPT
iptables -A FORWARD -s 0/0 -d 192.168.2.0/24 -j ACCEPT

maintenant, le trafic de la machine A est correctement acheminé depuis la machine B. Merci beaucoup à vos guides @Krzysztof Sawicki :)

0
N. S.