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

Один офис находился в одном городе, а другой в другом. Причем задача стояла, что бы получать все мак адреса и все что происходит в одном офисе, было и в другом. Диапазон 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/?p=816


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

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

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

Add your comment now

You must be logged in to post a comment.