Страницы

2015-07-01

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 минут, а при частых повторах подобных флапов и на несколько часов исключить одну автономную систему, чем нарушить работу сети в целом.



копипаст с  hilik.org.ua что бы не потерялось

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

Отправить комментарий