Готовое решение для обьединения трех отдельных локалок с разными провайдерами в единую сеть.
Эта задачка достаточно просто решается с помощью NEТGRAPH
Исходные данные:
1. есть три офиса в каждом из офисов локалка 192.168.210.0/24
2. каждая локалка ходит в интернет через nat+ipfw FreeBSD 4.3
3. в каждом из офисов свой провайдер.
Задача:
1. сделать, чтобы все клиенты локалок могли пользоваться сетевыми дисками и принтерами независимо от того в каком из офисов они находятся.
Решение:
1. вкрутил в каждый из шлюзовых компов по еще одной сетевухе (кроме двух уже имеющихся)
fxp0 - подключена к провайдеру
rl0 - gateway для локальных компов
rl1 - без адреса подключена к свичу офисной локалки.
2. Перекомпилил кернел с опциями
options NETGRAPH
options NETGRAPH_SOCKET
options NETGRAPH_ECHO
3. Настроил NETGRAPH в главном офисе (будет выполнять функции сервера ethernet тунелей поверх UDP) запускающий скриптик:
#!/bin/sh
#Загружаю драйвера узлов моста и сетевухи
/sbin/kldload ng_ether
/sbin/kldload ng_bridge
# создаю узел типа ng_bridge и подключаю хук link0 к хуку lower сетевухи
# (lower - физ уровень передачи данных)
/usr/sbin/ngctl mkpeer rl1: bridge lower link0
# обзываю созданный узел multi_link
/usr/sbin/ngctl name rl1:lower multi_link
# создаю узел тип:ksocket, транспорт:UDP и цепляю его хук на link1 моста
/usr/sbin/ngctl mkpeer multi_link: ksocket link1 inet/dgram/udp
# обзываю созданный узел lnk1
/usr/sbin/ngctl name multi_link:link1 lnk1
# создаю сокет на IP выданном провайдером
/usr/sbin/ngctl msg lnk1: bind inet/81.111.111.31:2515
# соединяюсь с сокетом (созданным ниже) во втором офисе
/usr/sbin/ngctl msg lnk1: connect inet/194.186.121.99:2515
# создаю узел тип:ksocket, транспорт:UDP и цепляю его хук на link2 моста
/usr/sbin/ngctl mkpeer multi_link: ksocket link2 inet/dgram/udp
# обзываю созданный узел lnk2
/usr/sbin/ngctl name multi_link:link2 lnk2
# создаю сокет на IP выданном провайдером но уже с другим портом
/usr/sbin/ngctl msg lnk2: bind inet/81.111.111.31:2516
# соединяюсь с сокетом (созданным ниже) во втором офисе
/usr/sbin/ngctl msg lnk2: connect inet/61.16.121.100:2516
# Поднимаю интефейс
ifconfig rl1 up
# Ввожу интерфейс в promission mode
/usr/sbin/ngctl msg rl1: setpromisc 1
# отключаю перезапись src адреса в заголовке пакета при прохождении интерфейса
/usr/sbin/ngctl msg rl1: setautosrc 0
4. Настраиваю NETGRAPH во втором и третьем офисе здесь запускающие скрипты будут анологичны
#!/bin/sh
# загрузка драйвера ng_ether
kldload ng_ether
# создаю узел тип:ksocket hook:сеть физ уровень транспорт:UDP
ngctl mkpeer rl1: ksocket lower inet/dgram/udp
# создаю сокет на внешнем IP
ngctl msg rl1:lower bind inet/194.186.121.99:2515
# подключаюсь к сокету на сервере (см п.3)
ngctl msg rl1:lower connect inet/81.111.111.31:2515
# Поднимаем интерфейс без ip
ifconfig rl1 up
# Ввожу интерфейс в promission mode
ngctl msg rl1: setpromisc 1
# отключаю перезапись src адреса в заголовке пакета при прохождении интерфейса
ngctl msg rl1: setautosrc 0
в третем офисе все аналогично:
#!/bin/sh
# загрузка драйвера ng_ether
kldload ng_ether
# создаю узел тип:ksocket hook:сеть физ уровень транспорт:UDP
ngctl mkpeer rl1: ksocket lower inet/dgram/udp
# создаю сокет на внешнем IP
ngctl msg rl1:lower bind inet/61.16.121.100:2516
# подключаюсь ко второму сокету на сервере (см п.3)
ngctl msg rl1:lower connect inet/81.111.111.31:2516
# Поднимаем интерфейс без ip
ifconfig rl1 up
# Ввожу интерфейс в promission mode
ngctl msg rl1: setpromisc 1
# отключаю перезапись src адреса в заголовке пакета при прохождении интерфейса
ngctl msg rl1: setautosrc 0
5. полученные скрипты размещаем в /usr/local/etc/rc.d и наслаждаемся
Пара замечаний:
1. само собой в каждой из локалок не должно быть повторяющихся ip адресов
2. все это имеет смысл только при скоростном, синхронном, безлимитном интернете.
Особая благодарность
http://forum.bestcom.ru/index.php?showforum=7 за помощь в настройке...