Заметки к CCNP Route: Path Control

Термин path control имеет множество значений. Мы производили манипуляции над путем следования пакетов с помощью фильтрации маршрутов, тэгирования и других технологий. Однако, есть еще способы, которые стоят отдельно от манипулирования протоколами динамической маршрутизации и таблицами маршрутизации – Policy-Based Routing (PBR) и IP SLA (IP Service-Level Agreement). Первая технология оказывает влияние на data plane, изменяет логику принятия решения о маршрутизации пакетов. Вторая – IP SLA – по сути является механизмом мониторинга состояния сети и позволяет принимать решения об использовании того или иного маршрута на основании неких факторов.

Policy-Based Routing

Policy-Based Routing механизм, позволяющей переопределить привычку маршрутизатора заниматься destination-based маршрутизацией. PBR перехватывает пакет до того, как маршрутизатор предпримет поиск в FIB и CEF таблицах. PBR принимает решения о маршрутизации пакета, основываясь на логике ACL и инструкциях, написанных в route map.

Отбор пакетов осуществляется как по уже вам известной команде match ip address в процессе настройке route map, так и по match lenght min max. Последняя позволяет принимать решение, основываясь на размере пакета в байтах. Если пакет прошел отбор, то следующее, что сделает маршрутизатор это спросит у route map: “а что мне с ним делать?”. Вариантов 4:

команда результат выполнения
set ip next-hop ip_addr [… ip_addr] Подсеть должна быть directly connected. Пакет будет отправлен на первый ip из списка, интерфейс, ассоциированный с которым в состоянии up/up.
set ip default next-hop ip_addr [… ip_addr] Та же логика, что и команда выше, только PBR сначала попытается принять решение на основании таблицы маршрутизации.
set interface interface [… interface] Пакет будет отправлен в первый интерфейс из списка, который находится в состоянии UP.
set default interface interface [… interface] Та же логика, что и команда выше, только PBR сначала попытается принять решение на основании таблицы маршрутизации.

Пример. Допустим у нас есть 2 пк, один из которых принадлежит славному парню (PC1), а другой сильно менее славному (PC2). Так же в наличии имеются ISP1, который хороший, годный, и ISP2, у которого вся сеть на дохлых хабах начала 90ых годов прошлого века. Оба парня в рабочее время любят заглянуть на redtube и перед нами стоит задача воздать каждому по заслугам.

CoreRouter(config)#ip access-list extended GOOD-PERVERTED-FREAK
CoreRouter(config-ext-nacl)#permit ip host 192.168.1.110 host 172.16.20.253
CoreRouter(config-ext-nacl)#exit
CoreRouter(config)#ip access-list extended BAD-PERVERTED-FREAK
CoreRouter(config-ext-nacl)#permit ip any host 172.16.20.253
CoreRouter(config)#route-map PBR-EXAMPLE
CoreRouter(config-route-map)#match ip address GOOD-PERVERTED-FREAK
CoreRouter(config-route-map)#set ip next-hop 10.10.10.2
CoreRouter(config-route-map)#route-map PBR-EXAMPLE 20
CoreRouter(config-route-map)#match ip address BAD-PERVERTED-FREAK
CoreRouter(config-route-map)#set ip next-hop 20.20.20.2
CoreRouter(config-route-map)#int fa0/1
CoreRouter(config-if)#ip policy ro PBR-EXAMPLE
*Mar 1 00:45:02.443: IP: s=192.168.1.110 (FastEthernet0/1), d=172.16.20.253, len 44, FIB policy match
*Mar 1 00:45:02.447: IP: s=192.168.1.110 (FastEthernet0/1), d=172.16.20.253, g=10.10.10.2, len 44, FIB policy routed
*Mar 1 00:45:06.215: IP: s=192.168.1.201 (FastEthernet0/1), d=172.16.20.253, len 44, FIB policy match
*Mar 1 00:45:06.219: IP: s=192.168.1.201 (FastEthernet0/1), d=172.16.20.253, g=20.20.20.2, len 44, FIB policy routed

IP SLA

IP Service Level Agreement технология, позволяющая отслеживать состоянии сети. В старой литературе она носит название RTR – Responce Time Reporter. IP SLA использует концепцию процессов. Каждый процесс описывает тип генерируемого маршрутизатором пакета, адрес отправителя, получателя и некоторые другие характеристики. Так же в момент настройки процесса мониторинга следует указать время начала, длительность и частоту проб. IP SLA может оперировать в нескольких режимах, отправляя различные виды пробных сообщений, на основании которых будут предприниматься те или иные решения:

  • ICMP (echo, jitter)
  • RTP (VoIP)
  • TCP (3-way handshake), UDP (echo, jitter)
  • DNS
  • DHCP
  • HTTP
  • FTP

и так далее. С полным списком процессов и возможных проб можно ознакомится тут.

В качестве целей для проб могут выступать как другие маршрутизаторы, так и обычные сервера. К примеру маршрутизатор-инициатор проб может даже отправлять HTTP GET запросы и ожидать на них ответа.

Настройка состоит из 4х простых шагов:

шаг действие
1 Создать процесс IP SLA: ip sla monitor #_id
2 Указать тип процесса и его параметры. Например для ICMP echo запросов вам следует указать адрес или hostname отправителя, адрес или hostname получателя.
3 Опционально можно изменить частоту отправки проб с значения по умолчанию, используя команду frequency seconds.
4 Ну и в конце осталось создать расписание: ip sla monitor schedule #_id [ life (forever | seconds ) ] [ start-time (hh:mm:ss) | pending | now | after (hh:mm:ss) ] [ ageout seconds ] [ recurring ] в режиме глобальной конфигурации.

Посмотреть текущую конфигурация процессов ip sla можно с помощью команды show ip sla monitor configuration, а статистику – show ip sla monitor statistics.

Отслеживание IP SLA процессов

Сами по себе пробы нам не очень интересны, а интересно отслеживать успешность тех или иных действий и на основании этого принимать какие-либо решения. Например использование статического маршрута или PBR. Механизм отслеживание IP SLA смотрит на последний статус пробы (return code) и на основе этого принимает решение о состоянии пробы этого процесса (up/down).

Настройка отслеживания IP SLA для статических маршрутов

шаг действие
1 Настроить процесс слежения за IP SLA, используя команду track track_id rtr sla_id [ state | reachability ] *
2 Опционально можно настроить задержку возврата к предыдущему состоянию, указав значение в секундах командой delay ( down seconds | up seconds ) **
3 Настроить статический маршрут, указав id процесса слежения: ip route network mask [ interface | next-hop ] track track_id

* судя по этому документу разница между state и reachability заключается в том, что reachability возвращает статус up для процесса отслеживания IP SLA даже если значение для, скажем, jitter, превышает пороговое.
** есть механизм предотвращения возвращения маршрута в таблицу маршутизации при route flapping, когда путь становится то доступен, то недоступен.

Настройка отслеживания IP SLA для PBR

Происходит с использованием дополнительного ключа verify-availablitiy в процессе установки следующего хопа: set ip next-hop verifiy-availability ip_addr track track_id.

Если процесс отслеживания получает статус “down”, то PBR начинает работать так, как будто не существует утверждения set ip next-hop… Маршрутизатор будет пробовать отправить пакет так, как если бы PBR не существовало.

Вернемся к нашей схеме, использованной в теме про PBR и настроим IP SLA для мониторинга доступности интернетов через двух наших провайдеров. Объектом для мониторинга будет выступать webserver. В реальной жизни я использую адреса корневых DNS серверов.

CoreRouter#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
CoreRouter(config)#no ip sla monitor 10
CoreRouter(config)#ip sla monitor 10
CoreRouter(config-sla-monitor)#type echo protocol ipIcmpEcho 172.16.20.253 source-ipaddr 10.10.10.1
CoreRouter(config-sla-monitor-echo)# frequency 5
CoreRouter(config-sla-monitor-echo)# ip sla monitor schedule 10 life forever start-time now
CoreRouter(config)#ip sla monitor 20
CoreRouter(config-sla-monitor)#$172.16.20.253 source-ipaddr 20.20.20.1
CoreRouter(config-sla-monitor-echo)# frequency 5
CoreRouter(config-sla-monitor-echo)# ip sla monitor schedule 20 life forever start-time now
CoreRouter(config)#track 1 rtr 10 state
CoreRouter(config-track)# delay down 20 up 20
CoreRouter(config-track)#track 2 rtr 20 reachability
CoreRouter(config-track)# delay down 20 up 20
CoreRouter(config-track)#exit
CoreRouter(config)#ip route 0.0.0.0 0.0.0.0 10.10.10.2 track 1
CoreRouter(config)#ip route 0.0.0.0 0.0.0.0 20.20.20.2 track 2

Теперь если путь до webserver с IP 172.16.20.253 через, скажем, ISP2 окажется недоступен, вы получите в логе сообщение

*Mar  1 03:39:53.643: %TRACKING-5-STATE: 2 rtr 20 reachability Up->Down

а маршрут по умолчанию до ISP2 будет убран из таблицы маршрутизации. Как только webserver станет снова доступен через ISP2 все вернется взад с соответствующим оповещением:

*Mar  1 03:45:08.647: %TRACKING-5-STATE: 2 rtr 20 reachability Down->Up