BGP (англ.
Border Gateway Protocol, протокол граничного шлюза) — основной протокол динамической маршрутизации в Интернете. Протокол, о котором можно сказать, что на нем держится весь Интернет. Суть его в том, что каждый маршрутизатор сообщает соседям, какие сети он маршрутизирует. В ответ соседи сообщают ему, какие сети доступны через них, через их соседей и т.д. Имея несколько BGP-линков, появляется возможность выбирать тот линк, через который маршрут до какой-либо сети будет короче и т.д.
Но тема этой заметки не о самом протоколе BGP, а о его свободной реализации —
quagga. Следует заметить, что quagga также поддерживает OSPF и RIP, но мы рассмотрим только BGP. Я приведу несколько несложных примеров использования quagga с конфигами и логами.
. . .
Quagga состоит из нескольких демонов:
- bgpd, ospfd, ripd – занимаются соответствующими протоколами.
- watchquagga – следит за демонами и перезапускает их, если они упали.
- zebra – основной демон, занимающийся общением с другими демонами и ядром системы. Именно он прописывает маршруты в системе, получая их от других демонов.
Конфиги лежат в каталоге /etc/quagga/. Запишем минимальный конфиг zebra.conf:
hostname zebra
password 123
enable password 456
log file /var/log/zebra.log
Описание опций (с ними вы столкнетесь при настройке любого демона из пакета quagga):
- hostname — имя хоста. Опция служит для удобства, видна в консольном интерфейса.
- password — пароль для входа в консоль.
- enable password — пароль для выполнения административных задач.
После этого демон zebra можно запустить и больше не трогать, менять его настройки мы не будем. Zebra также позволяет настраивать сетевые интерфейсы, но мы будем это делать стандартными сетевыми утилитами системы.
Каждый демон из пакета quagga по умолчанию слушает определенный порт на 127.0.0.1 (2601 для zebra, 2605 для bgpd) и может управляться при помощи telnet. Интерфейс сделан в стиле Cisco.
Теперь опишу несколько примеров использования BGP.
1. Просто анонсировать одну свою подсеть на один аплинк
Конфиг bgpd (/etc/quagga/bgpd.conf):
hostname test
password 123
enable password 456
log file /var/log/bgpd.log
router bgp 12002
bgp router-id 1.2.3.42
network 11.22.33.44.0/23
neighbor 1.2.3.41 remote-as 12001
Описание опций:
router bgp 12002 – указываем, что bgp вообще должен работать; указываем номер нашей AS – 12002.
bgp router-id 1.2.3.42 – тут должен быть указан IP нашего роутера. На самом деле особого значения не имеет, можно указать любой IP. Однако виден вашим соседям, так что стоит указать основной IP роутера.
network 11.22.33.44.0/23 – сеть, которую мы будем анонсировать соседям. Таких записей может быть несколько.
neighbor 1.2.3.41 remote-as 12001 – описание соседа.
1.2.3.41 – IP, по которому доступен сосед;
12001 –AS соседа.
Пример связи двух BGP-роутеров приводить думаю смысла нет, перейдем сразу к более сложным примерам.
2. Цепочка из трех роутеров. Первый и последний прямой связи не имеют

Пример использования – связка: ваш аплинк; вы; ваш клиент, имеющий свою AS и подсеть и физический линк с вами. Привожу конфиг и вывод команды
sh ip bgp на каждом из трех роутеров. Команда
sh ip bgp показывает таблицу маршрутизации, сформированную bgpd. router-id я указывал левые, что, конечно же, не является хорошим примером.
hostname bgpd1
password 123
enable password 456
router bgp 12101
bgp router-id 172.16.1.1
network 192.168.12.0/24
neighbor 172.18.0.2 remote-as 12102
bgpd1> sh ip bgp
BGP table version is 0, local router ID is 172.16.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.12.0 0.0.0.0 0 32768 i
*> 192.168.13.0 172.18.0.2 0 0 12102 i
*> 192.168.14.0 172.18.0.2 0 12102 12103 i
Total number of prefixes 3
hostname bgpd2
password 123
enable password 456
router bgp 12102
bgp router-id 172.16.2.2
network 192.168.13.0/24
neighbor 172.18.0.1 remote-as 12101
neighbor 172.19.0.2 remote-as 12103
bgpd2> sh ip bgp
BGP table version is 0, local router ID is 172.16.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.12.0 172.18.0.1 0 0 12101 i
*> 192.168.13.0 0.0.0.0 0 32768 i
*> 192.168.14.0 172.19.0.2 0 0 12103 i
Total number of prefixes 3
hostname bgpd3
password 123
enable password 456
router bgp 12103
bgp router-id 172.16.3.3
network 192.168.14.0/24
neighbor 172.19.0.1 remote-as 12102
bgpd3> sh ip bgp
BGP table version is 0, local router ID is 172.16.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.12.0 172.19.0.1 0 12102 12101 i
*> 192.168.13.0 172.19.0.1 0 0 12102 i
*> 192.168.14.0 0.0.0.0 0 32768 i
Total number of prefixes 33. Четыре роутера, соединенные ромбиком

Пример использования – у вас два аплинка. А также, в силу того, что пример весьма синтетический, он также демонстрирует отказоустойчивое кольцо: связь между bgpd1 и bgpd4 не потеряется при падении bgpd2 или bgpd3 (но не обоих одновременно).
router bgp 12101
bgp router-id 172.16.1.1
network 192.168.12.0/24
neighbor 172.16.18.2 remote-as 12102
neighbor 172.16.19.2 remote-as 12103
bgpd1> sh ip bgp
BGP table version is 0, local router ID is 172.16.1.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.12.0 0.0.0.0 0 32768 i
* 192.168.13.0 172.16.19.2 0 12103 12104 12102 i
*> 172.16.18.2 0 0 12102 i
*> 192.168.14.0 172.16.19.2 0 0 12103 i
* 192.168.15.0 172.16.18.2 0 12102 12104 i
*> 172.16.19.2 0 12103 12104 i
Total number of prefixes 4
router bgp 12102
bgp router-id 172.16.2.2
network 192.168.13.0/24
neighbor 172.16.18.1 remote-as 12101
neighbor 172.16.20.2 remote-as 12104
bgpd2> sh ip bgp
BGP table version is 0, local router ID is 172.16.2.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.12.0 172.16.18.1 0 0 12101 i
*> 192.168.13.0 0.0.0.0 0 32768 i
* 192.168.14.0 172.16.20.2 0 12104 12103 i
*> 172.16.18.1 0 12101 12103 i
* 192.168.15.0 172.16.18.1 0 12101 12103 12104 i
*> 172.16.20.2 0 0 12104 i
Total number of prefixes 4
router bgp 12103
bgp router-id 172.16.3.3
network 192.168.14.0/24
neighbor 172.16.19.1 remote-as 12101
neighbor 172.16.21.2 remote-as 12104
bgpd3> sh ip bgp
BGP table version is 0, local router ID is 172.16.3.3
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.12.0 172.16.19.1 0 0 12101 i
* 172.16.21.2 0 12104 12102 12101 i
* 192.168.13.0 172.16.19.1 0 12101 12102 i
*> 172.16.21.2 0 12104 12102 i
*> 192.168.14.0 0.0.0.0 0 32768 i
*> 192.168.15.0 172.16.21.2 0 0 12104 i
Total number of prefixes 4
router bgp 12104
bgp router-id 172.16.4.4
network 192.168.15.0/24
neighbor 172.16.20.1 remote-as 12102
neighbor 172.16.21.1 remote-as 12103
bgpd4> sh ip bgp
BGP table version is 0, local router ID is 172.16.4.4
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal,
r RIB-failure, S Stale, R Removed
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
* 192.168.12.0 172.16.21.1 0 12103 12101 i
*> 172.16.20.1 0 12102 12101 i
*> 192.168.13.0 172.16.20.1 0 0 12102 i
* 192.168.14.0 172.16.20.1 0 12102 12101 12103 i
*> 172.16.21.1 0 0 12103 i
*> 192.168.15.0 0.0.0.0 0 32768 i
Total number of prefixes 4