SuperVlan, ip-unnumbered на FreeBSD

Опубликовано admin в Чт, 24/02/2011 - 10:56

Читал как реазлизут аналоги ip-unnumbered, super vlan во FreeBSD и решил предоставить свое решение.
Использовать будем следующие модули :

  • netgraph
  • ng_vlan
  • ng_ether

Если кто не знает, загрузить модули можно таким образом:

kldload /boot/kernel/netgraph.ko
kldload /boot/kernel/ng_vlan.ko
kldstat
Id Refs Address            Size     Name
 1    7 0xffffffff80100000 646a60   kernel
 4    1 0xffffffff8082c000 2526     netgraph.ko
 5    1 0xffffffff8082f000 d66      ng_vlan.ko
 6    1 0xffffffff80830000 23d6     if_vlan.ko

Далее прикинем что у нас есть две сетевые em0(внутренняя) и em1(внешняя) . И вот на внутреннюю сетевую нам нужно принимать кучу вланов. Скажем у нас идентификаторы вланов будут 5-10 и создаваться при помощи ng_vlan. Создаем ноду для вланов :

ngctl
+mkpeer em0: vlan lower downstream
+name em0:lower vlan
+connect em0: vlan: upper nomatch
+quit

Сами вланы создаем таким образом :

ngclt
+mkpeer vlan: eiface vlan5 ether
+name vlan:vlan5 vlan5
+msg vlan: addfilter { vlan=5 hook="vlan5" } 
+quit

В выводе ifconfig'a появится интерфейс вида ngethX, где Х - порядковый номер, я сразу
обзываю его по имени влана

ifconfig ngeth0 name vlan5

Назначим влану мак адрес такой же как и на нашем внутреннем интерфейсе em0

ifconfig vlan5 ether `ifconfig em0 | grep ether | awk '{print $2}'` up

Далее проделайте все тоже самое для вланов 6-10

Вланы созданы, осталось сделать для них loopback интерфейс, выкручиваемся и создаем бридж интерфейс:

ifconfig bridge0 create
 #Назначим мак адрес бриджу 
ifconfig bridge0 ether `ifconfig em0 | grep ether | awk '{print $2}'` 
ifconfig bridge0 inet 5.5.5.1 netmask 255.255.255.0 up
ifconfig bridge0 addm vlan5 #Добавляем интерфейс в бридж 
ifconfig bridge0 addm vlan6 #Добавляем интерфейс в бридж

Добавляем последние штрихи в нашу картину. Делаем вланы приватными

ifconfig bridge0 private vlan5
ifconfig bridge0 private vlan6

Убираем discover аттрибут

ifconfig bridge0 -discover vlan5
ifconfig bridge0 -discover vlan6

И наконец делаем вланы "прилипчивыми"

ifconfig bridge0 sticky vlan5
ifconfig bridge0 sticky vlan6

Это позволит пользователям из разных влан'ов "видеть" ип адресс 5.5.5.1 но никоим образом не общаться между собой. Для маршрутизации между клиентами придется прописывать роут для каждого IP-адреса или сети. Таким образом у нас получается SuperVlan (в терминалогии HP) или ip-unnumbered for SVI-interface (в терминалогии Cisco). Если вланов много и в них много клиентов, советую сразу увеличить размер хранимых маков в бридж интерфейсе (на моем примере это 4000) коммандой

ifconfig bridge0 maxaddr 4000

Так же при такой конфигурации в "боевом" режиме периодически отваливался внутренний интерфейс, примерно раз в неделю. Отваливался, в логи падало что не хватает дескрипторов сетевой (up &down для сетевой не помогал), гугль по этому поводу тоже молчал - советовали ковырять нагрузки,очереди,драйвера. И только через пару недель нечаянно выключив и включив обратно бридж интерфейс проблема решилась, добавив в крон запуск "ifconfig bridge0 down up" каждые 15 минут моя жизнь стала куда спокойней.





Источник: http://alienstudio.ru/freebsd-supervlan-ip-unnumbered/