Резервирование каналов в CISCO
В дополнение к недавней заметке про резервирование каналов на сервере под управлением FreeBSD, выкладываю решение такой же задачи с использованием одного пограничного маршрутизатора (cisco 2821) с двумя каналами, подключённого к различным провайдерам без балансировки нагрузки (без PBR – policy based routing). |
Схема коммутации предельно проста. На ней видны все исходные данные:
Шлюз по умолчанию, выданный нам основным провайдером: 172.16.0.2, вспомогательным — 10.10.0.2.
Сперва настроим трансляцию адресов (nat) внутренней сети в выданный адрес каждого из провайдеров:
interface GigabitEthernet0/1.1 description INTERNET1 encapsulation dot1Q 172 ip address 172.16.0.1 255.255.255.252 ip nat outside ! interface GigabitEthernet0/1.2 description INTERNET2 encapsulation dot1Q 10 ip address 10.10.0.1 255.255.255.252 ip nat outside ! interface GigabitEthernet0/0 description LOCALNET ip address 192.168.0.1 255.255.255.0 ip nat inside
В списке доступа для трансляции адресов будет фигурировать только наша локальная сеть:
ip access-list extended acl_nat permit ip 192.168.0.0 0.0.0.255 any deny ip any any
Теперь необходимо настроить роутинги. Сперва – route-map для правил трансляции через каждого из провайдеров:
route-map ISP1 permit 10 match ip address acl_nat match interface GigabitEthernet0/1.1 ! route-map ISP2 permit 10 match ip address acl_nat match interface GigabitEthernet0/1.2
И два статических роутинга до нескольких постоянно работающих в сети интернет хостов (мной выбраны два – dns Google и Яндекса) через шлюз по умолчанию основного провайдера:
ip route 8.8.8.8 255.255.255.255 172.16.0.2 ip route 77.88.8.8 255.255.255.255 172.16.0.2
Мы будем проверять доступность этих выбранных хостов через канал основного провайдера.
Теперь настраиваем правила динамической трансляции адресов внутренней сети через каждый из внешних адресов:
ip nat inside source route-map ISP1 interface GigabitEthernet0/1.1 overload ip nat inside source route-map ISP2 interface GigabitEthernet0/1.2 overload
Впоследствии вам может понадобится настройка статической трансляции (например — для доступности почтового сервера с каждого из этих внешних ip). Делается это следующим образом:
ip nat inside source static tcp 192.168.0.2 25 172.16.0.1 25 route-map ISP1 extendable ip nat inside source static tcp 192.168.0.2 25 10.10.0.1 25 route-map ISP2 extendable
Где 192.168.0.2
внутренний ip вашего почтового сервера.
Не забудьте при этом прописать во внешнем dns эти два адреса примерно следующим образом (в части касающейся):
IN MX 10 mx1.domain.ru. IN MX 20 mx2.domain.ru. mx1 IN A 172.16.0.1 mx2 IN A 10.10.0.1 mail CNAME mx1.domain.ru.
Время жизни (ttl) лучше выставить поменьше, чтобы после переключения на вспомогательного провайдера почта к вам не терялась — $TTL 600 ; 10 min
.
Теперь воспользуемся инструментом IP SLA (IP Service Level Agreements) для мониторинга доступности выбранных нами хостов в сети интернет посредством обычного ping:
ip sla 1 icmp-echo 8.8.8.8 source-interface GigabitEthernet0/1.1 timeout 1500 threshold 1000 frequency 3 ip sla schedule 1 life forever start-time now ! ip sla 2 icmp-echo 77.88.8.8 source-interface GigabitEthernet0/1.1 timeout 1500 threshold 1000 frequency 3 ip sla schedule 2 life forever start-time now
где:
- threshold — устанавливает верхнее пороговое значение для измерения RTT (round-trip time), в ms;
- timeout — период времени, который cisco ожидает ответ на пакеты icmp, в ms;
- frequency — частота отправки тестовых пакетов, в сек.
Рекомендации Cisco по настройке данных параметров: (frequency seconds) > (timeout milliseconds) > (threshold milliseconds).
Командой ip sla schedule
мы запускаем каждый из этих двух тестов.
Теперь необходимо настроить track
— enhanced object tracking, очень удобная функция IOS, позволяющая отслуживать состояние выбранного объекта, в нашем случае — результатом iсmp ответа от хостов в интернете. Делается это следующим образом:
track 10 ip sla 1 reachability ! track 20 ip sla 2 reachability
Каждый из track отслеживает свой ping тест. Для принятия окончательного решения о “падении” канала связи основного провайдера настроим суммарный track, который будет UP в случае, если хотя бы один из track 10 и track 20 будет находится в состоянии UP:
track 50 list boolean or object 10 object 20 delay down 10 up 5
Параметр delay необходим для того, чтобы суммарный track 50 переходил в состояние DOWN с задержкой. Иначе, как только пропадет хотя бы один пакет icmp в двух тестах одновременно, track 50 перейдет в состояние DOWN. Параметр delay необходимо настраивать в соответствии с частотой отправки icmp-запросов (эту частоту мы обозначили в 3 секунды при настройке ip sla — параметр frequency). Задержка на переход в состояние DOWN мы выставили в 10 секунд. Иначе говоря, track 50 перейдет в состояние DOWN только если все тесты перестали получать ответы. Аналогично с переходом в состояние UP.
Наконец, нам осталось прописать статические маршруты. Первый — через основного провайдера с проверкой доступности через суммарный track 50. Второй — через вспомогательного провайдера:
ip route 0.0.0.0 0.0.0.0 172.16.0.2 10 track 50 ip route 0.0.0.0 0.0.0.0 10.10.0.2 20
Теперь, чтобы всё было “красиво”, необходимо решить проблему с подвисшими сессиями трансляции адресов при переключении между провайдерами. Конечно мы можем изменить значения по умолчанию время жизни трансляций (tcp, udp, dns и т.д.) (которые равны 24 часам), но это может привести к лишним разрывам сессий. Просто для примера (все значения в секундах):
ip nat translation timeout 120 ip nat translation tcp-timeout 3600 ip nat translation udp-timeout 120 ip nat translation finrst-timeout 10 ip nat translation syn-timeout 30 ip nat translation dns-timeout 30
Мы же этого воспользуемся EEM (embedded event manager). Им мы привяжем некоторые действия к изменению состояния наших track. А именно: каждый раз будем очищать динамические трансляции и записывать в syslog сообщения об этих изменениях:
event manager applet ISP1_UP event track 50 state up action 001 cli command "enable" action 002 cli command "clear ip nat translation *" action 003 syslog msg "ISP1 is UP" ! event manager applet ISP1_DOWN event track 50 state down action 001 cli command "enable" action 002 cli command "clear ip nat translation *" action 003 syslog msg "ISP1 is DOWN"
Проверка наших настроек осуществляется следующими способами:
Проверка работы nat:
#show ip nat statistics Total active translations: 4124 (18 static, 4106 dynamic; 4124 extended) Peak translations: 7948, occurred 7w0d ago Outside interfaces: GigabitEthernet0/1.1, GigabitEthernet0/1.2 Inside interfaces: GigabitEthernet0/0 Hits: 701166430 Misses: 0 CEF Translated packets: 661219902, CEF Punted packets: 37061815 Expired translations: 34376630 Dynamic mappings: -- Inside Source [Id: 1] route-map ISP1 interface GigabitEthernet0/1.1 refcount 661 [Id: 2] route-map ISP2 interface GigabitEthernet0/1.2 refcount 0 Total doors: 0 Appl doors: 0 Normal doors: 0 Queued Packets: 0
#show ip nat translations Pro Inside global Inside local Outside local Outside global
Проверка route-map:
#show route-map route-map ISP1, permit, sequence 10 Match clauses: ip address (access-lists): acl_nat interface GigabitEthernet0/1.1 Set clauses: Policy routing matches: 0 packets, 0 bytes route-map ISP2, permit, sequence 10 Match clauses: ip address (access-lists): acl_nat interface GigabitEthernet0/1.2 Set clauses: Policy routing matches: 0 packets, 0 bytes
Проверка ip sla:
#show ip sla statistics details IPSLAs Latest Operation Statistics IPSLA operation id: 1 Type of operation: icmp-echo Latest RTT: 1 milliseconds Latest operation start time: 16:11:59.575 MSK Wed Nov 30 2016 Latest operation return code: OK Over thresholds occurred: FALSE Number of successes: 857 Number of failures: 0 Operation time to live: Forever Operational state of entry: Active Last time this entry was reset: Never IPSLA operation id: 2 Type of operation: icmp-echo Latest RTT: 1 milliseconds Latest operation start time: 16:11:59.575 MSK Wed Nov 30 2016 Latest operation return code: OK Over thresholds occurred: FALSE Number of successes: 857 Number of failures: 0 Operation time to live: Forever Operational state of entry: Active Last time this entry was reset: Never
Проверка track:
#show track Track 10 IP SLA 1 reachability Reachability is Up 172 changes, last change 23:09:02 Latest operation return code: OK Latest RTT (millisecs) 1 Tracked by: Track-list 50 Track 20 IP SLA 2 reachability Reachability is Up 162 changes, last change 14:39:51 Latest operation return code: OK Latest RTT (millisecs) 1 Tracked by: Track-list 50 Track 50 List boolean or Boolean OR is Up 32 changes, last change 5d02h object 10 Up object 20 Up Delay up 5 secs, down 10 secs Tracked by: STATIC-IP-ROUTING 0 EEM applet ISP1_DOWN EEM applet ISP1_UP
Проверка EEM:
#sh event manager policy registered No. Class Type Event Type Trap Time Registered Name 1 applet user track Off Fri Sep 30 08:27:21 2016 ISP1_UP track 50 state up maxrun 20.000 action 001 cli command "enable" action 002 cli command "clear ip nat translation *" action 003 syslog msg "ISP1 is UP" 2 applet user track Off Fri Sep 30 08:27:21 2016 ISP2_DOWN track 50 state down maxrun 20.000 action 001 cli command "enable" action 002 cli command "clear ip nat translation *" action 003 syslog msg "ISP1 is DOWN"
Вот, в принципе, и всё. В заключении привожу листинг проделанной работы:
! version 12.4 ! hostname cisco ! track 10 ip sla 1 reachability ! track 20 ip sla 2 reachability ! track 50 list boolean or object 10 object 20 delay down 10 up 5 ! interface GigabitEthernet0/1.1 description INTERNET1 encapsulation dot1Q 172 ip address 172.16.0.1 255.255.255.252 ip nat outside ! interface GigabitEthernet0/1.2 description INTERNET2 encapsulation dot1Q 10 ip address 10.10.0.1 255.255.255.252 ip nat outside ! interface GigabitEthernet0/0 description LOCALNET ip address 192.168.0.1 255.255.255.0 ip nat inside ! ip route 0.0.0.0 0.0.0.0 172.16.0.2 10 track 50 ip route 0.0.0.0 0.0.0.0 10.10.0.2 20 ip route 8.8.8.8 255.255.255.255 172.16.0.2 ip route 77.88.8.8 255.255.255.255 172.16.0.2 ! ip nat inside source route-map ISP1 interface GigabitEthernet0/1.1 overload ip nat inside source route-map ISP2 interface GigabitEthernet0/1.2 overload ip nat inside source static tcp 192.168.0.2 25 172.16.0.1 25 route-map ISP1 extendable ip nat inside source static tcp 192.168.0.2 25 10.10.0.1 25 route-map ISP2 extendable ! ip access-list extended acl_nat permit ip 192.168.0.0 0.0.0.255 any deny ip any any ! ip sla 1 icmp-echo 8.8.8.8 source-interface GigabitEthernet0/1.1 timeout 1500 threshold 1000 frequency 3 ip sla schedule 1 life forever start-time now ip sla 2 icmp-echo 77.88.8.8 source-interface GigabitEthernet0/1.1 timeout 1500 threshold 1000 frequency 3 ip sla schedule 2 life forever start-time now ! route-map ISP1 permit 10 match ip address acl_nat match interface GigabitEthernet0/1.1 ! route-map ISP2 permit 10 match ip address acl_nat match interface GigabitEthernet0/1.2 ! event manager applet ISP1_UP event track 50 state up action 001 cli command "enable" action 002 cli command "clear ip nat translation *" action 003 syslog msg "ISP1 is UP" ! event manager applet ISP1_DOWN event track 50 state down action 001 cli command "enable" action 002 cli command "clear ip nat translation *" action 003 syslog msg "ISP1 is DOWN"
Спасибо. Очень помогли!
Спасибо большое! Рабочая схема.