Режим интерфейса Linux MACVLAN с приватным режимом, похоже, не работает так, как заявлено (Ubuntu)

Режим интерфейса Linux MACVLAN с приватным режимом, похоже, не работает так, как заявлено (Ubuntu)

Я пытаюсь создать виртуальные интерфейсы (типа MACVLAN) так, чтобы все коммуникации между интерфейсами отправлялись из хоста к вечному шлюзу по умолчанию. Существует множество статей, описывающих "частный" режим, напримерздесь

Частный: Фильтровать все входящие пакеты так, чтобы ни одна MAC VLAN, привязанная к интерфейсу, не могла взаимодействовать друг с другом (отбрасывать все пакеты, входящие через интерфейс, у которых исходный MAC-адрес совпадает с одним из интерфейсов MAC VLAN).

Я настроил пару интерфейсов, и похоже, что режим "private" не работает так, как заявлено. Я что-то делаю не так? Хост — Ubuntu 18.04 Bionic release.

Пакеты переключаются внутри хоста, игнорируя команду "mode private". Это легко воспроизвести всего 4 командами. Любая помощь будет оценена.

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

Команды для воспроизведения проблемы

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

Затем pingиспользуем -Iопцию:

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

( ens160при попытке воспроизвести замените на имя вашего интерфейса Ethernet, например, eth0)

решение1

Команды, которые вы используете для создания интерфейсов MACVLAN, верны.

Однако использование ping -Iне поможет вам это проверить. Когда оба интерфейса источника и назначения находятся на одном хосте (и в одном пространстве имен, как в вашем случае), pingвсегда будет успешно.

Как же это проверить? Размещая интерфейсы MACVLAN в разных, нестандартных, пространствах имен. Затем выполните pingиз пространства имен.

Предположим, что вы начинаете с вашего физического интерфейса ( ens160) с IP-адресом 192.0.2.2/24. Предположим также, что адрес шлюза вашего маршрутизатора 192.0.2.1.

Сейчас:

# 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

С этого момента оба интерфейса macvtap смогут успешно пинговать шлюз:

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

Если у вас есть доступ к шлюзовому устройству, вы сможете убедиться, что записи ARP для 192.0.2.205 и 192.0.2.6 показывают MAC-адреса интерфейсов macvlan.

Однако, поскольку интерфейсы macvlan находятся в privateрежиме, обе следующие команды не будут выполнены:

# 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

Повторите эксперимент с bridgeвместо private; вы увидите, что последние две команды ping будут выполнены успешно.

Связанный контент