Не так давно один хороший человек попросил помочь с настройкой BGP во Vyatta 5.0.2. Этот маршрутизатор используется как граница сети провайдера VoIP. Почти все адреса и номера автономных систем заменены на абстрактные, на всякий случай. Входные данные следующие:
Обозначим нашу сеть x.x.x.0/24; маршрутизатор Cogent, отдающий анонсы y.y.y.y; принимающий анонсы z.z.z.z; адрес источника для принимаемых нами маршрутов t.t.t.t; адрес второго соседа w.w.w.w. Номер нашей автономной системы обозначим 65501, второго соседа за 65502, Cogent оставим как он есть — 174.
Приступаем к настройке
Активируем процесс BGP, указываем соседей и анонсируемые сети.
edit protocols bgp 65501
set neighbor y.y.y.y remote-as 174 # Отдает нам маршруты из Cogent
set neighbor z.z.z.z remote-as 174 # Принимает наши маршруты в Cogent
set neighbor w.w.w.w remote-as 65502 # Второй сосед
set network x.x.x.0/24 # Наша сеть
set network t.t.t.t/32 # Адрес источника маршрутов из Cogent
exit
commit
Теперь надо что-то сделать с адресом источника маршрутов. Учитывая, что ни для чего больше он не используется, его обычно вешают на петлевой интерфейс (в Cisco это было бы единственным способом, поскольку в качестве источника анонсов там указывался интерфейс, а не адрес).
set interfaces loopback lo address t.t.t.t/32
commit
Настройка политик маршрутизации
Учитывая, что соседи хотят видеть в наших анонсах только нашу сеть, а один из соседей вовсе не должен ничего получать, нам нужно настроить политики маршрутизации. Мы сделаем это с помощью «карт маршрутов» (route-map).
Сначала нужно определить списки сетей (prefix-list), которые будут использованы. Вот список наших сетей:
edit policy prefix-list AdvertisedRoutes
set rule 1 action permit
set rule 1 prefix t.t.t.t/32
set rule 2 action permit
set rule 2 pefix x.x.x.0/24
exit
commit
И соответствующая карта маршрутов: анонсируем сети из списка AdvertisedRoutes, не анонсируем ничего другого.
edit policy route-map Advertise
set rule 1 action permit
set rule 1 match ip address prefix-list AdvertisedRoutes
set rule 2 action deny
exit
commit
Карта маршрутов, запрещающая анонсирование чего бы то ни было:
edit policy route-map NoAdvertise
set rule 1 action deny
exit
commit
Теперь создадим карту, которая будет увеличивать вес маршрутам из Digiport, чтобы при наличии в анонсах обоих маршрут через него считался приоритетным.
edit policy route-map DigiportPrioritize
set rule 1 action permit
set rule 1 set weight 10 # Устанавливаем вес 10, по умолчанию он 0
exit
commit
Настройка соседей
Теперь мы закончили с политикой, и можно настроить самих соседей. Начнем с того, который отдает нам маршруты Cogent.
edit protocols bgp 65501
set neighbor y.y.y.y ebgp-multihop 5
set neighbor y.y.y.y route-map export NoAdvertise
set neighbor y.y.y.y update-source t.t.t.t
exit
commit
Параметр ebgp-multihop отвечает за максимальное расстояние до маршрутизатора, если он не является соединенным напрямую. Параметр update-source определяет, какой адрес будет указан источником анонсов. Опция route-map export указывает карту маршрутов, которая будет применена к исходящим анонсам (для входящих нужно заменить там export на import).
Теперь переходим к тому, который принимает анонсы.
edit protocols bgp 65501
set neighbor z.z.z.z route-map export Advertise
exit
commit
И закончим это все вторым соседом.
edit protocols bgp 65501
set neighbor w.w.w.w route-map export Advertise
set neighbor w.w.w.w route-map import DigiportPrioritize
exit
commit
Настроим маршрут по умолчанию через Cogent, чтобы ходить через него в те сети, которые он не анонсирует, хотя они через него доступны транзитом. (пусть адрес маршрутизатора будет q.q.q.q)
set protocols static route 0.0.0.0/0 next-hop q.q.q.q
Фрагмент конфига
Теперь можно полюбоваться на проделанную работу.
policy {
prefix-list AdvertisedRoutes {
rule 1 {
action permit
prefix t.t.t.t/32
}
rule 2 {
action permit
prefix x.x.x.0/24
}
}
route-map Advertise {
rule 1 {
action permit
match {
ip {
address {
prefix-list Advertised
}
}
}
}
rule 2 {
action deny
}
}
route-map DigiportPrioritize {
rule 1 {
action permit
set {
weight 10
}
}
}
route-map NoAdvertise {
rule 1 {
action deny
}
}
}
protocols {
bgp 65501 {
neighbor y.y.y.y {
ebgp-multihop 5
remote-as 174
route-map {
export NoAdvertise
}
update-source t.t.t.t
}
neighbor z.z.z.z {
remote-as 174
route-map {
export Advertise
}
}
neighbor w.w.w.w {
remote-as 65502
route-map {
export Advertise
import DigiportPrioritize
}
}
network t.t.t.t/32 {
}
network x.x.x.0/24 {
}
}
static {
route 0.0.0.0/0 {
next-hop q.q.q.q {
}
}
}
}
Смотрим результат
Vyatta имеет ряд полезных команд операционного режима, позволяющих посмотреть на происходящее.
vyatta@vyatta:~$ show ip bgp neighbors y.y.y.y advertised-routes
vyatta@vyatta:~$ show ip bgp neighbors z.z.z.z advertised-routes
BGP table version is 0, local router ID is t.t.t.t
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
*> t.t.t.t/32 xx.xxx.xx.xx 1 32768 i
*> x.x.x.x.0/24 xx.xxx.xx.xx 1 32768 i
Total number of prefixes 2
vyatta@vyatta:~$ show ip bgp neighbors w.w.w.w advertised-routes
BGP table version is 0, local router ID is t.t.t.t
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
*> t.t.t.t/32 zzz.zz.z.zzz 1 32768 35978 35978 35978 35978 i
*> x.x.x.0/24 zzz.zz.z.zzz 1 32768 35978 35978 35978 35978 i
Total number of prefixes 2
Как мы убедились с помощью команды show ip bgp neighbor <адрес> advertised-routes, первому не анонсируется ничего, а остальным наша подсеть и адрес источника. Всех соседей можно увидеть с помощью show ip bgp neighbors.
Список всех полученных маршрутов можно увидеть в show ip bgp. Посмотрим небольшой фрагмент.
BGP table version is 0, local router ID is t.t.t.t
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
*> 0.0.0.0 www.ww.w.www 10 31846 ?
*> 4.23.112.0/24 xx.xxx.xx.xxx 5010 0 174 21889 i
*> 4.23.113.0/24 xx.xxx.xx.xxx 5010 0 174 21889 i
*> 4.23.114.0/24 xx.xxx.xx.xxx 5010 0 174 21889 i
*> 4.36.118.0/24 xx.xxx.xx.xxx 5010 0 174 21889 i
*> 4.59.23.0/24 xx.xxx.xx.xxx 36990 0 174 33042 i
*> 4.79.98.8/30 www.ww.w.www 10 31846 i
*> 4.79.248.0/24 xx.xxx.xx.xxx 1000 0 174 12180 12180 12180 12180 12180 i
Как видно, вес у маршрутов от второго соседа действительно поменялся.
С помощью show ip bgp summary можно узнать некоторую общую статистику.
vyatta@vyatta:~$ show ip bgp summary
BGP router identifier t.t.t.t, local AS number 65501
RIB entries 73927, using 4620 KiB of memory
Peers 3, using 7560 bytes of memory
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
y.y.y.y 4 174 331654 30759 0 0 0 01w1d03h 38882
z.z.z.z 4 174 30540 30764 0 0 0 01w1d03h 1
w.w.w.w 4 65502 61550 61503 0 0 0 4d07h43m 159
Total number of neighbors 3
С помощью show ip route можно убедиться, что наши маршруты действительно попали в FIB. Там они имеют префикс B.
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
I - ISIS, B - BGP, > - selected route, * - FIB route
B 0.0.0.0/0 [20/0] via www.ww.w.www, 4d07h49m
S>* 0.0.0.0/0 [1/0] via yy.yyy.yy.yyy, eth1
B>* 4.23.112.0/24 [20/5010] via xx.xxx.xx.xxx, eth1 (recursive via yy.yyy.yy.yyy), 01w1d03h
B>* 4.23.113.0/24 [20/5010] via xx.xxx.xx.xxx, eth1 (recursive via yy.yyy.yy.yyy), 01w1d03h
B>* 4.23.114.0/24 [20/5010] via xx.xxx.xx.xxx, eth1 (recursive via yy.yyy.yy.yyy), 01w1d03h
B>* 4.36.118.0/24 [20/5010] via xx.xxx.xx.xxx, eth1 (recursive via yy.yyy.yy.yyy), 01w1d03h
B>* 4.59.23.0/24 [20/36990] via xx.xxx.xx.xxx, eth1 (recursive via yy.yyy.yy.yyy), 01w1d03h
Заключение
Настроенный маршрутизатор уже несколько недель отлично выполняет свои задачи (хотя в организационном плане мы с этими провайдерами утомились общаться). Владелец заметил огромный прирост производительности в сравнении с Cisco 2621, который раньше стоял на этом месте.
Надеюсь, этот пример настройки окажется кому-то полезным.