В этой статье расскажу о протоколе динамической маршрутизации BGP. Он применяется в больших подсетях, у интернет провайдеров. Так же может применяться, если у вас несколько провайдеров, и вы хотите, в случае пропадания одного из них, что интернет пошёл через другого. Здесь будет показано, как можно организовать быстро.
1) Поднятие bgp-сессии между 2-мя роутерами.
Перед тем, как приступать к настройкам, рекомендую прочесть заметку «6-значные AS‘ы» в конце страницы.
Напомню, что роутеры должны «друг друга видеть».
Заходим на router1 (ip=10.10.10.1, будем анонсировать сеть 172.16.0.0/24):
router1#conf t
router1(config)#router bgp 1
router1(config-router)#neighbor 10.10.10.2 remote-as 2
router1(config-router)#network 172.16.0.0 mask 255.255.255.0
Теперь на router2 делаем аналогичное (а здесь будем анонсировать сеть 192.168.0.0/24):
router2#conf t
router2(config)#router bgp 2
router2(config-router)#neighbor 10.10.10.1 remote-as 1
router2(config-router)#network 192.168.0.0 mask 255.255.255.0
Теперь заходим на любой из роутеров и смотрим состояние bgp:
router1#sh ip bgp
BGP table version is 0, local router ID is 10.10.10.1
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.0.0/24 10.10.10.2 0 2 i
*> 172.16.0.0/24 0.0.0.0 0 32768 i
а теперь зайдём на другой и посмотрим, что у нас там:
router2#sh ip bgp
BGP table version is 0, local router ID is 10.10.10.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 192.168.0.0/24 0.0.0.0 0 32768 i
*> 172.16.0.0/24 10.10.10.1 0 1 i
Если на этом этапе вы не видите анонсируемых подсетей, посмотрите внимательно информацию о соседе:
#sh ip bgp nei IP_адрес_соседа
В этом выводе обратите внимание на BGP state, оно должно быть Established. Если что-то другое — значит где-то ошибка. Только состояние Established позволяет получать/принимать анонсы.
2) Настройка приоритетов пути.
Для того, что бы выбрать путь к хосту, роутер просматривает таблицу маршрутизации и выбирает оптимальный путь. Если путей до хоста несколько, то роутер выбирает путь с наибольшим весом. Вес устанавливается для соседей, которые анонсируют одинаковые маршруты. По дефолту локальному маршруту назначается вес 32768, а всем остальным 0. Что бы изменить вес делаем так:
router2#conf t
router2(config)#router bgp 2
router2(config-router)#neighbor 10.10.10.1 weight 1000
Этим мы установили соседу 10.10.10.1 вес в 1000 на роутере router2. Смотрим что изменилось (предварительно добавив сеть 192.168.0.0/24 на роутере router1):
router2# sh ip bgp
BGP table version is 0, local router ID is 10.10.10.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 172.16.0.0/24 10.10.10.1 0 2000 1 i
* 192.168.0.0 10.10.10.1 0 2000 1 i
*> 0.0.0.0 0 32768 i
Видим, что вариантов для маршрута к сети 192.168.0.0 два: один локальный и один через 10.10.10.1. Скобка означает наилучший маршрут. Наилучшим выбран локальный, ибо у него вес больше. Попробуем изменить вес, например, на 40000 и посмотрим, как изменятся маршруты:
router2# conf t
router2(config)# router bgp 2
router2(config-router)# neighbor 10.10.10.1 weight 40000
router2# sh ip bgp
BGP table version is 0, local router ID is 10.10.10.2
Status codes: s suppressed, d damped, h history, * valid, > best, i - internal
Origin codes: i - IGP, e - EGP, ? - incomplete
Network Next Hop Metric LocPrf Weight Path
*> 172.16.0.0/24 10.0.3.33 0 40000 1 i
*> 192.168.0.0 10.0.3.33 0 40000 1 i
* 0.0.0.0 0 32768 i
Примечание: обновление анонсов происходит раз 3 минуты (по дефолту). Что бы не ждать этого, принудительно очистим анонсы от соседа 10.10.10.1:
router2# clear ip bgp 10.10.10.1
3) Списки доступа.
В 99% случаев, приходится ограничивать экспортируемость и приём анонсов. Дело в том, что принимать ото всех анонсы небезопасно! Так же не нужно анонсировать свои подсети всем, кому попало. Для этого существуют списки доступа. Их 2 вида: по номеру AS и по префиксу анонсированых подсетей. Рассмотрим оба примера.
— по префиксам AS
ip as-path access-list <идентификатор> permit <регулярное выражение>
Здесь регулярное выражение задает шаблон, по которому будет срабатывать правило. Например, для ограничения по автономной системе 65004, выражение будет иметь вид ^65004$. Вместо permit может быть deny — соответственно разрешить и запретить.
Это правило описывает лишь поведение bgp. Для того, что бы оно работало, нужно его применить к каким-нибудь neighbor:
neighbor <адрес узла> filter-list in/out
например,
neighbor 10.0.3.38 filter-list 5 out
Здесь мы применяем фильтр с именем 5 к соседу 10.0.3.38, причём ключевое слово out — значит, что фильтр применяется к исходящим пакетам от нашего bgp к «соседу» 10.0.3.38. Так же может применяться слово in для входящих пакетов.
Пример:
router bgp 1
bgp router-id 10.0.3.33
network 172.16.0.0/24
network 192.168.0.0/24
neighbor 10.0.3.38 remote-as 2
neighbor 10.0.3.38 weight 35000
neighbor 10.0.3.38 filter-list 5 out
neighbor 10.0.3.174 remote-as 3
neighbor 10.0.3.174 weight 45000
!
ip as-path access-list 5 deny 2
В этом примере мы запрещаем анонсировать свои сети соседу 10.0.3.38.
— по адресам подсетей
Для этого используется следующая конструкция:
neighbor <адрес узла> route-map <имя route-map> in
route-map <имя route-map> permit 10
match ip address prefix-list <имя prefix-list>
ip prefix-list <имя> seq <номер> permit <адрес подсети>
Сначала создаём ip prefix-list. Это так сказать набор правил (как в файерволе): что-то разрешаем, что-то запрещаем. Далее создаём route-map, в котором указываем нужный ip prefix-list. Здесь очень важно понять, что всё, что вы не разрешили — автоматически запрещается! Поэтому, если используете эти правила, то нужно явно разрешать (а лучше и явно запрещать) список принимаемых или анонсируемых подсетей. И ещё одно: запретить или разрешить действие указывается именно в route-map. В ip prefix-list просто указывается, что данная подсеть принадлежит данному prefix-list’y.
Пример (взят с сайта opennet.ru)
Для этого на маршрутизаторе streamer.netup введем ограничения на
получаемые сети от маршрутизатора amalfi.netup. Разрешим анонсировать
только сеть 192.168.100.0/24 и для большей наглядности настроим
amalfi.netup на анонсирование новой, фиктивной сети 10.20.30.0/24. Для
этого на streamer.netup изменим конфигурационный файл
/etc/quagga/bgpd.conf следующим образом:
router bgp 65002
bgp router-id 10.1.2.8
network 172.16.100.0/24
network 172.16.102.0/24
network 172.16.103.0/24
neighbor 10.1.2.4 remote-as 65001
neighbor 10.1.2.4 route-map AMALFI in
neighbor 172.16.102.2 remote-as 65003
neighbor 172.16.103.2 remote-as 65004
!
ip prefix-list AMALFI_IP_LIST seq 6 permit 192.168.100.0/24
route-map AMALFI permit 10
match ip address prefix-list AMALFI_IP_LIST
На amalfi.netup в конфигурационный файл /etc/quagga/bgpd.conf добавим
экспорт фиктивной сети 10.20.30.0/24:
router bgp 65001
bgp router-id 10.1.2.4
network 192.168.100.0/24
network 10.20.30.0/24
neighbor 10.1.2.8 remote-as 65002
После применения настроек, проверим какие сети были анонсированы с
amalfi.netup. Для этого выполним следующую команду на streamer.netup:
streamer# show ip route bgp
Codes: K — kernel route, C — connected, S — static, R — RIP, O — OSPF,
I — ISIS, B — BGP, > — selected route, * — FIB route
B>* 172.16.101.0/24 [20/0] via 172.16.103.2, eth0, 00:02:20
B>* 192.168.100.0/24 [20/0] via 10.1.2.4, eth0, 00:02:24
Как и ожидалось информация о фиктивной сети 10.20.30.0/24 не попала в
маршрутную информацию. При этом информация о сети 192.168.100.0/24
осталась без изменений и доступна в списке маршрутов.
4) Искусственное удлинение маршрута.
Иногда бывает нужно принудительно пускать трафик через определённый канал. Для этого искусственно удлиняют маршрут, повышая таким образом его «стоимость» и заставляя трафик выбирать другой маршрут. Это делается через через set as-path prepend, который прописывается в route-map. Обычно после слова prepend прописывают несколько раз одну и ту же AS. Покажем на примере сети 192.168.0.0. Ситуация до:
bgpd# sh ip bgp
BGP table version is 0, local router ID is 10.0.3.33
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
*> 172.16.0.0/24 0.0.0.0 0 32768 i
* 192.168.0.0 10.0.3.38 0 45000 2 i
*> 10.0.3.174 0 45000 3 i
* 0.0.0.0 0 32768 i
удлинняем маршрут:
router bgp 1
bgp router-id 10.0.3.33
network 172.16.0.0/24
network 192.168.0.0/24
neighbor 10.0.3.38 remote-as 2
neighbor 10.0.3.38 weight 45000
neighbor 10.0.3.38 route-map NEW in
neighbor 10.0.3.174 remote-as 3
neighbor 10.0.3.174 weight 45000
!
route-map NEW permit 10
set as-path prepend 1 1 1 1
Очищаем анонсы от соседа, что бы заново сформировать таблицу маршрутизации и смотрим:
bgpd# clear ip bgp 10.0.3.174
bgpd# sh ip bgp
BGP table version is 0, local router ID is 10.0.3.33
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
*> 172.16.0.0/24 0.0.0.0 0 32768 i
* 192.168.0.0 10.0.3.174 0 45000 1 1 1 1 3 i
*> 10.0.3.38 0 45000 2 i
* 0.0.0.0 0 32768 i
Дефолтный маршрут для сети теперь пойдёт через соседа 10.0.3.38
Если вдруг prepand работает не совсем как хотелось, рекомендую ознакомиться с этой статьей
Примечание.
BGP всегда выбирает один из маршрутов — как наилучший. Когда маршрут выбран, BGP помещает его в свою таблицу маршрутизации, и передает его своим neighbor’ам. Для выбора наилучшего маршрута BGP использует следующие критерии:
1. Если путь, указанный в поле next-hop, недоступен, этот update убивается.
2. Лучшим считается путь с наибольшим значением weight;
3. Если weight путей одинаковы, то выбирается путь с наибольшим lpref;
4. Если weight и lpref одинаковы, то выбирается путь, который появился в таблице маршрутов BGP на данном роутере. (подразумевается, что это будет самый наикратчайший путь);
5. Если нет путей, которые «родились» на данном роутере, то выбирается путь с AS_path минимальной длины;
6. Если все пути имеют одинаковую длину (одинаковое количество hop’ов, следовательно), выбирается путь с «lowest origin type». Считается, что IGP < EGP < Incomplete.;
7. Если Origin attr. code одинаковы для всех путей, выбирается путь с наименьшим MED attr.;
8. Если и MED одинаковы для всех возможных путей, предпочтительным считается external path перед internal path;
9. Если опять все пути одинаковы, то prefer the path through the closest IGP neighbor;
10. Выбирается путь с наименьшим IP адресом из тех, которые указываются by the BGP router ID.
6-значные AS
Замечу сразу, что номера AS’ов можно писать как в 5-значном виде, так и в форме с точкой. Вот пример подсказок с роутера Cisco 7206:
<1-65535> AS of remote neighbor
<1.0-XX.YY> 4 octets AS of remote neighbor
В период активного развития интернета 5-значных AS’ов уже не хватает и начинают регистрировать 6-значные. Что бы полноценно использовать 6-ти знаки, нужно их перевести в формат с точкой. Это можно сделать как вручную, так и с помощью сайта http://labs.spritelink.net/ascalc . Опишем так же ручной способ (сам способ взят из рассылки openent.ru):
делим номер вашего 6-ти значного Ас ( 32 — бит ) на 65536 , полученное целое число
добавляем до точки, остаток после точки.
Например. 196925:65536=3
3*65536= 196608
196925-196608=317
получаем 3.317
Если у вас достаточно новый IOS то поддержка 6-знака в нём будет. Вот Пример (cisco 7206):
<1-4294967295> AS of remote neighbor
<1.0-XX.YY> AS of remote neighbor
и переводить в форму с точкой не обязательно.
5) Прочие мелочи.
— Принудительное указание интерфейса.
Если вам нужно настроить, что бы сессия устанавливалась только с определённого интерфейса, то используйте команду update-source:
neighbor 172.16.1.2 update-source Loopback1
Команда update-source используется для того, чтобы маршрутизатор четко знал с какого интерфейса ему устанавливать и поддерживать BGP сессию.
— Разрешаем анонс сетей из BGP в OSPF.
Для этого делаем такие шаги:
в OSPF:
— redistribute bgp
в BGP:
— bgp redistribute-internal
— Дамп трафика для анализа
gate-BGP# configure t
gate-BGP(config)# dump bgp ?
all Dump all BGP packets
routes-mrt Dump whole BGP routing table
updates Dump BGP updates only
Для примера
dump bgp updates /path/to/bgpdata/%Y-%m/updates.%F.%H%M 15m
Файлы можно смотреть через bgpdump.
Бонус.
Есть в интернете сервера для публичного доступа для просмотра информации о bgp (сетях, пирах, и т.д.), причём зайти туда можно абсолютно всем. На данный момент мне известны 2 из них:
— Oregon Exchange BGP Route Viewer
Что бы воспользоваться этим сервисом, зайдём telnet’ом на хост route-views.oregon-ix.net (на всякий случай ip=128.223.51.103):
$telnet route-views.oregon-ix.net
Trying 128.223.51.103...
Connected to route-views.oregon-ix.net.
Escape character is '^]'.
**********************************************************************
Oregon Exchange BGP Route Viewer
route-views.oregon-ix.net / route-views.routeviews.org
route views data is archived on http://archive.routeviews.org
This hardware is part of a grant from Cisco Systems.
Please contact help@routeviews.org if you have questions or
comments about this service, its use, or if you might be able to
contribute your view.
This router has views of the full routing tables from several ASes.
The list of ASes is documented under "Current Participants" on
http://www.routeviews.org/.
**************
route-views.routeviews.org is now using AAA for logins. Login with
username "rviews". See http://routeviews.org/aaa.html
**********************************************************************
User Access Verification
Username: rviews
route-views>sh ip bgp summ
BGP router identifier 128.223.51.103, local AS number 6447
BGP table version is 1967978231, main routing table version 1967978231
377647 network entries using 49849404 bytes of memory
11848717 path entries using 616133284 bytes of memory
1992690/68287 BGP path/bestpath attribute entries using 334771920 bytes of memory
1765106 BGP AS-PATH entries using 69691248 bytes of memory
41824 BGP community entries using 3070930 bytes of memory
102 BGP extended community entries using 7636 bytes of memory
0 BGP route-map cache entries using 0 bytes of memory
0 BGP filter-list cache entries using 0 bytes of memory
BGP using 1073524422 total bytes of memory
Dampening enabled. 2444 history paths, 7518 dampened paths
BGP activity 1805401/1417859 prefixes, 263896316/251990739 paths, scan interval 60 secs
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
4.69.184.193 4 3356 31637763 400843 1967978231 0 0 19w2d 342506
12.0.1.63 4 7018 43855030 241421 1967978231 0 0 18w4d 343339
64.71.255.61 4 812 30473083 398777 1967978231 0 0 1d07h 344459
64.125.0.137 4 6461 0 0 0 0 0 never Active
65.106.7.139 4 2828 16688405 400717 1967978231 0 0 17w0d 343788
66.59.190.221 4 6539 11957001 400799 1967978231 0 0 1d07h 344566
66.110.0.124 4 6453 21014083 1716252 1967978231 0 0 2w6d 342743
66.185.128.48 4 1668 21620316 958809 1967978231 0 0 7w2d 343108
— AT&T IP Services Route Monitor
Что бы воспользоваться этим сервисом, зайдём telnet’ом на хост route-server.ip.att.net (на всякий случай ip=12.0.1.28):
$ telnet route-server.ip.att.net
Trying 12.0.1.28...
Connected to route-server.cbbtier3.att.net.
Escape character is '^]'.
-------------- route-server.ip.att.net ---------------
--------- AT&T IP Services Route Monitor -----------
The information available through route-server.ip.att.net is offered
by AT&T's Internet engineering organization to the Internet community.
This router has the global routing table view from each of the above
routers, providing a glimpse to the Internet routing table from the
AT&T network's perspective.
This router maintains eBGP peerings with customer-facing routers
throughout the AT&T IP Services Backbone:
12.123.21.243 Atlanta, GA 12.123.133.124 Austin, TX
12.123.41.250 Cambridge, MA 12.123.5.240 Chicago,IL
12.123.17.244 Dallas, TX 12.123.139.124 Detroit, MI
12.123.37.250 Denver, CO 12.123.134.124 Houston, TX
12.123.29.249 Los Angeles, CA 12.123.1.236 New York, NY
12.123.33.249 Orlando,FL 12.123.137.124 Philadelphia, PA
12.123.142.124 Phoenix, AZ 12.123.145.124 San Diego, CA
12.123.13.241 San Francisco, CA 12.123.25.245 St. Louis, MO
12.123.45.252 Seattle, WA 12.123.9.241 Washington, DC
*** Please Note:
Ping and traceroute delay figures measured with this box are unreliable,
due to the high CPU load this box experiences when complicated "show" commands
are being executed.
For questions about this route-server, send email to: jayb@att.com
*** route-server.ip.att.net now uses AAA for logins. Login with
username "rviews".
User Access Verification
Username: Kerberos: No default realm defined for Kerberos!
rviews
route-server>sh ip bgp summ
BGP router identifier 12.0.1.28, local AS number 65000
BGP table version is 34820132, main routing table version 34820132
344917 network entries using 41734957 bytes of memory
6331570 path entries using 329241640 bytes of memory
428214/58941 BGP path/bestpath attribute entries using 59949960 bytes of memory
84247 BGP AS-PATH entries using 2208236 bytes of memory
144 BGP community entries using 3456 bytes of memory
0 BGP route-map cache entries using 0 bytes of memory
0 BGP filter-list cache entries using 0 bytes of memory
BGP using 433138249 total bytes of memory
Dampening enabled. 3042 history paths, 5269 dampened paths
BGP activity 3424190/3079272 prefixes, 87924279/81592707 paths, scan interval 60 secs
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
12.122.83.91 4 7018 5031746 610264 34820134 0 0 13w6d 61687
12.122.125.4 4 7018 5403897 1206708 34820134 0 0 1w3d 61635
12.123.1.236 4 7018 25728608 610282 34820134 0 0 13w6d 344731
12.123.5.240 4 7018 23957223 610283 34820134 0 0 13w6d 344732
12.123.9.241 4 7018 24267295 610284 34820134 0 0 13w6d 344733
12.123.13.241 4 7018 24155883 610245 34820134 0 0 13w6d 344733
12.123.17.244 4 7018 23712510 610263 34820134 0 0 16w4d 344735
12.123.21.243 4 7018 23363661 610281 34820134 0 0 13w6d 344733
12.123.25.245 4 7018 24161791 610281 34820134 0 0 13w6d 344733
12.123.29.249 4 7018 23294792 610266 34820134 0 0 13w6d 344735
12.123.33.249 4 7018 25163041 610265 34820134 0 0 13w6d 344736
12.123.37.250 4 7018 28395263 610292 34820134 0 0 16w4d 344733
12.123.41.250 4 7018 25833588 610277 34820134 0 0 16w4d 344733
12.123.45.252 4 7018 25224034 610265 34820134 0 0 13w6d 344732
12.123.133.124 4 7018 23947694 610260 34820134 0 0 6w5d 344733
12.123.134.124 4 7018 24210289 610274 34820134 0 0 16w4d 344731
12.123.137.124 4 7018 30222641 610282 34820134 0 0 13w6d 344732
12.123.139.124 4 7018 28444747 610278 34820134 0 0 10w3d 344733
12.123.142.124 4 7018 24189380 610281 34820134 0 0 13w6d 344734
12.123.145.124 4 7018 24336352 610136 34820134 0 0 8w3d 344734