Настройка фильтрующего сетевого моста на базе FreeBSD 6.0 с if_bridge


Настройка сетевого моста

Компьютер под управлением FreeBSD с несколькими интерфейсами может выступать не только в роли маршрутизатора между сегментами сети , но и в роли коммутатора с фильтрацией пакетов (сетевой мост). В коде FreeBSD 5-STABLE и 6-STABLE есть 2 реализации сетевого моста - bridge и if_bridge. Первая реализация будет скоро удалена из кода FreeBSD, так что рассмотрим создание фильтрующего моста с помощью более функционального кода if_bridge.

Можно выделить несколько этапов данного процесса:
1. Подготовка ядра ОС
2. Включении моста
3. Подключение интерфейсов
4. Настройка правил фильтрации пакетов
5. Управление работой моста


1 Сборка ядра

Для начала пересоберём ядро с дополнительными опциями:

# cd /usr/src/sys/i386/conf
# cp GENERIC BRIDGE
# vi BRIDGE


Тут вносим следующие добавления необходимые для работы Фильтрующего сетевого моста:

#Включение поддержки IPFW
options IPFIREWALL
#Включение в ядро кода сетевого моста
device if_bridge


Далее выполняем собственно сборку ядра:

# config BRIDGE
# cd /usr/src/sys/i386/compile/BRIDGE
# make cleandepend
# make depend
# make
# make install
# reboot


Ну или просто:

# make cleandepend && make depend && make && make install && reboot


2 Включение моста в работу

Для начала выполним:

# ifconfig bridge0 create


В выводе ifconfig должен появиться дополнительный интерфейс - bridge0


3 Подключение интерфейсов

Чтобы мост заработал полноценно ему необходимо задать имена интерфейсов, между которыми можно выполнять коммутацию пакетов.

3.1 Добавление интерфейсов

Для работы коммутатора необходимо как минимум 2 интерфейса, поэтому подключаем их (в нашем случае это будут fxp0,fxp1,fxp2, то есть создадим коммутатор с 3-мя портами).

# ifconfig bridge0 addm fxp0 up
# ifconfig bridge0 addm fxp1 up
# ifconfig bridge0 addm fxp2 up


На всякий пожарный выполним переподнятие интерфейса bridge0:

# ifconfig bridge0 up


В принципе мост должен уже заработать, если фаервол не блокирует прохождение пакетов.

3.2 Удаление интерфейсов их моста:

При работе иногда возникает необходимость выключить какой-либо интерфейс коммутатора из его работы. Для того чтобы удалить какой-либо интерфейс необходимо сделать следующее:

# ifconfig bridge0 deletem fpx1


Эта команда удалит интерфейс fxp1 из работы моста.
Для того чтобы все изменения остались после перезагрузки компьютера в rc.conf добавим строки:

cloned_interfaces="bridge0"
ifconfig_bridge0="addm fxp0 addm fxp1 addm fxp2 up"
ifconfig_fxp0="up"
ifconfig_fxp1="up"
ifconfig_fxp2="up"


Удобно навесить IP адрес на какой-либо интерфейс для последующего управления сервером фильтрации удалённо. Адрес можно навесить как на
bridge0, так и на другие интерфейсы. Например в rc.conf за место 'ifconfig_fxp0="up"' напишем строку:

ifconfig_fxp0="inet 192.168.0.1 netmask 255.255.255.0 up"


4 Настройка правил фильтрации пакетов

В man(4) if_bridge описано как можно изменить поведение сетевого моста для фильтрации пактов. Механизм работы: пакет из сети попадает на
входящий интерфейс, далее проходит интерфейс bridge0. Там решается его судьба: согласно таблицы коммутации (как у всех коммутаторов определяется порт (в нашем случае интерфейс) куда далее отправляется пакет. А с этого конечного интерфейса он уже уходит в сеть. Пакеты проходящие через мост можно фильтровать различными способами:

а) На входящих и исходящих интерфейсах (для этого необходимо установить значение переменной net.link.bridge.pfil_member=1):

# sysctl net.link.bridge.pfil_member=1


б) На "промежуточном" интерфейсе (net.link.bridge.pfil_bridge=1)

# sysctl net.link.bridge.pfil_bridge=1


в) И там и там, то есть обе переменные установить в 1.

г) Нигде, то есть обе переменные установить в 0 (Пакеты проходящие сквозь мост не будут подвергаться фильтрации).

Проще всего "мостовые" пакеты фильтровать на интерфейсе bridge0. Но меня больше устраивает вариант фильтрации на всех интерфейсах (возможность более гибкого управления поведением моста и самим сервером). Поэтому выполним:

# sysctl net.link.bridge.pfil_member=1
# sysctl net.link.bridge.pfil_bridge=1


Далее настроим правила фаервола:
Если ничего фильтровать не хотите:

# ipfw add 100 allow ip from any to any


Если нужна фильтрация тогда решать вам как её делать. Не следует забывать разрешать прохождение пакетов на интерфейсе bridge0 иначе ваш мост работать не будет совсем.Приведу небольшой пример по фильтрации пакетов сетевым мостом.

Пусть иметься сеть 10.0.0.0/21 (То есть с маской 255.255.248.0). Мост ограничивает сеть с ай пи адресацией 10.0.1.0/24. Задача: требуется без разделения сети на сегменты ограничить доступ пользователем в остальную сеть Внешний кусок сети висит на интерфейсе fxp0, внутренний на fxp1. Правила фильтрации настроим следующим способом:

# sysctl net.link.bridge.pfil_member=1
# sysctl net.link.bridge.pfil_bridge=1


Далее введём следующие правила:

# ipfw flush (только если вы находитесь за консолью!!!!)
# ipfw add 100 allow mac-type arp (Всё же разрешим прохождение arp пакетов сквозь мост)
# ipfw add 200 allow ip from any to any via bridge0 (разрешим весь трафик на интерфейсе )
(bridge0,проще конечно было сделать )
(sysctl net.link.bridge.pfil_bridge=0 )
# ipfw add 300 allow ip from any to any out via fxp1
# ipfw add 400 allow ip from any to any out via fxp0 (Разрешаем весь исходящий трафик)
(с обоих интерфейсов коммутации)
# ipfw add 500 allow ip from not 10.0.1.0/24 to 10.0.1.0/24 in via fxp0 (Разрешили все )
( входящие пакеты с сети во внутрь)
# ipfw add 600 allow ip from 10.0.1.1 to any in via fxp1
# ipfw add 700 allow ip from 10.0.1.2 to any in via fxp1
# ipfw add 800 allow ip from 10.0.1.3 to any in via fxp1
# ipfw add 900 allow ip from 10.0.1.4 to any in via fxp1
# ipfw add 1000 allow ip from 10.0.1.5 to any in via fxp1
# ipfw add 1100 allow ip from 10.0.1.6 to any in via fxp1

(Тут прописали список разрешённых адресов)


Если при этом последнее правило 65536 deny ip from any to any, мы получим мост который выпустит во внешнюю сеть только адреса с 1-го по 6-й, остальным доступ будет "наружу" запрещён. Следует отметить, что это только пример, так что с правилами в вашем конкретном случае решать придётся подумать.


5 Управление работой сетевого моста

Управление работой сетевого моста было частично описано выше: удаление, добавление интерфейсов, настройка способов фильтрации. Более подробную информацию можно найти в man ifconfig.

a) Добавление интерфейса:

# ifconfig bridge0 addm fxp0


b) Удаление интерфейса:

# ifconfig bridge0 deletem fxp0


c) Просмотр таблицы коммутации:

# ifconfig bridge0 addr


d) Установка размера Кеша адресов:

# ifconfig bridge0 maxaddr 100


e) Установка времени жизни адреса в кеше (в секундах):

# ifconfig bridge0 timeout 1000


f) Обнуление динамически запомненной таблицы коммутации (очистка кеша адресов):

# ifconfig bridge0 flush


g) Обнуление всей таблицы коммутации( удаляются даже статически заданные адреса).

# ifconfig bridge0 flushall


h) Добавление статической записи в таблицу коммутации (кеш адресов):

# ifconfig bridge0 static fxp0 00:11:22:33:44:55


i) Удаление адреса из кеша (таблицы коммутации):

# ifconfig bridge0 deladdr 00:11:22:33:44:55


j) Установка/Снятие атрибута learning на отдельном интерфейсе (то есть создаётся ли динамически кеш адресов на интерфейсе):

# ifconfig bridge0 learn fxp0
# ifconfig bridge0 -learn fxp0


k) Включение/Выключение работы STP протокола на интерфейсе:

# ifconfig bridge0 stp fxp0
# ifconfig bridge0 -stp fxp0


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

Обновлено: 12.03.2015