netgraph_load="YES" ng_ether_load="YES" ng_bridge_load="YES"
Есть 2 варианта работы системы1. Без модуля ng_bridge.Мы получим как бы объединение сетевых интерфейсов в один невидимый.Сами сервера с этими интерфейсами не будут видить трафик на них.Получается прозрачное соединение как будто между сетями протянули физический кабель.Весь трафик приходящий на интерфейс одного из серверов будет прозрачно проходить на другой.2. С модулем ng_bridge.Мы получим как бы включение интерфейсов на обоих серверах в один свитч.Сервера будут видеть трафик на интерфейсах.Трафик не предназначеный для соседней сети не пойдет по каналу (реализация обычного свитча).Конфигурация:Имеем два типичных роутера.1.Два сетевых интерфейсаfxp0 - белый интернет адрес для примера 1.1.1.1fxp1 - серый локальный адрес 192.168.0.12.Два сетевых интерфейсаfxp0 - белый интернет адрес для примера 1.1.1.2fxp1 - серый локальный адрес 192.168.0.2При загрузке модуля ng_ether на обоих роутерах в netgraph атоматически были созданы узлы с названием сетевых карт.
lmik# ngctl list There are 3 total nodes: Name: ngctl3178 Type: socket ID: 00000009 Num hooks: 0 Name: fxp0 Type: ether ID: 00000001 Num hooks: 0 Name: fxp1 Type: ether ID: 00000002 Num hooks
Вариант №1 непрактичный и рассматривать его не будем, просто напишу конфигурацию графов вдруг кому-то понадобится.
ngctl mkpeer fxp0 ksocket lower inet/dgram/udp ngctl msg switch:link1 bind inet/1.1.1.1:1234 ngctl msg switch:link1 connect inet/1.1.1.2:1234 ngctl msg fxp1: setpromisc 1 ngctl msg fxp1: setautosrc 0
Вариант №2На первом сервере конфигурация нетграфов будет выглядеть так:
#Создаем узел bridge и подключаем к его хуку link0 физический (нижний) уровень fxp1 ngctl mkpeer fxp1: bridge lower link0 #назовем этот узел switch ngctl name fxp1:lower switch #создадим узел ksocket и подсоединим его хуком inet/dgram/udp к хуку link1 нашего switch ngctl mkpeer switch: ksocket link1 inet/dgram/udp #Отправляем сообщение узлу switch:link1 (туда подключен узел ksocket) #чтобы тот забиндил сокет для входящего трафика на нашем внешнем IP ngctl msg switch:link1 bind inet/1.1.1.1:1234 #Отправляем команду узлу switch:link1 (туда подключен узел ksocket) #чтобы тот соединился со вторым сервером ngctl msg switch:link1 connect inet/1.1.1.2:1234 #Соединяем хук link2 нашего switch с верхним уровнем интерфейса fxp1 #т.е подключаем наш сервер в наш виртуальный свитч. ngctl connect switch: fxp1: link2 upper #включаем на сетевой карте прослушку всех пакетов, #а не только тех что предназначаются ей. ngctl msg fxp1: setpromisc 1 ngctl msg fxp1: setautosrc 0
На втором нужно изменить строчки:
ngctl msg switch:link1 bind inet/1.1.1.2:1234 ngctl msg switch:link1 connect inet/1.1.1.1:1234
Просто поменять местами адреса.Для красоты оформляем запуск нашего виртуалсвитча в скрипт и при желании кладем в /usr/local/etc/rc.d
#!/bin/sh #тут указываем наш белый адрес self=1.1.1.1 peer=1.1.1.2 #тут порт по которому будет бегать трафик port=1234 #интерфейс который включаем в свитч if=fxp1 case "$1" in start) echo "Starting netgraph switch." ngctl mkpeer ${if}: bridge lower link0 ngctl name ${if}:lower switch ngctl mkpeer switch: ksocket link1 inet/dgram/udp ngctl msg switch:link1 bind inet/${self}:${port} ngctl msg switch:link1 connect inet/${peer}:${port} ngctl connect switch: ${if}: link2 upper ngctl msg ${if}: setpromisc 1 ngctl msg ${if}: setautosrc 0 echo "Ok." exit 0 ;; stop) echo "Stopping netgraph switch." /usr/sbin/ngctl shutdown ${if}: /usr/sbin/ngctl shutdown switch: echo "Ok." exit 0 ;; restart) sh $0 stop sh $0 start ;; *) echo "Usage: `basename $0` { start | stop | restart }" exit 64 ;; esac
Красота какая, никаких впн крутить не надо, просто запустить скрипт :), никаких реконектов и т.п...Возможно попробую в ближайшее время привернуть возможность фильтрования трафика через ipfw и шифрование если это возможно :)