Linux: мосты, VLAN и RSTP
Я попытался выяснить, как настроить RSTP в Linux с использованием VLAN и мостов, и теперь я полностью сбит с толку.
Я пытаюсь соединить три интерфейса, два из которых должны выступать в качестве транка (hdlc0 и hdlc1), а один - порта доступа (eth0). Мне также нужно включить RSTP на каждом интерфейсе, включенном в мост, но с конфигурацией, указанной ниже, пакеты RSTP отправляются через теги hdlc0 и hdlc1 (!), Поэтому другие устройства их отклоняют. Поскольку в Linux нет понятия "родной vlan", я понятия не имею, как это исправить.
Вот моя конфигурация:
ifconfig eth0 up
ifconfig hdlc0 up
ifconfig hdlc1 up
vconfig add hdlc0 42
vconfig add hdlc1 42
ifconfig hdlc0.42 up
ifconfig hdlc1.42 up
brctl addbr br1
brctl addif br1 eth0
brctl addif br1 hdlc0.42
brctl addif br1 hdlc1.42
ifconfig br1 up
brctl stp br1 on
Другой вопрос: мне также интересно, как настроить RSTP в сценариях, где у меня есть несколько мостов: скажем, eth0 является транком с разрешенным vlan 42-42, vlan 42 должен проходить через hdlc0, а vlan 43 должен проходить через hdlc1, поэтому я имею два моста. Если я включу RSTP на обоих мостах, он (вероятно) будет работать независимо на каждом мосту, так что скоро у меня возникнут проблемы?
1 ответ
В Linux VLAN и мосты - это совершенно разные конструкции, а Linux-мосты не "осведомлены о VLAN".
Когда вы создаете интерфейс VLAN, Linux помечает / размечает пакеты на этом интерфейсе перед передачей их в / из базового физического ("транкового") интерфейса. Тем не менее, вы все равно можете использовать базовый физический интерфейс для отправки немаркированных ("родных VLAN") пакетов.
Когда вы создаете мост, Linux переключает пакеты между связанными интерфейсами, не обращая внимания на теги VLAN (или их отсутствие) на пакетах. Если вы подключите магистральный интерфейс к мосту, мост с радостью переключит пакеты с тегами VLAN, не обращая внимания на теги. Когда вы включаете STP на мосту, Linux генерирует немаркированные пакеты STP и отбрасывает их на мосту.
Когда мост подключен к физическому интерфейсу, который также имеет связанные интерфейсы VLAN, эти интерфейсы VLAN перестанут видеть любой трафик, который не предназначен для MAC-адреса физического интерфейса. Такое поведение обусловлено порядком, в котором обрабатываются мостовые соединения и теги VLAN, и может быть изменено с использованием ebtables, как описано на http://blog.rackspace.com/vms-vlans-and-bridges-oh-my-part-2, Тем не менее, что касается связующего дерева, то подключение мостов к физическому интерфейсу и к соответствующим интерфейсам VLAN будет работать должным образом, только если вы все равно используете PVST+ (поскольку блокировка порта STP управляется независимо для каждого моста), так что это не совсем так. здесь актуально.
Но вы также можете создать интерфейсы VLAN поверх моста, который передает помеченные пакеты VLAN, а затем добавить эти интерфейсы VLAN к другим мостам.
Итак, чтобы выполнить то, что вы хотите, попробуйте:
ip link set dev hdlc0 up
ip link set dev hdlc1 up
brctl addbr br_native
brctl addif br_native hdlc0
brctl addif br_native hdlc1
brctl stp br_native on
ip link set dev br_native up
ip link add link br_native name br_native.42 type vlan id 42
ip link set dev br_native.42 up
ip link set dev eth0 up
brctl addbr br_42
brctl addif br_42 br_native.42
brctl addif br_42 eth0
ip link set dev br_42 up
Обратите внимание, что код моста ядра Linux только изначально поддерживает традиционный 802.1D STP. Чтобы добавить поддержку RSTP и PVST+, используйте https://github.com/mstpd/mstpd (Некоторая соответствующая документация для mstpd также может быть найдена по адресу: https://docs.cumulusnetworks.com/display/DOCS/Spanning+Tree+and+Rapid+Spanning+Tree). mstpd также может говорить на MSTP, но из-за того, как Linux реализует свои FIB, в настоящее время невозможно отобразить топологии MSTP на мосты Linux, поэтому MSTP фактически не работает.
Отвечая на ваш второй вопрос, я не верю, что возможно (на любом коммутаторе, не только при использовании Linux) использовать STP или RSTP для направления каждой из двух разных VLAN в одной магистрали через два других транка. Это может быть достигнуто только с помощью PVST+ или MSTP, хотя, как упоминалось выше, MSTP не поддерживается в Linux.
Начиная с ядра Linux 3.0 или около того, мосты Linux "не поддерживают VLAN". https://linux-blog.anracom.com/2017/10/30/fun-with-veth-devices-in-unnamed-linux-network-namespaces-i/ и последующие статьи дают довольно хорошее объяснение, но в заключение:
Вы можете использовать bridge(8)
инструмент для манипулирования взаимодействиями типа "мост-влан", способом, не отличающимся от большинства управляемых коммутаторов.
В вашей ситуации вы можете попробовать что-то вроде:
# ip link set br0 type bridge vlan_filtering 1 vlan_default_pvid 1 stp_state 1 priority 32768 nf_call_iptables 1 nf_call_arptables 1
# bridge vlan add vid 1 pvid untagged dev eth0
bridge vlan add vid 19 dev eth0
ip link set up dev eth0
ip link set up dev hdlc0
ip link set up dev hdlc1
# if you only want to bridge VLAN42, you don't need these, but here's how you'd create them:
# ip link add link hdlc0 name hdlc0.42 type vlan protocol 802.1q id 1 reorder_hdr on gvrp on mvrp on loose_binding off
# ip link add link hdlc1 name hdlc1.42 type vlan protocol 802.1q id 1 reorder_hdr on gvrp on mvrp on loose_binding off
# ip link set up dev hdlc0.42
# ip link set up dev hdlc1.42
# now for the actual bridging:
brctl addbr br1
brctl addif br1 eth0
brctl addif br1 hdlc0
brctl addif br1 hdlc1
# port eth0 is an untagged port; assuming it should be in VLAN42:
bridge vlan add vid 42 dev eth0 pvid untagged
# hdlc0 is a trunk interface that forwards vlan42 in a tagged manner:
bridge vlan add vid 42 dev hdlc0
# hdlc1 carries vlan42 and vlan43, both with tagging:
bridge vlan add vid 42 dev hdlc1
bridge vlan add vid 43 dev hdlc1
brctl stp br1 on
ip link set up dev br1
Вы также можете добавить интерфейс vlan к мосту, который затем будет делать то, что логично, если вы подумаете об этом: мост генерирует кадр Ethernet и передает его в порт, который отправляет его. Синдром, о котором идет речь, - это интерфейс vlan, он добавляет тег vlan перед отправкой фрейма. Я уверен, что для этого есть действительные применения, но пока не могу придумать ни одного.:)