Как то меня попросили соединить два удаленных офиса в единую сеть.

Один офис находился в одном городе, а другой в другом. Причем задача стояла, что бы получать все мак адреса и все что происходит в одном офисе, было и в другом. Диапазон IP-адресов должен был быть тоже один. Может это и не совсем правильно с точки администрирования, но задачу нужно было как то решить.

Первым делом задумались, о том, что бы взять vlan транзит с одного города в другой, но потом как узнали стоимость данного решения, начали копать дальше. И вдруг я вспомнил про такую мощную штуку, как netgraph, на которой я и решил это задание реализовать.

Что мы имеем?
Офис «A» — FreeBSD сервер на котором установлено 2 сетевых карточки и туннель tun0 с реальным статическим IP-адресом. Интерфейс re0 смотрит в adsl calisto 821+, а re1 в свич с локалкой офиса «A». Для примера:
интерфейс tun0 = 111.111.111.111
интерфейс re1 = 10.10.1.1

Офис «B» — FreeBSD сервер на котором установлено 2 сетевых карточки, одна из которых (ed0) смотрит в сеть в провайдеру шлюзом и имеет реальный статический IP-адрес, а вторая vr0 в свич с локалкой офиса «B». Для примера:
интерфейс ed0 = 222.222.222.222
интерфейс vr0 = 10.10.1.2

На обоих серверах установлена FreeBSD 8.0-RELEASE-p2.
К счастью в ядре обоих серверов уже вкомпилен netgraph, поэтому осталось только настроить.

Если у вас нет в ядре netgraph, то можно либо перекомпилить ядро, либо добавить загрузку его модулем в /boot/loader.conf:

echo 'netgraph_load="YES"' >> /boot/loader.conf
echo 'ng_ether_load="YES"' >> /boot/loader.conf
echo 'ng_bridge_load="YES"' >> /boot/loader.conf

Проверим, есть ли netgraph в ядре:

# ngctl list
There are 3 total nodes:

Name: ngctl94850 Type: socket ID: 00001266 Num hooks: 0

Name: <unnamed> Type: socket ID: 00001265 Num hooks: 1

Name: <unnamed> Type: pppoe ID: 0000000f Num hooks: 2

Name: rl0 Type: ether ID: 00000002 Num hooks: 0

Name: rl1 Type: ether ID: 00000001 Num hooks: 1

Создаем скрипт для офиса «A», который и будет поднимать наш свич:


# cat /usr/local/etc/scripts/ng_switch.sh
............
#!/bin/sh
#####ng_switch
#здесь указываем реальные IP-адреса офисов:
#office "A"
self=111.111.111.11
#office "B"
peer=222.222.222.222
#порт на котором будет весь этот трафик
port=1453
#интерфейс который включен в свитч офиса "A"
if=re1
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 "Done.."
exit 0
;;
stop)
echo "Stopping netgraph switch.."
/usr/sbin/ngctl shutdown ${if}:
/usr/sbin/ngctl shutdown switch:
echo "Done.."
exit 0
;;
restart)
sh $0 stop
sh $0 start
;;
*)
echo "Usage: `basename $0` { start | stop | restart }"
exit 64
;;
esac

Для офиса «B» копируем этот скрипт на второй роутер и меняем значения:

#office "B"
self=222.222.222.222
#office "A"
peer=111.111.111.11
#интерфейс который включен в свитч офиса "B"
if=vr0

Теперь даём права на исполнение на обоих роутерах этим файлам и запускаем их:

# chmod +x /usr/local/etc/scripts/ng_switch.sh
# sh /usr/local/etc/scripts/ng_switch.sh

Не забываем на роутерах открыть порт 1453 в ipfw.

PS. И ещё один дельный совет!!

Я всегда стараюсь сделать скрипт автозапуска некоторых служб по очереди, особенно если идёт разговор об интернете через ppp, в котором всегда разный шлюз. И после этого допустим нужно перенастроить маршруты, а после чего например запустить службу времени и т.д. В этом случае актуально использовать один файл автозапуска в /usr/local/etc/rc.d/, в котором по очереди через «sleep *» прописан список, того что запускать и в какой очерёдности.. Это актуально для автоматизации нашего ng_switch..

Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:

http://noted.org.ua/816


Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)

Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455

На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел

Add your comment now

Please note: JavaScript is required to post comments.