web-dev-qa-db-fra.com

Comment configurer un réseau virtuel `veth`

J'aimerais configurer trois interfaces réseau virtuelles (veth) pouvant communiquer entre elles. Pour simuler un cluster à trois nœuds, chaque programme est ensuite lié à une interface veth. Je voudrais le faire sans LXC si possible.

J'ai essayé d'utiliser:

  • Créé trois paires veth: Sudo ip link add type veth
  • Créé un pont Sudo brctl addbr br0
  • Ajout d'un de chaque paire au pont:
    • Sudo brctl addif br0 veth1
    • Sudo brctl addif br0 veth3
    • Sudo brctl addif br0 veth5
  • Configuré les interfaces:
    • Sudo ifconfig veth0 10.0.0.201 netmask 255.255.255.0 up
    • Sudo ifconfig veth2 10.0.0.202 netmask 255.255.255.0 up
    • Sudo ifconfig veth4 10.0.0.203 netmask 255.255.255.0 up

Ensuite, j'ai vérifié si cela fonctionnait avec: ping -I veth0 10.0.0.202, mais ce n'est pas le cas :(

J'ai ajouté des adresses IP aux interfaces veth1, veth3, veth5 et br0 dans la plage 10.0.1.x/24. Mais ça n'aide pas.

Des idées? ou un guide, tout ce que je trouve dans la façon de l’utiliser avec LXC. Ou est-ce que j'essaie quelque chose qui n'est pas possible?

25
Reinder

Pour que veth fonctionne, une extrémité du tunnel doit être reliée à une autre interface. Puisque vous voulez garder tout cela virtuel, vous pouvez relier l'extrémité vm1 du tunnel (vm2 est l'autre extrémité du tunnel) avec une interface virtuelle de type tap, dans un pont appelé brm. Maintenant vous donnez les adresses IP à brm et à vm2 (10.0.0.1 et 10.0.0.2, respectivement), activez le transfert IPv4 au moyen de

echo 1 > /proc/sys/net/ipv4/ip_forward

affichez toutes les interfaces et ajoutez une route indiquant au noyau comment atteindre les adresses IP 10.0.0.0/24. C'est tout.

Si vous souhaitez créer plus de paires, répétez les étapes ci-dessous avec différents sous-réseaux, par exemple 10.0.1.0/24, 10.0.2.0/24, etc. Étant donné que vous avez activé le transfert IPv4 et ajouté les itinéraires appropriés à la table de routage du noyau, ils pourront se parler immédiatement.

N'oubliez pas non plus que la plupart des commandes que vous utilisez (brctl, ifconfig, ...) sont obsolètes: la suite iproute2 comporte des commandes permettant d'effectuer toutes les opérations suivantes: voir ci-dessous mon utilisation de la commande ip .

Ceci est une séquence correcte de commandes pour l'utilisation d'interfaces de type veth :

d'abord créer toutes les interfaces requises,

ip link add dev vm1 type veth peer name vm2
ip link set dev vm1 up
ip tuntap add tapm mode tap
ip link set dev tapm up
ip link add brm type bridge

Remarquez que nous n'avons pas apporté brm et vm2 car nous devons leur attribuer des adresses IP, mais nous avons fait apparaître tapm et vm1, ce qui est nécessaire pour les inclure dans le pont brm. Asservissez maintenant les interfaces tapm et vm1 au pont brm,

ip link set tapm master brm
ip link set vm1 master brm

donnez maintenant des adresses au pont et à l'interface veth restante vm2,

ip addr add 10.0.0.1/24 dev brm
ip addr add 10.0.0.2/24 dev vm2

maintenant apportez vm2 et brm,

ip link set brm up
ip link set vm2 up

Il n'est pas nécessaire d'ajouter explicitement la route au sous-réseau 10.0.0.0/24, elle est générée automatiquement. Vous pouvez vérifier avec ip route show . Cela se traduit par

ping -c1 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.035 m

--- 10.0.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.035/0.035/0.035/0.000 ms

Vous pouvez également le faire à l'envers, , c'est-à-dire de vm2 à brm:

ping -I 10.0.0.2 -c1 10.0.0.1
PING 10.0.0.1 (10.0.0.1) from 10.0.0.2 : 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms

--- 10.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms

L'application la plus utile des cartes réseau du type veth est un espace de noms réseau , utilisé dans les conteneurs Linux (LXC). . Vous commencez un appelé nnsm comme suit

ip netns add nnsm

puis nous y transférons vm2,

ip link set vm2 netns nnsm 

nous dotons le nouvel espace de noms réseau d'une interface lo (absolument nécessaire),

ip netns exec nnsm  ip link set dev lo up

nous autorisons le NAT dans la machine principale,

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

(si vous êtes connecté à Internet via eth0 , sinon changez en conséquence), démarrez un shell dans le nouvel espace de noms réseau,

ip netns exec nnsm xterm & 

et maintenant, si vous commencez à saisir le nouveau xterm, vous constaterez que vous vous trouvez sur une machine virtuelle distincte avec l'adresse IP 10.0.0.2, mais que vous pouvez accéder à Internet. L’avantage de ceci est que le nouvel espace de noms réseau a sa propre pile, ce qui signifie, par exemple, que vous pouvez y démarrer un VPN alors que le reste de votre ordinateur n’est pas sur le VPN. C’est l’engin sur lequel les LXC sont basés.

MODIFIER:

J'ai commis une erreur en apportant l'interface vm2 qui la fait baisser et efface son adresse. Vous devez donc ajouter ces commandes à partir de xterm:

ip addr add 10.0.0.2/24 dev vm2
ip link set dev  vm2 up
ip route add default via 10.0.0.1
echo "nameserver 8.8.8.8" >> /etc/resolv.conf
echo "nameserver 8.8.4.4" >> /etc/resolv.conf

et maintenant vous pouvez naviguer à partir de xterm.

Les commandes ip peuvent également être effectuées avant le xterm avec

ip -netns nnsm addr add 10.0.0.2/24 dev vm2
ip -netns nnsm link set dev vm2 up
ip -netns nnsm route add default via 10.0.0.1
31
MariusMatutiae

Voici une configuration de pont à 5 nœuds que j’utilise qui fonctionne. Vous devriez pouvoir utiliser ifconfig pour attribuer des adresses aux interfaces NodeX

ip link add dev Node1s type veth peer name Node1
ip link add dev Node2s type veth peer name Node2
ip link add dev Node3s type veth peer name Node3
ip link add dev Node4s type veth peer name Node4
ip link add dev Node5s type veth peer name Node5

ip link set Node1 up
ip link set Node2 up
ip link set Node3 up
ip link set Node4 up
ip link set Node5 up

ip link set Node1s up
ip link set Node2s up
ip link set Node3s up
ip link set Node4s up
ip link set Node5s up

brctl addbr Br
ifconfig Br up

brctl addif Br Node1s
brctl addif Br Node2s
brctl addif Br Node3s
brctl addif Br Node4s
brctl addif Br Node5s

et à nettoyer

brctl delif Br Node1s
brctl delif Br Node2s
brctl delif Br Node3s
brctl delif Br Node4s
brctl delif Br Node5s
brctl delif Br Node1
brctl delif Br Node2
brctl delif Br Node3
brctl delif Br Node4
brctl delif Br Node5

ifconfig Br down
brctl delbr Br

ip link del dev Node1
ip link del dev Node2
ip link del dev Node3
ip link del dev Node4
ip link del dev Node5
0
Neil McGill