O modo de interface Linux MACVLAN com modo privado não parece funcionar como anunciado (Ubuntu)

O modo de interface Linux MACVLAN com modo privado não parece funcionar como anunciado (Ubuntu)

Estou tentando criar interfaces virtuais (tipo MACVLAN) de forma que toda a comunicação entre as interfaces seja enviada do host para o gateway padrão eterno. Há muitos artigos que descrevem o modo "privado", comoaqui

Privado: Filtre todos os pacotes recebidos para que nenhuma VLAN MAC vinculada a uma interface possa se comunicar entre si (descarte todos os pacotes que entram pela interface que possuem um endereço MAC de origem que corresponda a uma das interfaces MAC VLAN).

Configurei algumas interfaces e parece que o modo "privado" não está funcionando como anunciado. Estou fazendo algo errado? O host é o lançamento do Ubuntu 18.04 Bionic.

Os pacotes estão sendo trocados dentro do host, ignorando o comando "mode private". É simples de reproduzir com apenas 4 comandos. Qualquer ajuda seria 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 reproduzir o 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

Então pingusando -Ia opção:

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

(substitua ens160pelo nome da sua interface Ethernet, por exemplo, eth0, ao tentar reproduzir)

Responder1

Os comandos que você está usando para criar as interfaces MACVLAN estão corretos.

No entanto, usar ping -Inão irá ajudá-lo a verificar isso. Quando as interfaces de origem e destino estão no mesmo host (e no mesmo namespace, como no seu caso), pingsempre terá sucesso.

Como você testa isso, então? Colocando suas interfaces MACVLAN em namespaces diferentes e não padrão. Em seguida, execute pinga partir do namespace.

Vamos supor que você comece com sua interface física ( ens160) com endereço IP 192.0.2.2/24. Vamos supor também que o endereço do gateway do seu roteador seja 192.0.2.1.

Agora:

# 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

Deste ponto em diante, ambas as interfaces macvtap poderão executar ping no gateway com êxito:

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

Se você tiver acesso ao dispositivo gateway, poderá confirmar se as entradas ARP para 192.0.2.205 e 192.0.2.6 mostram os endereços MAC das interfaces macvlan.

No entanto, como as interfaces macvlan estão no privatemodo, os seguintes comandos falharão:

# 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 a experiência com bridgeem vez de private; você observará que os dois últimos comandos ping serão bem-sucedidos.

informação relacionada