BGP — route-map, as-path, prefix-list. Управляем анонсами.
С точки зрения BGP интернет представляет из себя совокупность автономных систем взаимодействующих между собой. При этом можно разделить два вида автономных систем, это транзитные, через которые проходит путь к другим автономным системам и тупиковые, которые только принимают маршруты, но не ретранслируют маршруты к другим автономным системам. Как мы уже говорили, все маршруты которые приходят от партнеров по BGP, будут, по умолчанию, переданы и другим партнерам. Но если у вас тупиковая автономная система, предоставляющая доступ к интернет своим клиентам в своем адресном пространстве, то анонсы пришедшие от внешних автономных систем передавать не нужно, для этого нужно используя директиву route-map установить фильтр на исходящие анонсы используя директиву as-path.
Подключение будет теперь выглядеть так:
Согласно схемы наша автономная система AS65535 настроена на маршрутизаторе Router A и он будет анонсировать сеть 192.168.1.0/24 и принимать full-view от Router B AS65534 и default от Router C. Такая схема позволяет нам использовать Router B как приоритетный канал, а на Router C пойдет трафик в случае аварии на канале к Router B, то есть канал на Router C является резервным каналом. В Router B и Router C мы анонсируем только свою автономную систему AS65535 и сеть 192.168.1.0/24
Для начала мы просто поднимем 2 сессии и анонсируем сети, исходя из этого настройки на маршрутизаторе Router A будут такие:
router bgp 65535 bgp router-id 192.168.0.1 network 192.168.1.0/24 neighbor 192.168.0.2 remote-as 65533 neighbor 192.168.0.2 soft-reconfiguration inbound neighbor 192.168.0.6 remote-as 65534 neighbor 192.168.0.6 soft-reconfiguration inbound |
У нас добавился второй bgp партнер.
На Router B будет вот такая конфигурация:
router bgp 65534 bgp router-id 192.168.0.2 network 192.168.2.0/24 network 192.168.3.0/24 network 192.168.4.0/24 network 192.168.5.0/24 network 192.168.6.0/24 network 192.168.7.0/24 network 192.168.8.0/24 network 192.168.9.0/24 network 192.168.10.0/24 network 192.168.11.0/24 network 192.168.12.0/24 neighbor 192.168.0.1 remote-as 65535 neighbor 192.168.0.1 default-originate neighbor 192.168.0.1 soft-reconfiguration inbound |
Удаленный маршрутизатор вам не прийдется в реальных условиях настраивать, но тут я должен привести настройку этого, удаленного маршрутизатора, для того, чтобы было понятно что происходит. А происходит тут вот что, удаленный маршрутизатор(по условиям задачи мы администрируем автономную систему AS65535, и приведены настройки удаленного по отношению к нашей автономке маршрутизатора) анонсирует нам ряд сетей, на самом деле, в реальной жизни, тут описывваются только свои сетки, а те анонсы которые передаются партнерам приходят тоже по bgp и анонсируем маршрут по умолчанию.
Настройки маршрутизатора Router C такие:
router bgp 65533 bgp router-id 192.168.0.6 network 192.168.2.0/24 network 192.168.3.0/24 network 192.168.4.0/24 network 192.168.5.0/24 network 192.168.6.0/24 network 192.168.7.0/24 network 192.168.8.0/24 network 192.168.9.0/24 network 192.168.10.0/24 neighbor 192.168.0.1 remote-as 65535 neighbor 192.168.0.1 default-originate neighbor 192.168.0.1 soft-reconfiguration inbound |
Тут мы анонсируем тоже несколько сетей, я умышленно анонсировал несколько меньше, чем на Router B сетей и default.
Сессии установились и вроде бы все хорошо, но в этой ситуации во первых мы не контролируем исход трафика, таблица маршрутов по bgp выглядит так:
B>* 0.0.0.0/0 [20/0] via 192.168.0.1, em0, 00:28:28 B>* 192.168.2.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.3.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.4.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.5.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.6.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.7.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.8.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.9.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.10.0/24 [20/0] via 192.168.0.1, em0, 00:28:27 B>* 192.168.11.0/24 [20/0] via 192.168.0.6, em0, 00:15:56 B>* 192.168.12.0/24 [20/0] via 192.168.0.6, em0, 00:15:56 |
мы видим часть сетей через один маршрутизатор, часть сетей, анонсы которых отсутствуют на Router C видны через Router B и что самое неприятное эта ситуация может поменяться в любой момент по решению маршрутизатора. То есть если произойдет любой сбой, маршрутизатор выкенет анонсы через один роутер и развернется на второй и будет гнать через него трафик пока не произойдет следующий сбой на текущем роутере. Идеологически это правильно, но с практической стороны часто не приемлемо. Начнем с того, что применим фильтр на default, со стороны наших партнеров AS65534 и AS65533 править не надо, а нам нужно сделать два prefix-listа, один для основного канала, по нему мы запретим прием deault, то есть примем префиксы и для резервного канала, по нему мы разрешим прием только default.
Для этого выполним во vtysh такие команды:
vtysh configure terminal ip prefix-list DEFAULT-IN-PERMIT seq 5 permit 0.0.0.0/0 ip prefix-list DEFAULT-IN-DENY seq 5 deny 0.0.0.0/0 ip prefix-list DEFAULT-IN-DENY seq 10 permit any |
первый префикс лист DEFAULT-IN-PERMIT — разрешающий прием дефаулта и второй DEFAULT-IN-DENY — запрещающий. За запрет отвечает слово deny, а за разрешение соответсвенно permit.
А теперь назначим каждому из neighborов свой префикс лист. Для этого в командной строке vtysh выполним такие команды:
configure terminal router bgp 65535 neighbor 192.168.0.6 prefix-list DEFAULT-IN-PERMIT in neighbor 192.168.0.94 prefix-list DEFAULT-IN-DENY in |
После добавления префикс листов, ничего не поменяется, нужно отдать команду quagga на перечитку префикcов neighborов, а именно нужно выполнить команды:
clear ip bgp 192.168.0.2 soft in clear ip bgp 192.168.0.6 soft in |
Теперь таблица маршрутов будет выглядеть так:
B>* 0.0.0.0/0 [20/0] via 192.168.0.6, em0, 1d00h18m B>* 192.168.2.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.3.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.4.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.5.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.6.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.7.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.8.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.9.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.10.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.11.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 B>* 192.168.12.0/24 [20/0] via 192.168.0.2, em0, 00:00:06 |
С префиксами у нас все замечательно, но есть один нюанс, который не виден на нашей quagga, зато замечательно виден на Router C, я специально для иллюстрации этой ситуации на Router B для анонсов сделал несколько больше префиксов, и вот таблица роутинга на Router C будет выглядеть так:
show ip route bgp B>* 192.168.11.0/24 [20/0] via 192.168.0.2, em0, 00:10:51 B>* 192.168.12.0/24 [20/0] via 192.168.0.2, em0, 00:10:51 |
А в sh ip bgp мы видим такую картину:
show ip bgp BGP table version is 0, local router ID is 192.168.0.6 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.1.0 192.168.0.1 0 0 65535 i * 192.168.2.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i * 192.168.3.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i * 192.168.4.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i * 192.168.5.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i * 192.168.6.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i * 192.168.7.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i * 192.168.8.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i * 192.168.9.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i * 192.168.10.0 192.168.0.2 0 65535 65534 i *> 0.0.0.0 0 32768 i *> 192.168.11.0 192.168.0.2 0 65535 65534 i *> 192.168.12.0 192.168.0.2 0 65535 65534 i Total number of prefixes 12 |
Пришли анонсы сетей от 192.168.0.2, и это значит что AS65535 стала транзитной AS, через нее проходят маршруты к сторонним автономным системам. В свзя с этим, нужно запретить транслировать нейджборам анонсы чужих автономных систем. Для этого воспользуемся route-map и as-path. Настройки будем делать так:
vtysh
configure terminal
ip as-path access-list ME-OUT permit ^$ |
Это мы определили регексп ^$ — он означает локальный AS, точнее AS у которого отсутствует AS-path.
А теперь этот ip as-path припишем к route-map, route-map этот атрибут в дальнейшем приписывается к партнеру(neighbor) и позволяет управлять исходящими и входящими анонсами по различным критериям, в нашем случае критерием является AS-path попадающий под наш регексп. Определим route-map:
vtysh configure terminal route-map ME-OUT match as-path ME-OUT |
То что имена у меня и AS-path и route-map совпали ничего собственно не значат — они могут быть разные, просто мне так удобней. и теперь приписываем route-map к neighbor:
vtysh
configure terminal
router bgp 65535
neighbor 192.168.0.2 route-map ME-OUT out
neighbor 192.168.0.6 route-map ME-OUT out |
и теперь заставим наш bgp router передавать правильные анонсы:
clear ip bgp 192.168.0.2 soft out clear ip bgp 192.168.0.6 soft out |
И смотрим что приходит на Router B:
B>* 192.168.1.0/24 [20/0] via 192.168.0.1, em0, 00:45:56 |
и на Router C:
B>* 192.168.1.0/24 [20/0] via 192.168.0.1, em0, 00:47:33 |
И проверим анонсы:
На Router B:
show ip bgp BGP table version is 0, local router ID is 192.168.0.6 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.1.0 192.168.0.1 0 0 65535 i *> 192.168.2.0 0.0.0.0 0 32768 i *> 192.168.3.0 0.0.0.0 0 32768 i *> 192.168.4.0 0.0.0.0 0 32768 i *> 192.168.5.0 0.0.0.0 0 32768 i *> 192.168.6.0 0.0.0.0 0 32768 i *> 192.168.7.0 0.0.0.0 0 32768 i *> 192.168.8.0 0.0.0.0 0 32768 i *> 192.168.9.0 0.0.0.0 0 32768 i *> 192.168.10.0 0.0.0.0 0 32768 i Total number of prefixes 10 |
и на Router C:
show ip bgp BGP table version is 0, local router ID is 192.168.0.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.1.0 192.168.0.1 0 0 65535 i *> 192.168.2.0 0.0.0.0 0 32768 i *> 192.168.3.0 0.0.0.0 0 32768 i *> 192.168.4.0 0.0.0.0 0 32768 i *> 192.168.5.0 0.0.0.0 0 32768 i *> 192.168.6.0 0.0.0.0 0 32768 i *> 192.168.7.0 0.0.0.0 0 32768 i *> 192.168.8.0 0.0.0.0 0 32768 i *> 192.168.9.0 0.0.0.0 0 32768 i *> 192.168.10.0 0.0.0.0 0 32768 i *> 192.168.11.0 0.0.0.0 0 32768 i *> 192.168.12.0 0.0.0.0 0 32768 i Total number of prefixes 12 |
Все настроено правильно, полная конфигурация нашего bgp роутера выглядит так:
! router bgp 65535 bgp router-id 192.168.0.1 network 192.168.1.0/24 neighbor 192.168.0.6 remote-as 65533 neighbor 192.168.0.6 soft-reconfiguration inbound neighbor 192.168.0.6 prefix-list DEFAULT-IN-PERMIT in neighbor 192.168.0.6 route-map ME-OUT out neighbor 192.168.0.2 remote-as 65534 neighbor 192.168.0.2 soft-reconfiguration inbound neighbor 192.168.0.2 prefix-list DEFAULT-IN-DENY in neighbor 192.168.0.2 route-map ME-OUT out ! ip prefix-list DEFAULT-IN seq 5 permit 0.0.0.0/0 ip prefix-list DEFAULT-IN-DENY seq 5 deny 0.0.0.0/0 ip prefix-list DEFAULT-IN-DENY seq 10 permit any ip prefix-list DEFAULT-IN-PERMIT seq 5 permit 0.0.0.0/0 ! ip as-path access-list ME-OUT permit ^$ ! route-map ME-OUT permit 10 match as-path ME-OUT ! |
Это вполне работоспособная схема, подходящая для мелкого провайдера или небольшой частной конторы, которой нет необходимости гибко балансировать трафик и ретранслировать анонсы сторонних AS.
Еще следует помнить, что clear ip bgp вызывает обрыв bgp сессии, частые обрывы bgp сессии влекут за собой санкции, так называемы penalty и временное исключение AS из ретрансляции. Вызваны такие меры тем, что при каждом изменении анонсов AS, всем маршрутизаторам приходится пересчитывать маршруты, что на магистральных маршрутизаторах может вызывать излишнюю нагрузку и нарушать работу всей сети в целом, поэтому проще временно, на 10-20 минут, а при частых повторах подобных флапов и на несколько часов исключить одну автономную систему, чем нарушить работу сети в целом.