Проброс ethernet через интернет по udp или виртуальный свитч на FreeBSD


Соединяем две ethernet сетки чтобы они видели друг друга как будто находятся в одному коммутаторе.

Делать будем на основе ядерного netgraph, в частности модули ng_ether и ng_bridge.

Добавляем в /boot/loader.conf

Код

netgraph_load="YES"

ng_ether_load="YES"

ng_bridge_load="YES"


Есть 2 варианта работы системы


1. Без модуля ng_bridge.

Мы получим как бы объединение сетевых интерфейсов в один невидимый.

Сами сервера с этими интерфейсами не будут видеть трафик на них.

Получается прозрачное соединение как будто между сетями протянули физический кабель.

Весь трафик приходящий на интерфейс одного из серверов будет прозрачно проходить на другой.

2. С модулем ng_bridge.

Мы получим как бы включение интерфейсов на обоих серверах в один свитч.

Сервера будут видеть трафик на интерфейсах.

Трафик не предназначеный для соседней

сети не пойдет по каналу (реализация обычного свитча).


Конфигурация:

Имеем два типичных роутера.


1.Два сетевых интерфейса

fxp0 - белый интернет адрес для примера 1.1.1.1

fxp1 - серый локальный адрес 192.168.0.1

2.Два сетевых интерфейса

fxp0 - белый интернет адрес для примера 1.1.1.2

fxp1 - серый локальный адрес 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

Обновлено: 12.03.2015