El modo de interfaz de Linux MACVLAN con modo privado no parece funcionar como se anuncia (Ubuntu)

El modo de interfaz de Linux MACVLAN con modo privado no parece funcionar como se anuncia (Ubuntu)

Estoy intentando crear interfaces virtuales (tipo MACVLAN) de modo que toda la comunicación entre las interfaces se envíe desde el host hacia la puerta de enlace predeterminada eterna. Hay muchos artículos que describen el modo "privado", comoaquí

Privado: filtre todos los paquetes entrantes para que ninguna VLAN MAC vinculada a una interfaz pueda comunicarse entre sí (elimine todos los paquetes que ingresan a través de la interfaz que tengan una dirección MAC de origen que coincida con una de las interfaces VLAN MAC).

Configuré un par de interfaces y parece que el modo "privado" no funciona como se anuncia. ¿Estoy haciendo algo mal? El host es la versión Ubuntu 18.04 Bionic.

Los paquetes se cambian dentro del host ignorando el comando "modo privado". Es sencillo de reproducir con sólo 4 comandos. Cualquier ayuda sería apreciada.

root@ubnt-bkp:/home/super# uname -a
Linux ubnt-bkp 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1A ens160.3 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.3 up
root@ubnt-bkp:/home/super# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 08:4f:a9:99:99:02 brd ff:ff:ff:ff:ff:ff
...
...
18: ens160.3@ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP **mode** **DEFAULT** group default qlen 1000
    link/ether 38:94:ed:99:99:1a brd ff:ff:ff:ff:ff:ff

Comandos para reproducir el problema.

root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.5 up
root@ubnt-bkp:/home/super# dhclient ens160.5
root@ubnt-bkp:/home/super# ip link add link ens160 address 38:94:ed:99:99:1C ens160.6 type macvlan mode private
root@ubnt-bkp:/home/super# ip link set ens160.6 up
root@ubnt-bkp:/home/super# dhclient ens160.6

Luego pingusando -Ila opción:

root@ubnt-bkp:/home/super#ping -I <IP address of ens160.5> <IP address of ens160.6>

(reemplácelo ens160con el nombre de su interfaz Ethernet, por ejemplo, eth0, cuando intente reproducir)

Respuesta1

Los comandos que está utilizando para crear las interfaces MACVLAN son correctos.

Sin embargo, usar ping -Ino le ayudará a verificar esto. Cuando ambas interfaces de origen y destino están en el mismo host (y en el mismo espacio de nombres, como en su caso), pingsiempre será exitoso.

Entonces, ¿cómo se prueba esto? Colocando sus interfaces MACVLAN en espacios de nombres diferentes, no predeterminados. Luego ejecute pingdesde el espacio de nombres.

Supongamos que comienza con su interfaz física ( ens160) con dirección IP 192.0.2.2/24. Supongamos también que la dirección de puerta de enlace de su enrutador es 192.0.2.1.

Ahora:

# Create namespace named "ns5"
ip netns add ns5

# Create the macvlan interface as usual
ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private

# Move the just-created macvlan interface into the "ns5" namespace
ip link set ens160.5 netns ns5

# Set the link up. Observe the "ip netns exec ns5" prefix.
ip netns exec ns5 ip link set ens160.5 up

# Set the IP address for the macvaln interface.  Observe the "ip netns exec ns5" prefix.
ip netns exec ns5 ip address add dev ens160.5 192.0.2.205/24


# Repeat above for another macvlan interface, this one in another namespace
# called "ns6"

ip netns add ns6
ip link add link ens160 address 38:94:ed:99:99:1C ens160.6 type macvlan mode private
ip link set ens160.6 netns ns6
ip netns exec ns6 ip link set ens160.6 up
ip netns exec ns6 ip address add dev ens160.6 192.0.2.206/24

A partir de este momento, ambas interfaces macvtap podrán hacer ping exitosamente a la puerta de enlace:

ip netns exec ns5 ping 192.0.2.1
ip netns exec ns6 ping 192.0.2.1

Si tiene acceso al dispositivo de puerta de enlace, debería poder confirmar que las entradas ARP para 192.0.2.205 y 192.0.2.6 muestran las direcciones MAC de las interfaces macvlan.

Sin embargo, dado que las interfaces macvlan están en privatemodo, los siguientes comandos fallarán:

# Try to reach ens160.6 from ens160.5
ip netns exec ns5 ping 192.0.2.206

# Try to reach ens160.5 from ens160.6
ip netns exec ns6 ping 192.0.2.205

Repita el experimento con bridgeen lugar de private; observará que los dos últimos comandos ping tendrán éxito.

información relacionada