Фильтрующий мост(bridge) между сетевыми интерфейсами на freebsd.

Надо сделать мост между двумя интерфейсами, и фильтровать и шейпить фаером траффик. Как всегд любимая freebsd 6.2 и OpenBSD packet filter. В основе лежит статья http://rostovlinux.ru/content/view/152/56/

Поехали. Переделываем ядро, добавляем туда:
device if_bridge # функции моста в ядре

#enabling packet filter
device pf
device pflog
device pfsync

#enabling altq shaper.
options ALTQ
options ALTQ_CBQ
options ALTQ_RED
options ALTQ_RIO
options ALTQ_PRIQ
options ALTQ_NOPCC

Компилируем, устанавливаем, ребутимся.
Переходим к созданию моста.
ifconfig bridge0 create #создаем виртуальный интерфейс
ifconfig bridge0 addm ed0 addm xl0 #добавляем интерфейсы вмост
ifconfig bridge0 up #поднимаем мост
ifconfig bridge0 deletem fpx1 # Вот так вот можно удалять интерфейсы из моста.

Чтобы всё это заработало после ребута, добавляем строки в rc.conf:
cloned_interfaces="bridge0"
ifconfig_bridge0="addm ed0 addm xl0 up"
ifconfig_ed0="inet 84.xxx.xxx.xxx netmask 255.255.255.248 up"
ifconfig_xl0="up"

Фильровать пакетики внутри моста можно как на физических интерфейсах, в нашем случае это xl0 и ed0, так и на виртуальном интерфейсе: bridge0. Этим управляют переменные sysctl:
# sysctl net.link.bridge.pfil_member=1 #фильтрация на физических интерфейсах
# sysctl net.link.bridge.pfil_bridge=1 #фильтрация на виртуальном интерфейсе

Возможно варианты, когда обе переменные установлены в 1 или в 0.
Мне больше нравится коцепция фильтрации на виртуальном интерфейсе. Хотя посмотрим будет ли так работать altq :)

Вот еще команды, для управления мостом:
Добавление интерфейса:
# ifconfig bridge0 addm fxp0
Удаление интерфейса:
ifconfig bridge0 deletem fxp0
Просмотр таблицы коммутации:
ifconfig bridge0 addr
Установка размера Кеша адресов:
ifconfig bridge0 maxaddr 100
Установка времени жизни адреса в кеше (в секундах):
ifconfig bridge0 timeout 1000
Обнуление динамически запомненной таблицы коммутации (очистка кеша адресов):
ifconfig bridge0 flush
Обнуление всей таблицы коммутации( удаляются даже статически заданные адреса).
ifconfig bridge0 flushall
Добавление статической записи в таблицу коммутации (кеш адресов):
ifconfig bridge0 static fxp0 00:11:22:33:44:55
Удаление адреса из кеша (таблицы коммутации):
ifconfig bridge0 deladdr 00:11:22:33:44:55
Установка/Снятие атрибута learning на отдельном интерфейсе (то есть создаётся ли динамически кеш адресов на интерфейсе):
ifconfig bridge0 learn fxp0
ifconfig bridge0 -learn fxp0

Включение/Выключение работы STP протокола на интерфейсе:
ifconfig bridge0 stp fxp0
ifconfig bridge0 -stp fxp0

Управление работой протокола STP на интерфейсах – читайте в man ifconfig про : maxage, fwddelay, hellotime, priority, ifpriority, ifpathcost.

Теперь настроим altq. В pf.conf я добавил следующие строчки между секциями с нормализацией траффика и NAT:
##########
# Speed ##
##########
#queueing Incoming traffic for spin
altq on $spinif priq bandwidth 512Kb queue {std_spin, buyers, director, reg_managers, self}
queue std_spin on $spinif priq(default)
queue buyers priority 6 priq(red)
queue director priority 8
queue reg_managers priority 10
queue self priority 15#shaping for fox
altq on $foxif cbq bandwidth 128Kb queue { std_fox }
queue std_fox on $foxif cbq(default)
Этим мы определили очереди и их приоритеты. Теперь надо траффик раскидать по очередям, это уже в правилах фаервола:
#Assigning spin traffic
pass in quick on $spinif from $reg_managers to any flags S/SA keep state queue reg_managers
pass in quick on $spinif from $director to any flags S/SA keep state queue director
pass in quick on $spinif from $buyers to any flags S/SA keep state queue buyers
pass in quick on $spinif from $spinif to any flags S/SA keep state queue self
pass in quick on $spinif from $spinnet to any flags S/SA keep state #all other traffic is set to default queue

Вот в общем и всё.

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s