Как получить интерфейс VLAN в мосту Linux?

Как получить интерфейс VLAN в мосту Linux?

Я экспериментирую с мостами Linux и фильтрацией VLAN, но у меня возникло несколько проблем.

У меня есть виртуальная машина с транком (помеченные кадры), которая приходит на ens19. Я хочу подключить этот порт к мосту Linux и на этом мосту иметь «виртуальные» интерфейсы, которые помечены на нужной мне vlan с полным стеком TCP/IP позади него (стека хоста).

Для своих экспериментов я ограничиваюсь vlan 3 и 5, но идея в том, что это должно быть легко расширить. Использование не покажется огромным, поскольку его можно заменить подинтерфейсами ens19. Но позже интерес заключается в том, что я подключу порт ens19 к интерфейсу gretap для циркуляции нескольких vlan в туннеле.

Я провел тесты с интерфейсами dummy и tap, но, как мне кажется, это не работает, учитывая природу этих интерфейсов. Я провел тест с подинтерфейсом br0.3, но здесь мой клиент получает ответ ARP, но PING никогда не получает ответ ICMP...

ip link add name br0 type bridge vlan_filtering 1
ip link set dev br0 up
ip link add link br0 name br0.3 type vlan id 3
ip link set dev ens19 master br0
ip link set ens19 up
ip link set dev br0 up
ip link set dev br0.3 up
ip addr add 10.3.0.106/22 dev br0.3

КЛИЕНТСКИЙ ПИНГ > невозможно прервать тайм-аут, когда br0.3 запущен

КЛИЕНТ ARP: ОК

КЛИЕНТ ICMP: NOK

br0 дамп

решение1

Тупой мост

При текущей настройке трафик не проходит: все фильтруется мостом с поддержкой VLAN, поскольку по умолчанию он использует VLAN 1 на всех портах и ​​на своем собственном интерфейсе моста. Когда приходит или отправляется кадр с идентификатором VLAN 3, он отбрасывается, так как не соответствует фильтру.

Чтобы текущий эксперимент заработал, просто верните мост в состояние «глупого» моста:

ip link set dev br0 type bridge vlan_filtering 0

Теперь помеченный трафик ens19будет поступать (помеченным) br0(если не перенаправляется куда-либо еще), будет проходить без тегов br0.3и достигатьмаршрутизациястек (например: как тип IPv4, ARP или IPv6). Немаркированный трафик, если таковой имеется, также достигнетмаршрутизациястек через br0. Любой другой трафик с тегом VLAN будет сброшен, потому что нет ничего, что могло бы его захватить:маршрутизацияСам стек не понимает VLAN.

Мост будет пересылать кадры с тегами VLAN, не учитывая значение идентификаторов VLAN, что может вызвать проблемы, если один и тот же MAC-адрес используется в нескольких VLAN. Это может запутать обработку базы данных пересылки на мосту или привести к появлению дубликатов или петель на другом оборудовании и т. д.

Поэтому мост с поддержкой VLAN действительно предпочтительнее.


мост с поддержкой VLAN

Если мост должен играть нейтральную роль и цель состоит в том, чтобы легко создавать новые порты для каждой VLAN и даже больше,изменятьVLAN на портах без необходимости удалять и заново создавать интерфейс (как это необходимо для подинтерфейсов VLAN), то мост с поддержкой VLAN действительно полезен. В этой конфигурации, хотя все еще возможно использовать подинтерфейсы VLAN поверх br0, этого можно избежать. Вместо этого можно использоватьветпара для каждой такой VLAN: один как порт моста, один как интерфейс, взаимодействующий со стеком маршрутизации (это один из вариантов использованиявет(вообще не затрагивая сетевые пространства имен).

br0сам по себе не обязательно должен использоваться для маршрутизации, за исключением, может быть, использования его в качестве управления, если нет другого физического интерфейса (кроме ens19). Ниже настройка начинается с полной блокировки любого добавленного порта, включая br0его самого, также устанавливая vlan_default_pvid 0(вместо получения идентификатора VLAN порта по умолчанию 1 для всего). Это также позволяет немедленно установить мостовые порты UP без риска утечек во время настройки, поскольку по умолчанию ничего не может пройти.

Настройка VLAN на мосту с поддержкой VLAN используетbridge vlanкоманда с более новойrtnetlink(7)API ядра. Устаревшая brctlкоманда не может этого сделать, потому чтостарый API ядра(или /sys) не предоставляет возможности для этого.

Дело ОП разворачивается в виде последовательных шагов:

  • создание и магистральное соединение

    Мосту должен быть назначен собственный (и уникальный) MAC-адрес, чтобы он ненаследовать по умолчанию наименьший MAC-адрес, доступный на портах моста, которые могут меняться со временем:ветМетод ниже может заставить мост со временем изменить MAC-адрес при добавлении новых VLAN, что не является реальной проблемой для этого метода, но может повлиять на метод подинтерфейса VLAN, если он используется совместно, или повлиять на br0использование при наличии самого IP-адреса. В последних системах на базе systemd этоуже сделаносистемдкакой бы сетевой менеджер ни был задействован, даже если такое поведение нежелательно, если он обнаруживает новый виртуальный интерфейс типа Ethernet, созданный без указания его MAC-адреса.

    ip link add name br0 address 12:34:56:78:9a:bc up type bridge vlan_filtering 1 vlan_default_pvid 0
    ip link set dev ens19 up master br0
    
  • необязательно: br0по-прежнему использовать VLAN 1 (без тегов), передаваемый через ens19(с тегами), например, для управления:

    bridge vlan add vid 1 dev ens19
    bridge vlan del vid 1 dev br0 self pvid untagged
    

    selfДля настройки самого интерфейса моста требуется дополнительное ключевое слово.

  • добавьте VLAN ens19(здесь VLAN ID 3 и 5):

    bridge vlan add vid 3 dev ens19
    bridge vlan add vid 5 dev ens19
    

    Или если ens19 следует рассматриватьtheпорт восходящей линии связи, просто добавьте все остальные VLAN на него:

    bridge vlan add vid 2-4094 dev ens19
    

    Используйте -compressvlansдля отображения того, что на нем находится, иначе будет отображено 4093 строки отдельных записей.

    bridge -compressvlans vlan show dev ens19
    

Теперь того же общего результата можно достичь с помощью:

  • либо подинтерфейс VLAN поверх br0(здесь используется VLAN ID 3)

    Если к интерфейсу моста (здесь) или порту моста (следующий пункт) не добавлен идентификатор VLAN, такой трафик проходить не будет, если мост настроен как мост с поддержкой VLAN.

    Необходимо добавить идентификатор VLAN, по-прежнему помеченный, к br0:

    bridge vlan add vid 3 dev br0 self
    

    Как и выше, все можно было бы добавить заранее только один раз:

    bridge vlan add vid 2-4094 dev br0 self
    

    Затем поверх него добавляется обычный подинтерфейс VLAN:

    ip link add link br0 name br0.3 up type vlan id 3
    ip addr add 10.3.0.106/22 dev br0.3
    

    Изменение идентификатора VLAN, связанного с интерфейсом (а в обычных настройках — с IP LAN 10.3.0.0/22), требует удаления подинтерфейса и создания нового с другим идентификатором VLAN: интерфейс type vlanне может быть перенастроен.

  • или параветинтерфейсы (здесь используется VLAN ID 5)

    pvid untaggedиграет ту же роль, что и использование подинтерфейса VLAN: снимает теги с моста на порт, устанавливает теги с порта на мост. Только один идентификатор VLAN может быть PVID (и здесь это единственный используемый идентификатор VLAN).

    ip link add name vlan5 up type veth peer name br0vlan5
    ip link set br0vlan5 up master br0
    bridge vlan add vid 5 dev br0vlan5 pvid untagged
    ip addr add 10.3.4.106/22 dev vlan5
    

    За исключением того, что выбранные в примерах имена отражают идентификатор VLAN, что может вызвать у человека путаницу, связанный идентификатор VLAN можно изменить (почти) на лету (изменяя его здесь с 5 на 6):

    bridge vlan del vid 5 dev br0vlan5
    bridge vlan add vid 6 dev br0vlan5 pvid untagged
    

    И если вы еще не настроили все VLAN на ens19, измените это и там:

    bridge vlan del vid 5 dev ens19
    bridge vlan add vid 6 dev ens19
    

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