Frequently Asked Questions

Question
Ethernet мост через интернет на FreeBSD на основе netgraph

Answer
Необходимо соединить две физических сети 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 ${if}: bridge lower link0
ngctl name ${if}:lower switch
ngctl connect switch: ${if}: link1 upper
ngctl mkpeer switch: ksocket link2 inet/dgram/udp
ngctl name switch:link2 switch_socket
ngctl msg switch_socket: bind inet/${self}:${port}
ngctl msg switch_socket: connect inet/${peer}:${port}
ngctl msg ${if}: setpromisc 1
ngctl msg ${if}: setautosrc 0
echo "Ok."
exit 0
;;
stop)
echo "Stopping netgraph switch."
ngctl shutdown switch_socket:
ngctl shutdown switch:
ngctl shutdown ${if}:
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/


Details
Info Saturday 17 November 2018 - 01:07:44 by vampyr




Vampyr`s House!


Protected by Copyscape DMCA Plagiarism Check