First Hop Redundancy Protocols – часть 1

6a0120a85dcdae970b01287770508e970cВы построили отказоустойчивую сеть? Куда не плюнь – попадешь в STP, стэк коммутаторов, Cross Stack EtherChannel, Layer3 redundancy, SSO или еще какой дьявольский акроним? Не желаете, вдобавок, обеспечить клиентов отказоустойчивым шлюзом, чтобы поток байтов с bash.org да redtube лился no matter what и не прерывал рабочий процесс тружеников клавиатуры? Ведь способы есть и имя им Frist Hop Redundancy Protocols (FHRP).

Семейство протоколов FHRP включат в себя различные проприетарные (HSRP, GLBP, SMLT), открытые, отягощенные патентами (VRRP) и красноглазые свободные реализации (CARP). В контексте коммутаторов Cisco речь пойдет о HSRP, VRRP и GLBP протоколах.

Не смотря на то, что FHRP подразумевает отказоустойчивый шлюз (что понятно если перевести акроним дословно), проприетарные расширения HSRP способны решать другие задачи. Так, например, с помощью HSRP можно строить отказоустойчивые VPN шлюзы – http://twistedminds.ru/2012/08/cisco-ipsec-vpns-high-availability/.

Как вы знаете, для того, чтобы отправить пакет за пределы своей сети хосту необходимо знать (*) о IP адресе шлюза по умолчанию (default gateway) или next-hop’е. Соответственно все пакеты, направляемые за пределы сети должны быть направлены с DST MAC шлюза по умолчанию, а не на MAC адрес конечной станции.

* – на самом деле нет. Proxy ARP позволяет маршрутизаторам и коммутаторам отвечать на broadcast ARP запросы, сгенерированные хостом в процессе поиска адреса устройства, находящегося в другой сети. На такие запросы маршрутизатор или коммутатор, имеющий маршрут до другой сети, отвечает своим MAC адресом. Подробнее тут – http://twistedminds.ru/2012/09/default-gateway-on-different-subnet/.

Собственно весь смысл FHRP протоколов заключается в том, чтобы позволить нескольким устройствам использовать один адрес, который может быть адресом шлюза по умолчанию, обеспечивая тем самым отказоустойчивость next-hop’а для клиентов. А может и не быть.

Hot Standby Router Protocol (HSRP)

HSRP – проприетарный протокол Cisco, описанный в RFC2281 (как я понял без расширений, позволяющих организовывать Stateful IPSEC Failover). Смысл его состоит в том, что каждое из устройств, предоставляющее отказоустойчивый шлюз объединяется в HSRP группу. Таких групп может быть несколько (HSRP group 1 для ip 192.168.1.1 vlan 11, HSRP group 2 для ip 192.168.2.1 vlan 21 etc). В таких группах одно устройство выбирается как Active (и занимается непосредственной пересылкой данных), другое как Standby (и ждет гибели Active), а остальные остаются в состоянии listen. Вы можете организовывать балансировку нагрузки, делая одно устройство Active в HSRP group 1, а другое в HSRP group 2. Таких групп может быть 256 (0-255).

Номера групп значимы только на интерфейсе, иными словами вы можете создать HSRP Group 5 на SVI VLAN 20 и HSRP Group 5 на SVI Vlan 30. Устройства в группе обмениваются Hello пакетами на multicast адрес 224.0.0.2, используя UDP порт 1985.

Выборы активного маршрутизатора происходят изначально по Priority Value, которое, по умолчанию, равно 100. Устройство с наивысшим приоритетом (0-255) выигрывает. Если priority у всех устройств одинакова, то выигрывает маршрутизатор с большим IP адресом. Меняется priority так:

Switch(config-if)# standby #_group priority #_priority

Устройства, принимающие участие в создании HSRP группы проходят через несколько стадий: Disabled > Init > Listen > Speak > Standby > Active. Только standby (second best) маршрутизатор следит за hello пакетами от Active устройства. По умолчанию hello timer – 3 sec, hold – 10 sec. Если по прошествии этого времени не были получены Hello пакеты устройство объявляется мертвым, а Standby маршрутизатор перехватывает Active роль. В тот же момент следующее лучше устройство (по priority или по IP) переходит из Listen в Standby. Изменить таймеры можно так:

Switch(config-if)# standby group timers [msec] #_hello_sec [msec] #_holdtime_sec

После того, как отдавшее концы устройство возвращается к жизни, оно не перехватывает на себя роль Active, даже если его приоритет выше, чем у текущего Active. Вернуть себе заветный статус можно либо подождав пока откажет текущий Active маршрутизатор, либо настроить preemption – вытеснение:

Switch(config-if)# standby #_group preempt [delay [ minimum #_sec ] reload #_sec ]
  • Ключ minimum заставляет устройство ждать с момента пока не поднимется интерфейс. Задержка составляет от 0 до 3600 секунд.
  • Ключ reload заставляет ждать устройство c момента включения те же 0-3600 секунд.

Аутентификация HSRP

Бывает cleartext, бывает MD5. Знакомьтесь, это cleartext:

Switch(config-if)# standby #_group authentication #_string

Это MD5:

Switch(config-if)# standby #_group authentication md5 key-string #_string

Так же можно использовать цепочки ключей.

Отслеживание состояние интерфейсов

Вы можете отслеживать состояние интерфейсов, отличных от тех, которые принимают участие в формировании HSRP группы. Сделано это для того, чтобы переключить активный маршрутизатор в HSRP группе в том случае, если, к примеру, упал uplink к ядру, а коммуникации смотрящие в сторону клиентов находятся в полном порядке. Фича носит название interface tracking и настраивается так:

Switch(config-if)#standby #_group track #_interface #_priority_decrement_value

Preemption, понятное дело, должно быть настроено, в противном случае standby маршрутизатор не перехватит активную роль, не смотря на изменение приоритета.

Putting all together

hsrp demo

По легенде SwitchA и SwitchB подключены fa1/0 портами в сегмент с рабочими станциями, fa1/10 в сегмент с сервером. Требуется настроить HSRP группу с тем, чтобы default gateway 192.168.1.1 оставался доступным даже в том случае если один из коммутаторов выйдет из строя. Так же требуется производить отслеживание состояние fa1/10 интерфейсов, смотрящих в сегмент с серверами.

SwitchX(config)#int vla 1
SwitchX(config-if)# ip address 192.168.1.[2|3] 255.255.255.0
SwitchX(config-if)# standby 1 ip 192.168.1.1
SwitchX(config-if)# standby 1 preempt
SwitchX(config-if)# standby 1 authentication DERSECRET
SwitchX(config-if)# standby 1 track FastEthernet1/10

Обратите внимание на то, что в interface tracking мы не указали то, на сколько надо уменьшить приоритет. По умолчанию decrement value равно 10:

SwitchA#show standby vlan 1
Vlan1 - Group 1
  State is Active
    2 state changes, last state change 00:23:35
  Virtual IP address is 192.168.1.1
  Active virtual MAC address is 0000.0c07.ac01
    Local virtual MAC address is 0000.0c07.ac01 (v1 default)
  Hello time 3 sec, hold time 10 sec
    Next hello sent in 0.468 secs
  Authentication text "DERSECRE"
  Preemption enabled
  Active router is local
  Standby router is 192.168.1.3, priority 100 (expires in 9.472 sec)
  Priority 100 (default 100)
    Track interface FastEthernet1/10 state Up decrement 10
  IP redundancy name is "hsrp-Vl1-1" (default)

Так же имеет смысл обратить внимание на Virtual MAC address. 0000.0c07.ac означает то, что перед нами адрес HSRP группы, а последний байт отражает номер группы. В данном случае группа 1 – 01.