вторник, 9 октября 2012 г.

Настройка BGP и Zebra в Quagga Freebsd. Балансировка.

Итак, сегодня мы будем настраивать самый, наверное популярный протокол маршрутизации BGP. Делать все это мы будем на Freebsd 9 и Quagga. Для начала установим:

cd /usr/ports/net/quagga
make install clean

Quagga потянет за собой немало зависимостей, поэтому придется чуть подождать...

Установилось?  Отступим от темы. Quagga это такой мультипротокльный демон, в нем собрано множество протоколов маршрутизации, будь то ospf или же пресловутый RIP. Конфигурировать его можно двумя способами, это через консоль и непосредственно через файлы. Вообще конечно правильно будет редактировать через консоль, но я предпочитаю если новая установка редактировать сначала в файлах. Поэтому сначала настроим в файлах, а доводить до ума будем через консоль. Рассматривать мы будем конфигурацию, при которой у нас есть три физических линка, из которых два, это вышестоящие провайдеры, а третий это пиринг с местной локальной сетью. С каждого получаем Full View. Full View это полная таблица маршрутизации, для ее приема, в данный момент требуется как минимум 512 mb оперативной памяти. Каналы к вышестоящим провайдерам у нас асимметричные, у prov2 мы берем 1 Гбит/сек, а у prov1 мы берем 400 mb/s. Нам будет необходимо сбалансировать каналы как 3 к 1, то есть сделать нагрузку на каналы равномерные.


Zebra
Выдержка из Wiki: GNU Zebra — пакет программного обеспечения для Unix-подобных операционных систем, созданный Проектом GNU, позволяющий превратить обычный компьютер в высокопроизводительный TCP/IP-маршрутизатор..
 Настройка его крайне проста. Нам необходимо создать файл

cd /usr/local/etc/quagga
touch zebra.conf
ee zebra.conf


!
hostname zebra
password 123
enable password 123
log file /var/log/quagga/zebra.log
!
interface vlan111
 ip address 123.123.123.2/30
!
interface vlan222
 ip address 213.213.213.2/30
!
interface vlan333
 ip address 231.231.231.2/30
!
ip route 0.0.0.0/0 123.123.123.1 15 
ip route 0.0.0.0/0 213.213.213.1 25

ip route 1.1.1.0/24 Null0
ip route 1.1.2.1/24 Null0
!
ip forwarding
ipv6 forwarding
!
line vty
 exec-timeout 0 0
!

Объясняю:


hostname zebra  - имя хоста, можете любое, хоть holyzebra
password 123  - пароль для доступа к консоли
enable password 123 - пароль для доступа к администрированию через консоль
log file /var/log/quagga/zebra.log - лог файл

interface vlan111 - здесь описываем интерфейсы, смотрящие в сторону провайдеров.
 ip address 123.123.123.2/28 - это наш первый вышестоящий провайдер
!
interface vlan222
 ip address 213.213.213.2/30 - это второй вышестоящий провайдер
!
interface vlan333
 ip address 231.231.231.2/30 - это наш пиринг с локальной сетью

ip route 0.0.0.0/0 123.123.123.1 15  очень интересный момент, указываем шлюз по умолчанию.

Отступим, цифры 15 и 25 это грубо говоря приоритет, то есть сначала будет использоваться шлюз, с высшим приоритетом, который 15, а если он будет недоступен, то уже второй шлюз будет выставлен по умолчанию.

ip route 0.0.0.0/0 213.213.213.1 25 шлюз, который будет, если вдруг упадет первый

ip route 1.1.1.0/24 Null0 сети, которые мы будем анонсировать заворачиваем на себя
ip route 1.1.2.1/24 Null0

Итак, с настройкой Zebr'ы вроде все ясно, перейдем к настройке непосредственно BGP.

BGP

Выдержка из Wiki: BGP (англ. Border Gateway Protocol, протокол граничного шлюза) основной протокол динамической маршрутизации в Интернете
Создадим файл конфигурации:

touch bgpd.conf
ee bgpd.conf


!
hostname bgp-term
password 123
enable password 123
log file /var/log/quagga/bgpd.log
!
bgp config-type cisco
!
router bgp 11111
 no synchronization
 bgp router-id 123.123.123.2
 bgp log-neighbor-changes
 network 1.1.1.0 mask 255.255.255.0
 network 1.1.2.0 mask 255.255.255.0
 neighbor 123.123.123.1 remote-as 12312
 neighbor 123.123.123.1 description prov1
 neighbor 123.123.123.1 update-source 123.123.123.2
 neighbor 123.123.123.1 timers 3 10
 neighbor 123.123.123.1 prefix-list prov1-in in
 neighbor 123.123.123.1 route-map prepend_prov1-in in
 neighbor 123.123.123.1 route-map prepend_prov1-out out
 neighbor 213.213.213.1 remote-as 21321
 neighbor 213.213.213.1 description prov2
 neighbor 213.213.213.1 update-source 213.213.213.2
 neighbor 213.213.213.1 timers 3 10
 neighbor 213.213.213.1 prefix-list prov2-in in
 neighbor 213.213.213.1 route-map prepend_prov2-in in
 neighbor 213.213.213.1 route-map prepend_prov2-out out
 neighbor 231.231.231.1 remote-as 23123
 neighbor 231.231.231.1 description peering
 neighbor 231.231.231.1 update-source 231.231.231.2
 neighbor 231.231.231.1 weight 4000
 neighbor 231.231.231.1 prefix-list peering-in in
 neighbor 231.231.231.1 prefix-list peering-out out
 no auto-summary
!
ip prefix-list prov1-in seq 5 deny 0.0.0.0/0
ip prefix-list prov1-in seq 10 permit 0.0.0.0/0 ge 22
ip prefix-list prov1-out-1 seq 5 permit 1.1.2.0/24
ip prefix-list prov1-out-1 seq 10 deny any
ip prefix-list prov1-out-2 seq 5 permit 1.1.1.0/24
ip prefix-list prov1-out-2 seq 10 deny any
ip prefix-list prov2-in seq 5 deny 0.0.0.0/0
ip prefix-list prov2-in seq 10 permit 0.0.0.0/0 le 22
ip prefix-list prov2-out-1 seq 5 permit 1.1.1.0/24
ip prefix-list prov2-out-1 seq 10 deny any
ip prefix-list prov2-out-2 seq 5 permit 1.1.2.0/24
ip prefix-list prov2-out-2 seq 10 deny any
ip prefix-list peering-in seq 5 deny 0.0.0.0/0
ip prefix-list peering-in seq 10 permit any
ip prefix-list peering-out seq 5 permit 1.1.1.0/24
ip prefix-list peering-out seq 10 permit 1.1.2.0/24
ip prefix-list peering-out seq 15 deny any
!
route-map prepend_prov1-in permit 10
 match ip address prefix-list prov1-in
!
route-map prepend_prov1-in permit 20
 match ip address prefix-list prov1-in
!
route-map prepend_prov2-in permit 10
 match ip address prefix-list prov2-in
!
route-map prepend_prov2-in permit 20
 match ip address prefix-list prov2-in
!
route-map prepend_prov1-out permit 10
 match ip address prefix-list prov1-out-1  
set as-path prepend 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111
!
route-map prepend_prov1-out permit 20
 match ip address prefix-list prov2-out-2
 set as-path prepend 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111
!
route-map prepend_prov2-out permit 10
 match ip address prefix-list prov2-out-1
!
route-map prepend_prov2-out permit 20
 match ip address prefix-list prov2-out-2
!
line vty
!



Объясняю:


hostname bgp-term - опять же хостнэйм, зависит от вашей фантазии или допустим от местонахождения
password 123 - пароль для консоли
enable password 123 - административный пароль для консоли
log file /var/log/quagga/bgpd.log - лог-файл
!
router bgp 11111 - номер вашей автономной системы (AS)
bgp router-id 123.123.123.2 - ваш роутер-ид
bgp log-neighbor-changes - логировать изменения

network 1.1.1.0 mask 255.255.255.0 - описываем сети, которые будем анонсировать
network 1.1.2.0 mask 255.255.255.0

Описываем наших соседей:

neighbor 123.123.123.1 remote-as 12312 - Сосед и номер его AS
neighbor 123.123.123.1 description prov1 - описание
neighbor 123.123.123.1 update-source 123.123.123.2 - с какого адреса соединяться и обновлять
neighbor 123.123.123.1 timers 3 10 - этот таймер нужен для быстрого переключения при падении одного линка, но может быть и плохо, так как мы будем чаще опрашивать наших соседей
neighbor 123.123.123.1 prefix-list prov1-in in - префикс лист, в которых мы описываем какие сети отдавать соседу
neighbor 123.123.123.1 route-map prepend_prov1-in in - route-map в которых мы будем балансировать входящий трафик
neighbor 123.123.123.1 route-map prepend_prov1-out out - route-map в которых мы будем балансировать исходящий трафик

neighbor 231.231.231.1 weight 4000 - вес соседа, т.к. мы будем принимать все сети от данного соседа и выставлять приоритет для них, сделаем наивысший вес.
Описываем префикс листы:

ip prefix-list prov1-in seq 5 deny 0.0.0.0/0 - запрещаем маршрут по умолчанию для prov1
ip prefix-list prov1-in seq 10 permit 0.0.0.0/0 ge 22 - принимаем от prov1 только те сети, маска которых больше 22 бит
ip prefix-list prov1-out-1 seq 5 permit 1.1.2.0/24 - описываем, что  анонсировать prov1
ip prefix-list prov1-out-1 seq 10 deny any - запрещаем все остальное
ip prefix-list prov1-out-2 seq 5 permit 1.1.1.0/24 
ip prefix-list prov1-out-2 seq 10 deny any

Таким образом мы балансируем исходящий трафик

ip prefix-list prov2-in seq 5 deny 0.0.0.0/0 - запрещаем маршрут по умолчанию для prov2
ip prefix-list prov2-in seq 10 permit 0.0.0.0/0 le 22 - принимаем от prov2 только те сети, маска которых меньше 22 бит
ip prefix-list prov2-out-1 seq 5 permit 1.1.1.0/24 - описываем, что  анонсировать prov2
ip prefix-list prov2-out-1 seq 10 deny any - запрещаем все остальное
ip prefix-list prov2-out-2 seq 5 permit 1.1.2.0/24
ip prefix-list prov2-out-2 seq 10 deny any

ip prefix-list peering-in seq 5 deny 0.0.0.0/0  - запрещаем маршрут по умолчанию для peering
ip prefix-list peering-in seq 10 permit any - разрешаем на прием все
ip prefix-list peering-out seq 5 permit 1.1.1.0/24 - описываем что мы анонсируем
ip prefix-list peering-out seq 10 permit 1.1.2.0/24
ip prefix-list peering-out seq 15 deny any - запрещаем все остальное
!
Описываем наши route-map'ы:

set as-path prepend 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 - по поводу этого параметра можно написать целую статью, но если вкратце, то на входящий трафик напрямую мы влиять не можем поэтому мы удлиняем маршрут до нас на несколько наших AS. Таким образом мы балансируем входящий трафик

!
route-map prepend_prov1-out permit 20
match ip address prefix-list prov2-out-2
set as-path prepend 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 - здесь тоже самое, но для второй нашей подсети
!
На этом настройка подошла к концу, что мы получили? Балансировка исходящего и входящего трафика, при падении одного из провайдеров, автоматически переключаемся на другого, используем пиринг. Осталось дело за малым, настроить запуск, запустить и проверить.

Итак:

ee /etc/rc.conf

quagga_enable="YES"
quagga_daemons="zebra bgpd"
quagga_flags="-d -A 127.0.0.1"
/usr/local/etc/rc.d/quagga start

Что мы сделали, поставили в автозапуск и запустили Quagg'у.
Проверим что все получаем и анонсируем.
telnet localhost 2605 - консоль BGP
bgp# telnet localhost 2605
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Hello, this is Quagga (version 0.99.20).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
User Access Verification
Password: 123

Вводим sh ip bgp neighbors - получаем список соседей и их статус
Если видим BGP state = Established, up for 20:36:53  значит все хорошо. Если нет, то плохо нужно изучать log-файл.

Далее смотрим sh ip bgp neighbors 123.123.123.1 advertised-routes

   Network          Next Hop            Metric LocPrf Weight Path
*> 1.1.1.0/24  123.123.123.1           0         12312 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 11111 i
*> 1.1.2.0/24  123.123.123.1            0         12312 i

Все в порядке, маршруты анонсируем.

sh ip bgp

*> 1.0.0.0/24        123.123.123.1                     12312 15169 i
*> 1.0.4.0/22        123.123.123.1                      12312 1273 4323 7545 7545 7545 7545 56203 i
*> 1.0.16.0/23      123.123.123.1                        12312 1299 2914 2519 i
*> 1.0.18.0/23      123.123.123.1                       12312 1299 2914 2519 i
*> 1.0.20.0/23      123.123.123.1                       12312 1299 2914 2519 i
*> 1.0.22.0/23      123.123.123.1                       12312 1299 2914 2519 i
*> 1.0.24.0/23      123.123.123.1                        12312 1299 2914 2519 i
*> 1.0.26.0/23      123.123.123.1                       12312 1299 2914 2519 i
*> 1.0.28.0/22      123.123.123.1                        12312 1299 2914 2519 i

Все супер, маршруты приняли, теперь все работает!!!



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