Cómo configurar una red virtual `veth`

26

Me gustaría configurar tres interfaces de red virtuales ( veth) que pueden comunicarse entre sí. Para simular un clúster de tres nodos, cada programa se une a una vethinterfaz. Me gustaría hacerlo sin LXC si es posible.

Intenté usar:

  • Creó tres vethpares:sudo ip link add type veth
  • Creado un puente sudo brctl addbr br0
  • Se agregó uno de cada par al puente:
    • sudo brctl addif br0 veth1
    • sudo brctl addif br0 veth3
    • sudo brctl addif br0 veth5
  • Configurado las 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

Luego verifiqué si funciona usando: ping -I veth0 10.0.0.202pero no :(

El añadí direcciones IP al veth1, veth3, veth5y br0las interfaces en el intervalo 10.0.1.x / 24. Pero eso no ayuda.

¿Algunas ideas? o una guía, todo lo que encuentro sobre cómo usarlo con LXC. ¿O estoy intentando algo que no es posible?

Reinder
fuente
Es en br0sí?
Grawity
Sí, está arriba Lo configuré como el veth's
Reinder

Respuestas:

31

Para que veth funcione, un extremo del túnel debe ser puenteado con otra interfaz. Como desea mantener todo esto virtual, puede conectar el extremo vm1 del túnel (vm2 es el otro extremo del túnel) con una interfaz virtual de tipo tap, en un puente llamado brm. Ahora le da direcciones IP a brm y vm2 (10.0.0.1 y 10.0.0.2, respectivamente), habilite el reenvío de IPv4 mediante

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

active todas las interfaces y agregue una ruta que indique al núcleo cómo llegar a las direcciones IP 10.0.0.0/24. Eso es todo.

Si desea crear más pares, repita los pasos a continuación con diferentes subredes, por ejemplo, 10.0.1.0/24, 10.0.2.0/24, etc. Dado que habilitó el reenvío de IPv4 y agregó las rutas apropiadas a la tabla de enrutamiento del núcleo, podrán comunicarse entre sí de inmediato.

Además, recuerde que la mayoría de los comandos que está utilizando (brctl, ifconfig, ...) son obsoletos: la suite iproute2 tiene comandos para hacer todo esto, vea a continuación mi uso del comando ip .

Esta es una secuencia correcta de comandos para el uso de interfaces de tipo veth :

primero cree todas las interfaces requeridas,

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

Tenga en cuenta que no mencionamos brm y vm2 porque tenemos que asignarles direcciones IP, pero mencionamos tapm y vm1, lo cual es necesario para incluirlos en el puente brm. Ahora esclavice las interfaces tapm y vm1 al bridge brm,

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

ahora dé direcciones al puente y a la interfaz veth restante vm2,

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

ahora trae vm2 y brm up,

ip link set brm up
ip link set vm2 up

No es necesario agregar la ruta a la subred 10.0.0.0/24 explícitamente, se genera automáticamente, puede verificar con ip route show . Esto resulta en

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

También puede hacerlo al revés, es decir , desde vm2 de regreso a 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

La aplicación más útil de las NIC del tipo veth es un espacio de nombres de red , que es lo que se usa en los contenedores de Linux (LXC). Empiezas uno llamado nnsm de la siguiente manera

ip netns add nnsm

luego le transferimos vm2,

ip link set vm2 netns nnsm 

Dotamos el nuevo espacio de nombres de red con una interfaz lo (absolutamente necesaria),

ip netns exec nnsm  ip link set dev lo up

permitimos NATting en la máquina principal,

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

(si está conectado a Internet a través de eth0 , de lo contrario cambie en consecuencia), inicie un shell en el nuevo espacio de nombres de red,

ip netns exec nnsm xterm & 

y ahora, si comienza a escribir en el nuevo xterm, encontrará que está en una máquina virtual separada con la dirección IP 10.0.0.2, pero puede acceder a Internet. La ventaja de esto es que el nuevo espacio de nombres de red tiene su propia pila, lo que significa que, por ejemplo, puede iniciar una VPN mientras el resto de su PC no está en la VPN. Este es el artilugio en el que se basan los LXC.

EDITAR:

Cometí un error, trayendo la interfaz vm2 lo baja y borra su dirección. Por lo tanto, debe agregar estos comandos, desde dentro 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

y ahora puedes navegar desde xterm.

Los ipcomandos también se pueden hacer antes de xterm con

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
MariusMatutiae
fuente
Gracias por la explicación. Solo veo lo en xterm, falta la interfaz vm2.
Reinder
Gracias de nuevo. Hice un script para configurar tres xterm y puedo hacer ping entre sí :)
Reinder
Solo un problema ... Cuando envío una transmisión UPD en un xterm, los otros reciben el paquete de 10.0.0.254 (brm). Para mi guión, vea: aquí (no puedo publicarlo en el comentario)
Reinder
Tengo problemas para abrir vm1 :( # enlace ip agregar dev vm1 tipo veth peer nombre vm2 ip: RTNETLINK responde: El archivo existe # ip link set dev vm1 up ip: SIOCGIFFLAGS: No existe tal dispositivo
resultado
@ MariusMatutiae Tuve que intentarlo un par de veces, así que estoy de acuerdo con el primer comando, pero de alguna manera mi copia pegar no es adecuada para el segundo (estoy usando minicom en el dispositivo), así que en resumen seguí exactamente como se sugirió. Creo que no tengo el paquete iproute2.
resultados el
0

Aquí hay una configuración de puente de 5 nodos que utilizo que funciona. Debería poder usar ifconfig para asignar direcciones a las 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

y para limpiar

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
Neil McGill
fuente