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