Главное меню
RSS трансляции
Наши новости могут транслироваться, используя rss.
rss1.0
rss2.0
rdf
FAQ
 FAQ #83
Back to Categories    Print this FAQ  Send a link to this FAQ to a friend pdf
Ethernet мост через интернет на FreeBSD на основе netgraph
Необходимо соединить две физических сети Ethernet через интернет.
Имеем 2 сервера.

BSD1
2 сетевых интерфейса
Интерфейс 1 em0 — внешний IP 1.1.1.1
Интерфейс 2 em1 — внутренний IP 192.168.1.1

BSD2
2 сетевых интерфейса
Интерфейс 1 em0 — внешний IP 2.2.2.2
Интерфейс 2 em1 — внутренний IP 192.168.1.2

Между серверами имеется маршрутизируемая интернет связь через внешние интерфейсы.
Соединить нужно сети на интерфейсах em1 обоих серверов.

Как будет выглядеть граф в живую для сервера «bsd1». Для тоннеля будем использовать udp порт 7777

Создаем узел ng_bridge и подключаем к его хуку «link0» хук сетевого интерфейса «em1» «lower».

ngctl mkpeer em1: bridge lower link0

Называем только что созданный узел именем «switch», его можно найти по пути «em1:lower».

ngctl name em1:lower switch

Подключаем к «link1» нашего «switch» upper сетевого интерфейса «em1».

ngctl connect switch: em1: link1 upper

Создаем узел ng_ksocket и подключаем к его хуку «inet/dgram/udp» «link2» нашего «switch»

ngctl mkpeer switch: ksocket link2 inet/dgram/udp

Называем только что созданный ksocket «switch_socket», его можно найти по пути «switch:link2»

ngctl name switch:link2 switch_socket

Отправляем команду «bind» нашему «switch_socket», с параметрами. ksocket займет порт 7777 на IP 1.1.1.1.

ngctl msg switch_socket: bind inet/1.1.1.1:7777

Отправляем команду «connect» нашему «switch_socket», с параметрами. ksocket подключится к порту 7777 по IP адресу 2.2.2.2.

ngctl msg switch_socket: connect inet/2.2.2.2:7777

Отправляем команду модулю ng_ether сетевого интерфейса em1 перейти в режим прослушки пакетов, адресованных не ему. Нам ведь теперь необходимо принимать пакеты для устройств находящихся в нашей виртуальной сети.

ngctl msg em1: setpromisc 1
ngctl msg em1: setautosrc 0

Для сервера «bsd2» нам лишь нужно поменять параметры команд bind и connect местами.

Для простоты использования всё это я оформил в sh скрипт.
В скрипте используется ещё одна команда ngctl shutdown. Эта команда посылает специальное контрольное сообщение модулю, указанному в параметре. Это сообщение принимает каждый модуль, подробнее в «man модуль». Обычно эта команда вызывает уничтожение модуля и разрыв всех его связей.

#!/bin/sh
self=1.1.1.1
peer=2.2.2.2
port=7777
if=em1

case "$1" in
start)
echo "Starting netgraph switch."
ngctl mkpeer $: bridge lower link0
ngctl name $:lower switch
ngctl connect switch: $: link1 upper
ngctl mkpeer switch: ksocket link2 inet/dgram/udp
ngctl name switch:link2 switch_socket
ngctl msg switch_socket: bind inet/$:$
ngctl msg switch_socket: connect inet/$:$
ngctl msg $: setpromisc 1
ngctl msg $: setautosrc 0
echo "Ok."
exit 0
;;
stop)
echo "Stopping netgraph switch."
ngctl shutdown switch_socket:
ngctl shutdown switch:
ngctl shutdown $:
echo "Ok."
exit 0
;;
restart)
sh $0 stop
sh $0 start
;;
*)
echo "Usage: `basename $0` { start | stop | restart }"
exit 64
;;
esac


Посмотрим что получилось
[root@bsd1] /usr/local/etc/rc.d/> ngctl list
There are 5 total nodes:
Name: em0 Type: ether ID: 00000001 Num hooks: 0
Name: em1 Type: ether ID: 00000002 Num hooks: 2
Name: switch Type: bridge ID: 000000f6 Num hooks: 3
Name: ngctl16408 Type: socket ID: 00000100 Num hooks: 0
Name: switch_socket Type: ksocket ID: 000000fa Num hooks: 1

Взято отсюда: https://habr.com/post/86553/
Views 885 (Unique 512)
Member Rating : Not yet rated  
FAQ Posted by vampyr
Info Created: Saturday 17 November 2018 - 01:07:44
Last Updated: Saturday 17 November 2018 - 01:07:44
 
РадиоЭлектроника
Поиск Vampyr`s House!
Copyright © 1999-2014, Igor Muraviov. Все авторские права принадлежат их владельцам ( в случае указания) или владельцу сайта, если автор не указан.
Копирование материалов с сайта возможно только в случае размещения ссылки на первоисточник.
Protected by Copyscape DMCA Plagiarism Check