FreeBSD+mpd+ospfd объединение оффисов

Обсуждаем сайт и форум.

Модератор: f0s

Аватара пользователя
sudosu
мл. сержант
Сообщения: 81
Зарегистрирован: 2008-05-27 12:17:32
Откуда: Что такое петровско-разумовская?

FreeBSD+mpd+ospfd объединение оффисов

Непрочитанное сообщение sudosu » 2009-01-19 5:04:03

Сеть на много офисов , объедененных по pptp, с динамической маршрутизацией. Когда количество офисов делает статическую маршрутизацию сложной задачей.
Такая статья нужна?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: FreeBSD+mpd+ospfd объединение оффисов

Непрочитанное сообщение paradox » 2009-01-19 6:39:36

конечно же надо

Аватара пользователя
sudosu
мл. сержант
Сообщения: 81
Зарегистрирован: 2008-05-27 12:17:32
Откуда: Что такое петровско-разумовская?

Re: FreeBSD+mpd+ospfd объединение оффисов

Непрочитанное сообщение sudosu » 2009-01-19 17:54:33

Есть два оффиса с быстрыми и стабильными каналами в интернет и несколько филиалов подключеные где по радио, где по dsl, где с честным IP, где без него. Встала задача собрать этот зоопарк в одну большую сеть с резервированием и динамической маршрутизацией, дабы не переписывать маршруты пачками при пропадании vpn-ных линков. Поехали...

Тоннель между кошками
У меня в быстрых оффисах стоят две 28-е кошки, канал м/ду оффисами 10 метров, ISP разные (даже города разные), поэтому поднимем м/ду ними gre. Шифровать траффик я не буду, не очень секьюрно, но мне потом не хочется решать грабли с MTU.

кошка в оффисе №1:

Код: Выделить всё

C2800-SPB-SRV#sh run int fa0/1.17
Building configuration...

Current configuration : 316 bytes
!
interface FastEthernet0/1.17
 description "S-Pb Internet"
 encapsulation dot1Q 17
 ip address XXX.YYY.224.105 255.255.255.248
 ip access-group Common_IN in
 no ip redirects
 no ip unreachables
 no ip proxy-arp
 ip virtual-reassembly
 duplex auto
 speed auto
 arp timeout 200
end

C2800-SPB-SRV#sh run int tun0
Building configuration...

Current configuration : 235 bytes
!
interface Tunnel0
 description "GRE tunnel to C2800-MSK-RUM on AAA.BBB.250.77"
 ip address 10.255.255.1 255.255.255.252
 ip tcp adjust-mss 1436
 keepalive 5 255
 tunnel source FastEthernet0/1.17
 tunnel destination AAA.BBB.250.77
end

C2800-SPB-SRV#
Кошка в оффисе №2:

Код: Выделить всё

C2800-MSK-RUM#sh run int Fa0/0   
Building configuration...

Current configuration : 259 bytes
!
interface FastEthernet0/0
 description "Internet Msk"
 ip address AAA.BBB.250.77 255.255.255.0
 ip access-group VoIP_Common_IN in
 no ip redirects
 no ip unreachables
 no ip proxy-arp
 ip virtual-reassembly
 duplex auto
 speed auto
 arp timeout 200
end

C2800-MSK-RUM#sh run int tun0
Building configuration...

Current configuration : 236 bytes
!
interface Tunnel0
 description "GRE tunnel to C2800-SPB-SRV on XXX.YYY.224.105"
 ip address 10.255.255.2 255.255.255.252
 ip tcp adjust-mss 1436
 keepalive 5 255
 tunnel source FastEthernet0/0
 tunnel destination XXX.YYY.224.105
end

C2800-MSK-RUM#
Тут мы создали м/ду кошками тоннель, с сеткой 10.255.255.0/30
Если с кипаливами и прочими аджаст-мсс-ми не все понятно, добавлю, а так, вроде, все само за себя говорит.
В аксесс-листах кошки закрываются от всякой нечисти, следует не забыть там разрешить порт 1723 если тоже будете делать на кошках.
Проверить состояние линка можно, например, так:

Код: Выделить всё

C2800-MSK-RUM#sh interfaces tun0 summary 

 *: interface is up
 IHQ: pkts in input hold queue     IQD: pkts dropped from input queue
 OHQ: pkts in output hold queue    OQD: pkts dropped from output queue
 RXBS: rx rate (bits/sec)          RXPS: rx rate (pkts/sec)
 TXBS: tx rate (bits/sec)          TXPS: tx rate (pkts/sec)
 TRTL: throttle count

  Interface              IHQ   IQD  OHQ   OQD  RXBS RXPS  TXBS TXPS TRTL
------------------------------------------------------------------------
* Tunnel0                  0     0    0   168     0    0     0    0    0
C2800-MSK-RUM#
Если не взлетает, кошка умеет очень хорошие дебаги.
Почему тут выбраны кошки а не фряхи? Да просто не хотелось вот так вот взять и откусить у фрях столько процессорного времени, 10 метров всеже. А так можно и с фрях методами которые будут описаны далее.

Теперь заведем меж-ду ними OSPF.
Вкратце о последнем. Open Shortest Path First - линк стейт протокол. Регулярно флудит в сеть мультикастные хелло. Смотрит ответы на них и таким образом находит соседей. Соседи рассказывают друг-другу о имеющейся маршрутной информации и на основании совокупных данных строят граф сети в виде некой базы данных, где сами они узлы этого графа. При изменении локальной маршрутной информации роутер поднимает у БД id и отправляет ее соседу, если у соседа id меньше - он учитывает в своей БД изменения. БД одинаковая, но хранится у каждого. Примерно так это работает. Есть много ньюансов, но это уже другая история. Выбран OSPF а не ISIS потому что он ip-шный протокол и не добавляет в пакет своих заголовков => не придирчив к MTU, а именно это нам и надо в vpn-ных линках.

На этом теоретический отступ закончен, поехали:

кошка в оффисе №1:

Код: Выделить всё

C2800-SPB-SRV#sh run | be ospf
router ospf 100
 router-id 10.255.255.1
      # уникальный id роутера в сети, по которому его узнают соседи и не очень соседи
 log-adjacency-changes 
      # логируем изменения состояний соседей, не обязательно, но проще траблшутить
 redistribute connected subnets route-map connected-to-ospf 
      # отдаем в ospf присоединенные сети на основании правил connected-to-ospf
      # потому что маршруты на все присоединенные сети рассылать не хотим
 passive-interface default 
      # по-умолчанию интерфейсы не рассылают в свои сети LSA (базу маршрутов)
 no passive-interface FastEthernet0/1.10 
      # А вот этот рассылает, смотрит в сетку с фряхами
 no passive-interface Tunnel0 
      # и этот рассылает Смотрит на вторую кошку через vpn
 network 10.255.255.0 0.0.0.3 area 0 
      # Мне сложной архитектуры сети не надо, поэтому все в нулевой арии
 network 192.168.4.0 0.0.0.255 area 0
!
...........................
route-map connected-to-ospf permit 10
 match ip address prefix-list connected-to-ospf # смотрим правила в префикс листе connected-to-ospf
!
...........................
ip prefix-list connected-to-ospf seq 10 permit 192.168.4.0/24 # рассылаем маршруты в эту сеть (усера)
ip prefix-list connected-to-ospf seq 20 permit 10.255.255.0/30 # рассылаем маршруты в сеть туннеля
ip prefix-list connected-to-ospf seq 30000 deny 0.0.0.0/0 le 32 # все остальное не рассылаем
Кошка в оффисе №2:

Код: Выделить всё

router ospf 100
 router-id 10.255.255.2
 log-adjacency-changes
 redistribute connected subnets route-map connected-to-ospf
 passive-interface default
 no passive-interface FastEthernet0/1.10
 no passive-interface Tunnel0
 network 10.255.255.0 0.0.0.3 area 0
 network 192.168.5.0 0.0.0.255 area 0
!
route-map connected-to-ospf permit 10
 match ip address prefix-list connected-to-ospf
!
ip prefix-list connected-to-ospf seq 10 permit 192.168.5.0/24
ip prefix-list connected-to-ospf seq 20 permit 10.255.255.0/30
ip prefix-list connected-to-ospf seq 30000 deny 0.0.0.0/0 le 32
Можно посмотреть теперь их соседей:

Код: Выделить всё

C2800-MSK-RUM#sh ip ospf neighbor 

Neighbor ID     Pri   State           Dead Time   Address         Interface
10.255.255.1      0   FULL/  -        00:00:36    10.255.255.1    Tunnel0
C2800-MSK-RUM#
В соседях будут видны только оспф роутеры присоединенных сетей, так что не удивляйтесь неотыскав там роутера, стоящего чуть подальше. Смотреть можно еще саму БД, маршруты и многое-многое другое, разумеется можно можно дебажить.
На этом с кошками покончено.

Приступим к фряхам. По моей задумке каждый филиал поднимает pptp-шный линк на фряху в оффис №1 и оффис №2. В случае падения одного из двух линков маршрут просто сделает лишних 750 верст, но для бешенного пакета это не крюк ;)
Поскольку фряхи в оффисах совсем одинаковые, и линки клиенты к ним поднимают тоже совсем одинаковые, потому покажу как сделать одну серверную фрю и одного клиента, этого будет вполне достаточно.

В качестве серверного vpn буду использовать net/mpd5, в качестве клиентского как ни странно тоже ;)

В ядре нам ничего экзотического не пригодится. Если конечно не собирать его без модулей. В противном случае все нужное фря подгрузит сама в виде модулей, которые после установки и запуска mpd можно посмотреть:

Код: Выделить всё

[root@pc1 /usr/home/sudosu]# kldstat 
Id Refs Address            Size     Name
 1   14 0xffffffff80100000 b168d8   kernel
 2    1 0xffffffff9389f000 972      pflog.ko
 3    1 0xffffffff93a26000 19ba     ng_socket.ko
 4    9 0xffffffff93a28000 8734     netgraph.ko
 5    1 0xffffffff93a31000 182b     ng_mppc.ko
 6    1 0xffffffff93a33000 22c      rc4.ko
 7    1 0xffffffff93a39000 a7e      ng_tee.ko
 8    1 0xffffffff93a3a000 18e2     ng_pptpgre.ko
 9    1 0xffffffff93a3c000 1fea     ng_ksocket.ko
10    1 0xffffffff93a43000 13a6     ng_iface.ko
11    1 0xffffffff93a45000 433e     ng_ppp.ko
12    1 0xffffffff93a3e000 1ea4     ng_vjc.ko
13    1 0xffffffff93a40000 9e2      ng_tcpmss.ko
[root@pc1 /usr/home/sudosu]#
И при огромном желании собрать всю эту кухню статически. У меня такого желания не возникло.

Собираем mpd5 на клиенте и сервере процесс ничем не отличается

Код: Выделить всё

[root@pc1 /]#  portinstall net/mpd5
В конфигурации порта я ничего не отмечал.

Конфигурируем и запускаем mpd5 на сервере
Не забываем пробелы в началах строк. А вообще сэмпловый конфиг mpd5 на столько хорош и коментирован,
что полностью заменяет несуществующий ман и отсутствие вменяемой документации на сайте разработчика.

Код: Выделить всё

[root@pc1 /usr/home/sudosu]# cat /usr/local/etc/mpd5/mpd.conf
startup:
 set user administrator <passwd_of_admin> admin 
      # Логин, пассвд, права доступа на консоль
 set console self 127.0.0.1 5005
      # Консоль будет на локалхосте на 5005-м порту, можно ходить
      # на нее телнетом в целях дебага и изменения праметров демона на лету
 set console open
      # Запускаем консоль
 set web self 192.168.5.110 5006
      # вебморда будет на ИП 192.168.5.110 на порту 5006
 set web open 
      # запускаем консоль

default:
 load pptp_server
      # Грузим профиль

pptp_server:
 set ippool add pool1 10.255.101.50 10.255.101.60
      # Назначаем пул из которого выделяем адреса клиентам
 create bundle template B
 set iface disable proxy-arp
      # прокси-арп нам нафиг не нужен, мы же динамическую маршрутизацию настраиваем ;)
 set iface idle 1800
 set iface enable tcpmssfix
 set ipcp yes vjcomp
 set ipcp ranges 10.255.101.1/32 ippool pool1
      # Свой адрес для pptp подключений
 set bundle enable compression
 set ccp yes mppc
 set mppc yes e40
 set mppc yes e128
 set mppc yes stateless
 create link template PPtP pptp
 set link action bundle B
 set link enable multilink
      # разрешаем множественные подключения
 set link yes acfcomp protocomp
 set link no pap chap
 set link enable chap
 set link keep-alive 10 60
 set link mtu 1430
 set pptp self AAA.BBB.248.146
 set link enable incoming
[root@pc1 /usr/home/sudosu]#
      # Ну, вобщем все очевидно =)

[root@pc1 /]# cat /usr/local/etc/mpd5/mpd.secret
......................
<user> <pass> 10.255.101.53 
# IP можно не указывать, но если заранее известно откуда маршруты прилетят
# легче траблшутить
[root@pc1 /]#

[root@pc1 /]# echo 'mpd_enable="YES"' >> /etc/rc.conf
[root@pc1 /]# echo 'mpd_flags="-b"'  >> /etc/rc.conf
[root@pc1 /]# /usr/local/etc/rc.d/mpd5 start
[root@pc1 /]# netstat -na | grep 1723
tcp4       0      0  AAA.BBB.146.1723    *.*                    LISTEN
[root@pc1 /]#
[root@pc1 /]# ps ax | grep mpd
13429  ??  Is     0:03,69 /usr/local/sbin/mpd5 -p /var/run/mpd5.pid -b
37090  p0  S+     0:00,00 grep mpd
[root@pc1 ]#
Конфигурируем и запускаем mpd5 на клиенте

Код: Выделить всё

[root@f1 /]# cat /usr/local/etc/mpd5/mpd.conf
startup:
	set user fil1 <passswd> admin
	set console self 127.0.0.1 5005
	set console open
	set web self 192.168.0.1 5006
	set web open

default:
	load wplus
	load t-spb
	load t msk
      # Грузим три профиля

common:
	set link enable multilink
#	set link action bundle B

wplus:
      # Профиль подключения к провайдеру
	create bundle static B1
	set iface route default
      # Тут будет дефолт
	set ipcp ranges 0.0.0.0/0 0.0.0.0/0
	create link static L1 pppoe
      # Линк поднимаем pppoe-шный
	set link action bundle B1
	set auth authname <authname>
	set auth password <path>
	set link max-redial 0
       # Если разваливается - перед\подключаемся бесконечно
	set link mtu 1492
       # no comments
	set link keep-alive 10 60
	set pppoe iface vr0
      # С какого интерфейса поднимаем pppoe
	set pppoe service "wplus"
	open

t-spb: # первый оффис
	create bundle static B2
	set ipcp ranges 0.0.0.0/0 0.0.0.0/0
	create link static L2 pptp
	set link action bundle B2
	set auth authname <user>
	set auth password <pass>
	set link max-redial 0
	set link mtu 1430
	set link keep-alive 20 75
	set pptp peer XXX.YYY.224.107
      # на какой хост подключаемся
	open

t-msk: # второй оффис
        create bundle static B3
        set ipcp ranges 0.0.0.0/0 0.0.0.0/0
        create link static L3 pptp
        set link action bundle B3
        set auth authname <user>
        set auth password <pass>
        set link max-redial 0
        set link mtu 1430
        set link keep-alive 20 75
        set pptp peer AAA.BBB.248.146
        open
[root@f1 /]#


[root@f1 /]# echo 'mpd_enable="YES"' >> /etc/rc.conf
[root@f1 /]# echo 'mpd_flags="-b"'  >> /etc/rc.conf
[root@f1 /]# /usr/local/etc/rc.d/mpd5 start
[root@f1 /]# netstat -na | grep 1723
tcp4       0      0  AAA.BBB.146.1723    *.*                    LISTEN
[root@f1 /]#
[root@f1 /]# ps ax | grep mpd
8479  ??  Is     0:03,69 /usr/local/sbin/mpd5 -p /var/run/mpd5.pid -b
[root@pc1 ]#
Очень подробно тут не коментарил, т.к. статей на лиссяре про mpd уже более чем достаточно.
смотрим ptp интерфейсе на сервере:

Код: Выделить всё

[root@pc1 /]# ifconfig ng0
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1430
	inet 10.255.101.1 --> 10.255.101.53 netmask 0xffffffff 
[root@pc1 /]#
На клиенте:

Код: Выделить всё

[root@f1 /]# ifconfig ng2
ng2: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1430
	inet 10.255.101.53 --> 10.255.101.1 netmask 0xffffffff 
[root@f1 /]#
Не забываем разрешать траффик на этих интерфейсах и протокол gre на интерфейсах, с которых работает pptp
На этом с vpn все, перейдем к quagga - софтверный маршрутизатор под юникс-лайк. Он очень похож конфигурацией на кошек.

Собираем и запускаем quagga на обеих машинах

Код: Выделить всё

[root@pc1 /]# portinstall net/quagga
В конфигурации порта ничего не указывал.

Перед запуском кваги прийдется скопировать дефолтные конфиги в нужное место, разработчики порта об этом не позаботились:

Код: Выделить всё

[root@pc1 /]# cp /usr/local/share/examples/quagga/zebra.conf.sample /usr/local/etc/quagga/zebra.conf
[root@pc1 /]# cp /usr/local/share/examples/quagga/ospfd.conf.sample /usr/local/etc/quagga/ospfd.conf
Запускаем, помним, чтоб ядро использовало квагины маршруты - нужно вынести существующий routed:

Код: Выделить всё

[root@pc1 /]# egrep "qua|route" /etc/rc.conf
defaultrouter="NO"
router_enable="NO"
quagga_enable="YES"
quagga_daemons="zebra ospfd"
[root@pc1 /]# pkill -9 routed && /usr/local/etc/rc.d/quagga start
В это время лучше находится рядом с сервером, либо иметь доступ в его присоединенную сеть ;)

После этого идем в зебру, добавим маршруты, которые нужны будут статикой, интерфейсы конфигурить не нужно:

Код: Выделить всё

[root@pc1 /usr/home/sudosu]# telnet localhost zebra
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 0.99.11).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification

Password: 
zebra.pc1.tech> en
Password: 
zebra.pc1.tech# sh run
.............
!
ip route 0.0.0.0/0 89.249.248.145
ip route 172.17.100.0/24 172.17.101.1
!
zebra.pc1.tech# wr
zebra.pc1.tech# exit
Идем в ospfdт тут все почти как на циске обращу внимание, что в networks нужно прописать адрес ptp пира, а не свой и с ptp-х интерфейсов убрать ip ospf network broadkast:

Код: Выделить всё

[root@pc1 /]# telnet localhost ospfd
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Hello, this is Quagga (version 0.99.11).
Copyright 1996-2005 Kunihiro Ishiguro, et al.


User Access Verification


Password: 
ospfd.pc1.tech> en
ospfd.pc1.tech# sh run

Current configuration:
!
hostname ospfd.pc1.tech
password zebra
log stdout
!
!
!
interface lo0
!
interface ng0
 !
interface ng1
!
interface pflog0
!
interface re0
!
interface vlan3
!
interface vlan10
!
interface vlan11
!
interface vlan17
!
router ospf
 ospf router-id 192.168.5.110
 redistribute connected route-map connected-to-ospf
 passive-interface default
 no passive-interface ng0
 no passive-interface vlan10
 network 10.255.100.0/24 area 0.0.0.0
 network 10.255.101.53/32 area 0.0.0.0
 network 192.168.5.0/24 area 0.0.0.0
!
ip prefix-list connected-to-ospf seq 10 permit 192.168.5.0/24
ip prefix-list connected-to-ospf seq 20 permit 10.255.101.0/24 le 32
ip prefix-list connected-to-ospf seq 30000 deny 0.0.0.0/0 le 32
!
route-map connected-to-ospf permit 10
 match ip address prefix-list connected-to-ospf
!
line vty
!
end
ospfd.pc1.tech#
Ну и смотрим базу, поскольку она у всех одинаковая, достаточно на одной машине ospfd:

Код: Выделить всё

ospfd.pc1.tech# sh ip ospf database 

       OSPF Router with ID (192.168.5.110)

                Router Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum  Link count
10.255.255.1    10.255.255.1     246 0x800003f4 0x90eb 3
10.255.255.2    10.255.255.2     827 0x800003cd 0x227b 3
172.17.201.10   172.17.201.10   3600 0x8000000c 0xe679 1
192.168.0.1     192.168.0.1     1181 0x8000002e 0x0ba6 3
192.168.4.21    192.168.4.21     462 0x8000000f 0x8c45 2
192.168.4.122   192.168.4.122    472 0x8000009b 0x6c68 1
192.168.5.110   192.168.5.110     24 0x80000d0e 0x2ddb 3

                Net Link States (Area 0.0.0.0)

Link ID         ADV Router      Age  Seq#       CkSum
172.17.201.10   172.17.201.10   3600 0x80000004 0xdcb9
192.168.4.181   10.255.255.1     246 0x80000097 0xb546
192.168.5.110   192.168.5.110     24 0x8000015a 0x5ffd

                AS External Link States

Link ID         ADV Router      Age  Seq#       CkSum  Route
192.168.0.0     192.168.0.1     1111 0x80000022 0xa524 E2 192.168.0.0/24 [0x0]
192.168.254.0   192.168.0.1     1051 0x80000022 0xb01a E2 192.168.254.0/24 [0x0]


ospfd.pc1.tech#
Все друг-друга увидели, все хорошо. Можно настроить на остальных филиалах можно поронять линки, посмотреть как быстро сходится новый граф.

За все время серьезная грабля была одна, описана мной тут. Резюме грабли - не собирайте на 6-х фре, у меня не завелось, все взлетело только на 7-ках.

Volkoff
мл. сержант
Сообщения: 100
Зарегистрирован: 2008-04-22 10:44:55
Откуда: СПб

Re: FreeBSD+mpd+ospfd объединение оффисов

Непрочитанное сообщение Volkoff » 2009-01-20 11:40:18

Супер, еще бы прозрачнее описание как это все работает... От клиентов VPN на оба сервера всегда будет висеть насколько я понимаю? но ходить по кратчайшему маршруту?

Аватара пользователя
sudosu
мл. сержант
Сообщения: 81
Зарегистрирован: 2008-05-27 12:17:32
Откуда: Что такое петровско-разумовская?

Re: FreeBSD+mpd+ospfd объединение оффисов

Непрочитанное сообщение sudosu » 2009-01-20 22:05:00

Volkoff писал(а):Супер, еще бы прозрачнее описание как это все работает... От клиентов VPN на оба сервера всегда будет висеть насколько я понимаю? но ходить по кратчайшему маршруту?
Да, всегда будут висеть два линка. Ходить будут по кратчайшему маршруту =)