GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Comment transférer le trafic entre les espaces de noms réseau Linux ?

J'ai pu configurer un espace de noms réseau et démarrer un serveur qui écoute sur 127.0.0.1 à l'intérieur de l'espace de noms :

# ip netns add vpn
# ip netns exec vpn ip link set dev lo up
# ip netns exec vpn nc -l -s 127.0.0.1 -p 80 &

# ip netns exec vpn netstat -tlpn

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:80            0.0.0.0:*               LISTEN      5598/nc

Après cela, je peux me connecter au serveur à l'intérieur de l'espace de noms :

# ip netns exec vpn nc 127.0.0.1 80 -zv
localhost [127.0.0.1] 80 (http) open

Mais je ne peux pas me connecter au serveur en dehors de l'espace de noms :

# nc 127.0.0.1 80
(UNKNOWN) [127.0.0.1] 80 (http) : Connection refused

Comment configurer iptables ou l'espace de noms pour transférer le trafic de l'espace de noms global vers l'espace de noms vpn ?

Réponse acceptée :

Premièrement :je ne pense pas que vous puissiez y parvenir en utilisant 127.0.0.0/8 et/ou une interface de bouclage (comme lo). Vous devez utiliser d'autres adresses IP et interfaces, car il existe des éléments spécifiques câblés pour 127.0.0.0/8 et pour le bouclage.

Alors il y a certainement plus d'une méthode, mais voici un exemple :

# ip netns add vpn
# ip link add name vethhost0 type veth peer name vethvpn0
# ip link set vethvpn0 netns vpn
# ip addr add 10.0.0.1/24 dev vethhost0
# ip netns exec vpn ip addr add 10.0.0.2/24 dev vethvpn0
# ip link set vethhost0 up
# ip netns exec vpn ip link set vethvpn0 up
# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.134 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.100 ms

La première commande crée à partir de rien une paire d'interfaces Ethernet virtuelles connectées par un câble Ethernet virtuel. La deuxième commande déplace l'une de ces interfaces dans le VPN netns. Considérez-le comme l'équivalent de choses comme socketpair(2) ou pipe(2) :un processus crée une paire, puis bifurque, et chaque processus ne conserve qu'une extrémité de la paire et ils peuvent communiquer.

Habituellement (LXC, virt-manager, ...) il y a aussi un pont impliqué pour tout mettre dans le même LAN lorsque vous avez plusieurs réseaux.

Une fois que cela est en place, pour l'hôte c'est comme n'importe quel routeur.
Activez le transfert ip (soyez plus restrictif si vous le pouvez :vous en avez besoin au moins pour vethhost0 et l'interface principale) :

# echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

Ajoutez une règle DNAT, comme :

# iptables -t nat -A PREROUTING ! -s 10.0.0.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

Maintenant, vous pouvez soit ajouter une route par défaut à l'intérieur du VPN avec :

# ip netns exec vpn ip route add default via 10.0.0.1

Ou bien, à la place, ajoutez une règle SNAT pour que tout soit considéré comme provenant de 10.0.0.1 à l'intérieur du vpn.

# iptables -t nat -A POSTROUTING -d 10.0.0.2/24 -j SNAT --to-source 10.0.0.1

Avec cela en place, vous pouvez tester à partir de n'importe quel autre hôte, mais pas à partir de l'hôte lui-même. Pour ce faire, ajoutez également une règle DNAT similaire à la DNAT précédente, mais en OUTPUT et modifiée (sinon toute connexion http sortante serait également modifiée) à votre propre IP. Disons que votre IP est 192.168.1.2 :

# iptables -t nat -A OUTPUT -d 192.168.1.2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.0.2

Maintenant, cela fonctionnera même si vous vous connectez de l'hôte à lui-même si vous n'utilisez pas d'adresse IP de bouclage, mais toute autre adresse IP appartenant à l'hôte avec une règle nat comme ci-dessus. Disons que votre IP est 192.168.1.2 :

# ip netns exec vpn nc -l -s 10.0.0.2 -p 80 &
[1] 10639
# nc -vz 192.168.1.2 80
nc: myhost (192.168.1.2) 80 [http] open
#
[1]+  Done                    ip netns exec vpn nc -l -s 10.0.0.2 -p 80

Linux
  1. Comment utiliser la commande Linux mtr

  2. Comment effectuer un chroot avec des espaces de noms Linux ?

  3. Linux - Comment annuler le partage du réseau pour le processus actuel ?

  4. Linux - Comment répertorier les espaces de noms sous Linux ?

  5. Comment surveiller le trafic réseau sous Linux à l'aide de vnStat

Comment trouver les interfaces réseau disponibles sous Linux

Comment changer l'adresse MAC du réseau sous Linux

Comment installer et utiliser l'analyseur de trafic réseau Linux basé sur le Web de Darkstat

Comment ajouter une route sous Linux

Comment configurer Linux en tant que routeur statique

Comment utiliser la commande netstat sous Linux