В данной статье я покажу на живом примере как можно использовать протокол динамической маршрутизации BGP для реализации отказоустойчивости двух и более каналов передачи данных между двумя серверами на FreeBSD.
Будем использовать FreeBSD 9.1, quagga (zebra) и
vtun.
Quagga поддерживает следующие протоколы динамической маршрутизации:
- Routing Information Protocol (RIP): v1, v2, v3;
- Open Shortest Path First (OSPF): v2, v3;
- Border Gateway Protocol (BGP): v4;
- Intermediate System to Intermediate System (IS-IS).
В данном примере я буду использовать протокол BGP.
В
предыдущей статье я уже описывал
настройку vtun для создания шифрованного туннеля между двумя серверами. Этот туннель я буду использовать как один из каналов передачи данных.
Итак, есть два сервера, которые необходимо обеспечить двумя каналами передачи данных и чтобы в случае падения одного канала маршруты автоматические перестраивались на другой.
Маршрутизатор 1:
em0 - 192.168.111.254/24 (локальная сеть основного офиса)
em1 - 44.44.44.254 (сеть Интернет)
em2 - 10.10.10.1 (канал передачи данных между серверами 1 и 2)
Маршрутизатор 2:
em0 - 192.168.222.254/24 (локальная сеть филиала)
em1 - 44.44.55.254 (сеть Интернет)
em2 - 10.10.10.2 (канал передачи данных между серверами 2 и 1)
Установка quagga
[root@srv501gw-bgp-test /usr/ports/net/quagga]# make install clean
После успешной установки quagga в директории /usr/local/etc/quagga создаем следующие файлы:
bgpd.conf daemons isisd.conf ospf6d.conf ospfd.conf ripd.conf ripngd.conf zebra.conf
[root@srv501gw-bgp-test /usr/local/etc/quagga]# touch bgpd.conf daemons isisd.conf ospf6d.conf ospfd.conf ripd.conf ripngd.conf zebra.conf
Из этих файлов нам понадобятся только: daemons, zebra.conf и bgpd.conf
Остальные необходимо создать файлами нулевой длины иначе quagga будет ругаться на их отсутствие при запуске.
[root@srv501gw-bgp-test /usr/local/etc/quagga]# ll
total 20
drwxr-xr-x 2 quagga quagga 512B Jul 5 16:59 .
drwxr-xr-x 8 root wheel 512B Jul 8 09:30 ..
-rw-r--r-- 1 quagga quagga 1.9k Jul 5 19:00 bgpd.conf
-rw-r--r-- 1 quagga quagga 66B Jun 11 15:43 daemons
-rw-r--r-- 1 quagga quagga 0B Jul 5 16:59 isisd.conf
-rw-r--r-- 1 quagga quagga 0B Jul 5 16:52 ospf6d.conf
-rw-r--r-- 1 quagga quagga 0B Jul 5 16:52 ospfd.conf
-rw-r--r-- 1 quagga quagga 0B Jul 5 16:52 ripd.conf
-rw-r--r-- 1 quagga quagga 0B Jul 5 16:52 ripngd.conf
-rw-r--r-- 1 quagga quagga 599B Jul 5 17:44 zebra.conf
Также необходимо создать лог-файлы и выставить соответствующие права:
[root@srv501gw-bgp-test /usr/local/etc/quagga]# touch /var/log/zebra.log /var/log/bgpd.log
[root@srv501gw-bgp-test /usr/local/etc/quagga]# chown quagga:quagga /var/log/zebra.log
[root@srv501gw-bgp-test /usr/local/etc/quagga]# chown quagga:quagga /var/log/bgpd.log
Настройка quagga (zebra и bgpd)
В файле daemons указываем какие демоны нам нужны. В моем случае это zebra и bgpd.
[root@srv501gw-bgp-test /usr/local/etc/quagga]# cat daemons
zebra=yes
bgpd=yes
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no
В rc.conf добавляем следующие строки:
quagga_enable="YES"
quagga_daemons="zebra bgpd"
quagga_flags="-d -A 127.0.0.1"
watchquagga_enable="YES"
watchquagga_flags="-dz -R '/usr/local/etc/rc.d/quagga restart' * * *"
Я предпочитаю настраивать через VTY-консоль, но в блоге удобнее выложить конфигурационные файлы.
zebra.conf на сервере в офисе:
[root@srv501gw-bgp-test /usr/local/etc/quagga]# cat zebra.conf
!
! Zebra configuration saved from vty
! 2013/07/08 17:22:10
!
hostname srv501gw-bgp-test
password PaSSw0rd
enable password SuperPaSSw0rd
log file /var/log/zebra.log
log syslog
!
interface em0
ip address 192.168.111.254/24
!
interface em1
ip address 44.44.44.254/24
!
interface em2
ip address 10.10.10.1/24
!
interface tun0
ip address 172.16.0.1/24
!
interface lo0
!
ip forwarding
!
!
line vty
!
bgpd.conf на сервере в офисе:
[root@srv501gw-bgp-test /usr/local/etc/quagga]# cat bgpd.conf
!
! Zebra configuration saved from vty
! 2013/07/08 17:41:10
!
hostname srv501gw-bgp-test
password PaSSw0rd
enable password SuperPaSSw0rd
log file /var/log/bgpd.log
!
router bgp 64555
bgp router-id 192.168.111.254
bgp log-neighbor-changes
neighbor 10.10.10.2 remote-as 64556
neighbor 172.16.0.2 remote-as 64556
!
address-family ipv4
neighbor 10.10.10.2 activate
neighbor 10.10.10.2 weight 1500
neighbor 10.10.10.2 route-map DataChannel-out out
!
neighbor 172.16.0.2 activate
neighbor 172.16.0.2 weight 1000
neighbor 172.16.0.2 route-map VTun-out out
neighbor 172.16.0.2 send-community extended
network 0.0.0.0/0
!
ip prefix-list DataChannel-out seq 10 permit 0.0.0.0/0
!
route-map DataChannel-out permit 10
match ip address prefix-list DataChannel-out
set as-path prepend 64555 64555 64555
set community 64555:1001
!
route-map VTun-out permit 20
match ip address prefix-list DataChannel-out
!
!
line vty
Добавлю, что номера AS 64512 — 65535 выделены для частного использования («серые» номера AS).
zebra.conf на сервере в филиале:
[root@srv502gw-bgp-test /usr/local/etc/quagga]# cat zebra.conf!
! Zebra configuration saved from vty
! 2013/07/08 17:22:10
!
hostname srv502gw-bgp-test
password PaSSw0rd
enable password SuperPaSSw0rd
log file /var/log/zebra.log
log syslog
!
interface em0
ip address 192.168.222.254/24
!
interface em1
ip address 44.44.55.254/24
!
interface em2
ip address 10.10.10.2/24
!
interface tun0
ip address 172.16.0.2/24
!
interface lo0
!
ip forwarding
!
!
line vty
!
bgpd.conf на сервере в филиале:
[root@srv502gw-bgp-test /usr/local/etc/quagga]# cat bgpd.conf!
! Zebra configuration saved from vty
! 2013/07/08 17:46:22
!
hostname srv502gw-bgp-test
password PaSSw0rd
enable password SuperPaSSw0rd
log file /var/log/bgpd.log
!
router bgp 64556
bgp router-id 192.168.222.254
bgp log-neighbor-changes
network 192.168.222.0/24
redistribute connected
redistribute static
neighbor 10.10.10.1 remote-as 64555
neighbor 10.10.10.1 weight 1500
neighbor 10.10.10.1 route-map DataChannel-out out
neighbor 172.16.0.1 remote-as 64555
neighbor 172.16.0.1 weight 1000
neighbor 172.16.0.1 route-map VTun-out out
!
ip prefix-list DataChannel-out seq 10 permit 192.168.222.0/24
!
route-map DataChannel-out permit 10
match ip address prefix-list DataChannel-out
set as-path prepend 64556 64556 64556
set community 64556:1001
!
route-map VTun-out permit 20
match ip address prefix-list DataChannel-out
!
line vty
!
Запуск и диагностика quagga
На обоих серверах запускаем quagga и watchquagga:
[root@srv501gw-bgp-test ~]# /usr/local/etc/rc.d/quagga start && /usr/local/etc/rc.d/watchquagga start
[root@srv502gw-bgp-test ~]# /usr/local/etc/rc.d/quagga start && /usr/local/etc/rc.d/watchquagga start
Проверяем:
[root@srv501gw-bgp-test ~]# tail /var/log/bgpd.log
...
2013/07/08 18:35:26 BGP: %ADJCHANGE: neighbor 172.16.0.2 Up
2013/07/08 18:35:36 BGP: %ADJCHANGE: neighbor 10.10.10.2 Up
[root@srv502gw-bgp-test ~]# tail /var/log/bgpd.log
...
2013/07/08 18:34:59 BGP: %ADJCHANGE: neighbor 172.16.0.1 Up
2013/07/08 18:35:09 BGP: %ADJCHANGE: neighbor 10.10.10.1 Up
Маршрутизация
На маршрутизаторе 1 (офис):
[root@srv501gw-bgp-test ~]# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 44.44.44.1 UGS 0 95947 em1
10.10.10.0/24 link#3 U 0 5383 em2
10.10.10.1 link#3 UHS 0 603 lo0
127.0.0.1 link#5 UH 0 51340 lo0
172.16.0.1 link#6 UHS 0 1 lo0
172.16.0.2 link#6 UH 0 6604 tun0
192.168.111.254 link#1 UHS 0 336 lo0
192.168.222.0/24 10.10.10.2 UG1 0 0 em2
44.44.44.0/24 link#2 U 1 41594 em1
44.44.44.254 link#2 UHS 0 0 lo0
На маршрутизаторе 2 (филиал):
[root@srv502gw-bgp-test ~]# netstat -rn
Routing tables
Internet:
Destination Gateway Flags Refs Use Netif Expire
default 10.10.10.1 UG1 0 0 em2
10.10.10.0/24 link#3 U 0 8398 em2
10.10.10.2 link#3 UHS 0 216 lo0
127.0.0.1 link#5 UH 0 2313 lo0
172.16.0.1 link#6 UH 0 8460 tun0
172.16.0.2 link#6 UHS 0 2 lo0
44.44.55.0/24 link#2 U 0 46500 em1
44.44.55.254 link#2 UHS 0 0 lo0
Как видим, маршрут по умолчанию на сервере в филиале направлен на шлюз 10.10.10.1 (сервер в офисе). При падении канала передачи данных (сетевой интерфейс em2) маршрут автоматически перестроится на 172.16.0.1
Литература: