FreeBSD + 802q + ng_vlan и ng_trunk

FeeBSD + полноценный 802q vlan + trunk


    В данной статье мы опишем как организовать полноценный 802q trunk на базе ОС FreeBSD и модульной подсистемы NETGRAPH. К примеру скажем  сетевые карты, три из которых являются не транковыми re0:vlan10  а re1:vlan20 em0:vlan30 и вам нужно повесить фильтры и сделать транковым порт re2:trunk пропустить фильтруемый trunk порт с vlan10,vlan20 и vlan30,а не в тупую весь не фильтруемый трафик прицепив к ng_bridge. Прям как у настоящих дорогостоящих маршрутизаторов smart к примеру CISCO. В примере далее на изображении показан профaпрофессиональная реализация trunk-канала между сервером FreeBSD и Cisco.



Дело в том что в стандартном наборе модулей netgraph -а есть фильтр ng_vlan, но он не является мультифилтром для организации полноценного транкого  порта.
Т.е. для портов re0:vlan10, re1:vlan20, em0:vlan30 вполне справится модуль ng_vlan, но опятьже для порта re2:trunk не возможно организовать павильно фильтруемы порт по тегам vlan. Конечно можно назвать порт 
re2:trunk транковым и просто пустить через него весь трафик. Но это не будет правильным так как к примеру мне не нужно пропускать не тегированый трафик!
    Предисловия о Jouniper. Когда то позаимствовала ядро FreeBSD для своей серии МЭ. В ответ компания поделилась модулем netgraph, что в свою очередь очень сильно расширила сетевые возможности. Но
самособой компания отдала не все модули к примеру возможности trunk и другие вкусности на замену openvswitch . Автор данного патча решила изменить хот событий и на энтузиазме написала несколько патчей
которые войдут в проект как контролируемый маршрутизатор. В данный момент она не сильно вдохновлена аудиторией и что мы решили исправить. Сегодня мы предоставим один из патчей который позволяет
добавить возможность фильтрации по тегам vlan. Если данный проект интересен то напишите на почту tj@it-club.kz. Так же она принимает донаты. По словам автора она возобновит работу и в течении месяца полностью напишет
серию патчей и модулей которые сделают FreeBSD полностью аналогом cisco или jouniper если увидит, что это действительно нужно. Счет для донаты: KZ86826A1KZTD2012009 БИН:170 340 020 993 БИК:SABRKZKA

    И так поехали! На примере используется FreeBSD 11.2 , но вы можете аналогично использовать любую редакцию FreeBSD.
# uname -r
11.2-RELEASE

# fetch https://mirror.yandex.ru/freebsd/releases/amd64/11.2-RELEASE/src.txz -o /tmp
/tmp/src.txz                                    100% of  146 MB   85 kBps 13m14


# tar xvpf /tmp/src.txz -C /

Скопируем оригинальный файлы на всякий случай

# (cd /usr/src/sys/netgraph; cp ng_vlan.c ng_vlan.c.back; cp ng_vlan.h ng_vlan.h.back; )

Далее скачаем патч

# fetch -o /usr/src/sys/netgraph https://it-club.kz/public/storage/298159977-patch-ng_vlan.c
# fetch -o /usr/src/sys/netgraph https://it-club.kz/public/storage/796830555-patch-ng_vlan.h

Далее накладываем патчи:
# (cd /usr/src/sys/netgraph; patch < 298159977-patch-ng_vlan.c; patch < 796830555-patch-ng_vlan.h)
после чего можно собрать ядро либо модули отдельно, мол как вам удобно мы для примера соберем модули отдельно:

# (cd /usr/src/sys/modules/netgraph/vlan; make clean cleandepend; make; make install)

После компиляции в случае как у нас модули будут лежать в папке /boot/modules которые можно загрузить и при необходимости добавить в rc.conf kld_list="/boot/modules/ng_vlan.ko"

    Теперь маленький пример по использованию согласно схемы:

# cat /etc/rc.d/vlans.sh

#!/bin/sh
# VLAN 10
ngctl mkpeer re0: vlan lower downstream
ngctl name re0:lower vl_re0
ngctl connect re0: vl_re0: upper nomatch
ngctl mkpeer vl_re0: eiface vlan10 ether
ngctl msg vl_re0: addfilter '{vlan=10 hook="vlan10" trunk=[0]}'
# VLAN 20
ngctl mkpeer re1: vlan lower downstream
ngctl name re01:lower vl_re1
ngctl connect re1: vl_re1: upper nomatch
ngctl mkpeer vl_re1: eiface vlan20 ether
ngctl msg vl_re1: addfilter '{vlan=20 hook="vlan20" trunk=[0]}'
# VLAN 30
ngctl mkpeer em0: vlan lower downstream
ngctl name em0:lower vl_em0
ngctl connect em0: vl_em0: upper nomatch
ngctl mkpeer vl_em0: eiface vlan30 ether
ngctl msg vl_em0: addfilter '{vlan=30 hook="vlan30" trunk=[0]}'
# TRUNK VLANS 10,20,30
ngctl mkeep re2: vlan lower downstream
ngctl name re2:lower v802q
ngctl connect re2: v802q: upper nomatch
ngctl mkpeer v802q: eiface vlan0 ether
ngctl msg v802q: addfilter '{vlan=0 hook="vlan0" trunk=[10, 20, 30]}'


Таким образом мы получаем мощную ядерную реализацию vlan -ов и при этом никто не мешает использовать остальные модули к примеру ng_carp или ng_grep,ng_ipfw и т.д.
Автор данного патча видит это как связь ng_switch модуля и данного ng_vlan как маршрутизатор. (ng_switch имеется введу не реализация ng_bridge с именем switch , модуль ng_switch будет 
работать как настоящий smart switch). 

    Пишите отзывы вступайте в проект написав на почту tj@it-club.kz либо помогайте донатой и мы думаем если человек будет матевирован, то можно на базе FreeBSD делать более гипкие к примеру биллинговые системы в связке с любым оборудованием к примеру CISCO!