Как то меня попросили соединить два удаленных офиса в единую сеть.
Один офис находился в одном городе, а другой в другом. Причем задача стояла, что бы получать все мак адреса и все что происходит в одном офисе, было и в другом. Диапазон 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..
Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:
Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)
Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455
На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел