Заметки о работе с ОС FreeBSD. Статьи об установке и настройке ПО для FreeBSD.

9 июля 2013 г.

Настраиваем quagga (zebra, bgpd) во FreeBSD для отказоустойчивости каналов передачи данных

В данной статье я покажу на живом примере как можно использовать протокол динамической маршрутизации 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)
tun0 - 172.16.0.1 (туннель на основе vtun между серверами 1 и 2)


Маршрутизатор 2:
em0 - 192.168.222.254/24 (локальная сеть филиала)
em1 - 44.44.55.254 (сеть Интернет)
em2 - 10.10.10.2 (канал передачи данных между серверами 2 и 1)
tun0 - 172.16.0.2 (туннель на основе vtun между серверами 2 и 1)

Установка quagga

После обновления дерева портов ставим пакет 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


Литература:

Комментариев нет: