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

Вопрос или проблема

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

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

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

Пакеты переключаются внутри хоста, игнорируя команду «передача в приватный режим». Это легко воспроизвести всего с 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 адрес ens160.5> <IP адрес ens160.6>

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

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

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

Как же вы это проверяете? Путем размещения ваших интерфейсов MACVLAN в разных, не по умолчанию, пространствах имен. Затем выполните ping из этого пространства имен.

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

Теперь:

# Создайте пространство имен с именем "ns5"
ip netns add ns5

# Создайте интерфейс macvlan, как обычно
ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private

# Переместите только что созданный интерфейс macvlan в пространство имен "ns5"
ip link set ens160.5 netns ns5

# Включите интерфейс. Обратите внимание на префикс "ip netns exec ns5".
ip netns exec ns5 ip link set ens160.5 up

# Установите IP-адрес для интерфейса macvlan. Обратите внимание на префикс "ip netns exec ns5".
ip netns exec ns5 ip address add dev ens160.5 192.0.2.205/24

# Повторите вышеуказанное для другого интерфейса macvlan, который будет в другом пространстве имен
# с названием "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 смогут успешно выполнять ping к шлюзу:

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, следующие команды обе не удастся выполниться:

# Попробуйте достичь ens160.6 из ens160.5
ip netns exec ns5 ping 192.0.2.206

# Попробуйте достичь ens160.5 из ens160.6
ip netns exec ns6 ping 192.0.2.205

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

Ответ или решение

Использование MACVLAN в режиме Private на Ubuntu: Решение проблемы

При работе с виртуальными интерфейсами в Linux, в частности с использованием MACVLAN, возникают ситуации, когда конфигурация может не вести себя так, как это ожидается. Пользователь, предоставивший описание проблемы, столкнулся с тем, что режим "private" не работает должным образом на Ubuntu 18.04. В данной статье мы рассмотрим, как правильно настроить MACVLAN в режиме "private" и как проверить его функциональность.

Описание проблемы

Пользователь создал несколько MACVLAN интерфейсов с помощью команд ip link, однако ожидал, что в режиме "private" данные пакеты, приходящие от одного MACVLAN интерфейса, не будут доступными для других интерфейсов. Это означает, что интерфейсы не должны иметь возможности коммуницировать между собой, только с внешними сетевыми узлами.

Балансировка сетевых интерфейсов

Для успешного тестирования функций MACVLAN в режиме "private" стоит обратить внимание на то, что создаваемые интерфейсы должны находиться в различных сетевых пространствах имен (namespaces). Поскольку в стандартном пространстве имен все MACVLAN интерфейсы могут видеть друг друга, это мешает корректной проверке работы режима "private".

Шаги по настройке

  1. Создание сетевых пространств имен:
    Создайте два сетевых пространства имен для изолированного тестирования MACVLAN интерфейсов:

    ip netns add ns5
    ip netns add ns6
  2. Создание и перемещение MACVLAN интерфейсов:
    Создайте MACVLAN интерфейсы и переместите их в соответствующее пространство имен.

    ip link add link ens160 address 38:94:ed:99:99:1B ens160.5 type macvlan mode private
    ip link set ens160.5 netns ns5
    ip netns exec ns5 ip link set ens160.5 up
    ip netns exec ns5 ip address add dev ens160.5 192.0.2.205/24
    
    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
  3. Тестирование соединения:
    Теперь вы можете протестировать, как работают MACVLAN интерфейсы. Попробуйте выполнить ping на шлюз из каждого пространства имен:

    ip netns exec ns5 ping 192.0.2.1
    ip netns exec ns6 ping 192.0.2.1
  4. Проверка изоляции:
    Проверьте изоляцию между интерфейсами с помощью ping:

    ip netns exec ns5 ping 192.0.2.206  # Это должно не сработать
    ip netns exec ns6 ping 192.0.2.205  # Это также должно не сработать

Если вышеуказанные команды для ping между интерфейсами не сработали, это подтверждает, что режим "private" функционирует корректно.

Заключение

Если вы следовали всем шагам, и обмен данными между интерфейсами по-прежнему происходит, убедитесь, что ваша версия ядра Linux поддерживает режим "private" MACVLAN. В некоторых старых версиях могут быть проблемы с реализацией. Обновите систему, если это необходимо.

Подводя итоги, использование MACVLAN в режиме "private" требует понимания пространств имен и как они работают, чтобы обеспечить изоляцию интерфейсов. Ознакомленность с правильными командами и методами тестирования позволит вам эффективно настраивать сетевые интерфейсы на вашем Ubuntu сервере.

Оцените материал
Добавить комментарий

Капча загружается...