В данной статье мне хотелось бы рассмотреть настройку маршрутизатора cisco на предоставление доступа в Интернет по двум канаkам от разных провайдеров, с возможностью автоматического переключения, в случае отказа одного из каналов.
Итак, исходные данные:
- Cisco 871 K9 с IOS Advanced IP Services (необходимо иметь именно эту версию IOS, так как у данного маршрутизатора в других версиях включена поддержка только одного VLAN’а, а нам нужно как минимум два)
- Два провайдера в интернет, предоставляющие нам доступ по технологии Ethernet
- Множество клиентов, потребителей Интернет, имеющие каждый свою сеть, вида10.10.x.0/24, где наш маршрутизатор имеет адрес 10.10.x.1
- Часть клиентов будет получать доступ в сеть через одного провайдера, другая чать – через другого. При “падении” одного из провайдеров, все клиенты будут работать через оставшегося
Почему именно такие условия? Во-первых была поставлена именно такая задача, а я стараюсь в этом блоге описывать не какие-то условные задачи, а предалагать решения на основе своей практики. Во-вторых, такая схема намного удобнее простой балансировки нагрузки, так как балансировка основывается, как правило, на соединениях (то есть каждое отдельное соединение клиент-сервер обслуживается по отдельному каналу), что создает ряд проблем. Однако намного проще и правильнее, когда сетевой администратор может, на основе имеющихся данных по среднему потреблению трафика каким-либо клиентом, распределить между провайдрами нагрузку действительно равномерно.
Первоначальная настройка интерфейсов
Для простоты описания возьмем следующую топологию нашей сети:
- Все клиенты включены в один коммутатор (switch), который в свою очередь подключен к порту fe3 на маршрутизаторе cisco. На данном порте мы настроим vlan1, который является vlan’ом по умолчанию. На данном интерфейсе у нас будут настроены адреса10.10.x.1/24, где x – значение от 1 до 4. Первые две сети, мы будем пускать через первого провайдера, а вторые две, соответственно, через второго.
- Первый провайдер, назовем его FirstTelecom, подключен у нас на WAN порт cisco, то есть на порт fe4. Данный порт предоставляет нам level3, так что использование vlan не понадобится. Будем считать, что провайдер выдал нам адрес 91.100.100.146/29. Адрес шлюза первого провайдера 91.100.100.145
- Второй провайдер, назовем его SecondTelecom, подключен на порт fe0, но данный порт у нашей модели cisco предоставляет нам только level2, так что придется использовать vlan под номером 2, чтобы иметь возможность назначить ip адрес на данном интерфейсе. Будем считать, что провайдер выделил нам адрес 91.1.11.117/27. Адрес шлюза второго провайдера 91.1.11.97
Заходим на cisco, включаем режим enable (привелегированный режим, аналогично пользователю root в linux) и переходим в режим конфигурации
cisco#enable cisco#configure terminal Enter configuration commands, one per line. End with CNTL/Z. cisco(config)#
Настраиваем интерфейс Fast Ethernet 4 (WAN):
cisco(config)# interface Fast Ethernet 4 cisco(config-if)# description FirstTelecom cisco(config-if)# ip address 91.100.100.146 255.255.255.248 cisco(config-if)# ip nat outside cisco(config-if)# ip nat enable cisco(config-if)# no shutdown
Директивы интуитивно понятны, но на всякий случай рассмотрим их подробнее:
- description - добавляет текстовое описание к интерфейсу. Логической нагрузки не несет – просто для удобства
- ip address - устанавливает на данном интерфейсе ip-адрес
- ip nat outside - говорит cisco, что это внешняя сторона NAT, то есть на этом интерфейсе происходит преобразование NAT из публичных ip-адресов в приватные. Другими словами – это наш внешний интерфейс.
- ip nat enable - включает NAT на этом интерфейсе
- no shutdown - “подымает” интерфейс. Опция shutdown по умолчанию включена, так что если вы хотите включить интерфейс, вам надо ввести no shutdown.
Теперь нам нужно настроить интерфейс для второго провайдера, но как мы помним, level3 интерфейс у нас всего 1, так что нам нужно будет настроить vlan и “завернуть” его на нужный нам интерфейс.
Для начала нам надо добавить в конфигурацию VLAN 2 (vlan 1 – это vlan по умолчанию и он уже создан). Для этого выходим в коммандный режим (мы ведь находимся в режиме configure terminal), это можно сделать набрав exit, или нажав комбинацию клавиш Ctrl + C. Итак, добавляем VLAN:
cisco# vlan database cisco(vlan)#vlan 2 VLAN 2 modified: cisco(vlan)#exit cisco#
После чего настройка vlan’а аналогична настройке обычного интерфейса:
cisco# configure terminal cisco(config)# interface vlan 2 cisco(config-if)# description SecondTelecom cisco(config-if)# ip address 91.1.11.117 255.255.255.224 cisco(config-if)# ip nat outside cisco(config-if)# ip nat enable cisco(config-if)# no shutdown
Теперь нам нужно “привязать” наш vlan к физическому порту на cisco. Мы договорились, что будем включать нашего второго провайдера в fe0. Делается это так:
cisco# configure terminal cisco(config)# interface fast ethernet 0 cisco(config-if)# switch port access vlan 2 cisco(config-if)# no shutdown
По сути всего одна директива, которая вполне понятна и без описания. Но есть еще один немаловажный момент, с которым я в свое время очень долго мучался и перерыл кучу документации на официальном сайте cisco. Суть вот в чем: когда я первый раз настроил vlan на cisco и назначил ему адреса я попробовал с cisco пропинговать свой шлюз, но он никак не хотел пинговаться. Оказывается vlan у меня включался в режим trank, а провайдер мне давал обычный ethernet линк и вообще мало подозревал о том, что я хожу в Интернет из-за cisco. Так что нам, чтобы не наступать на эти же грабли надо в режиме конфигурации ввести следующую директиву:
cisco(config)# no spanning-tree vlan 2
Ну и наконец настроим vlan по умолчанию, то есть vlan1. Его особенность в том, что он срабатывает на всех интерфейсах кроме WAN, если на них нет директивы switchport, так что на физическом интерфейсе vlan “привязывать” при помощи switchport не нужно. Просто настраиваем интерфейс аналогично предыдущим:
cisco# configure terminal cisco(config)# interface vlan 1 cisco(config-if)# description LAN cisco(config-if)# ip address 10.10.1.1 255.255.255.0 cisco(config-if)# ip address 10.10.2.1 255.255.255.0 secondary cisco(config-if)# ip address 10.10.3.1 255.255.255.0 secondary cisco(config-if)# ip address 10.10.4.1 255.255.255.0 secondary cisco(config-if)# ip nat inside cisco(config-if)# ip nat enable cisco(config-if)# no shutdown cisco(config-if)# ip policy route-map RouteSelect
Как вы видите конфигурация немного отличается, а именно: изменилась директива ip nat inside и добавилась директива ip policy route-map RouteSelect.
ip nat inside говорит нашему маршрутизатору, что на этом интерфейсе внутренняя сторона NAT, то есть здесь происходит преобразтование из приватных адресов в публичные. Другими словами -это наш внутренний интерфейс
ip policy route-map RouteSelect говорит о том, что маршрутизация на данном интерфейсе будет производиться не по общим правилам, а с использованием route-map (карта маршрутов) с именем RouteSelect (имя может быть любое, но мне кажется, что RouteSelect – выбор машрута, как никогда уместно). Что такое карты маршрутов и с чем их едят мы поговорим чуть позже, а наши интерфейсы мы успешно настроили.
Настройка списков доступа и пулов NAT
Мы решили что первые две сети из нашего примера, то есть 10.10.1.0/24 и 10.10.2.0/24 мы будем маршрутизировать через провайдера FirstTelecom, а соответственно сети 10.10.3.0/24 и 10.10.4.0/24 через провайдера SecondTelecom.
Для этого нам нужно создать списки доступа (access-list), делается это весьма просто. Итак, создадим два списка доступа First и Second:
cisco# configure terminal cisco(config)# ip access-list standart First cisco(config-std-nacl)# permit 10.10.1.0 0.0.0.255 cisco(config-std-nacl)# permit 10.10.2.0 0.0.0.255 cisco(config-std-nacl)# exit cisco(config)# ip access-list standart Second cisco(config-std-nacl)# permit 10.10.3.0 0.0.0.255 cisco(config-std-nacl)# permit 10.10.4.0 0.0.0.255
Как мы видим, маска для наших сетей задается не обычным образом. Дело в том, что при задании списков доступа на cisco используется wildcard маска, ее еще называют обратной маской
Так же нам надо настроить пулы NAT (nat pools) – это именованые диапазоны публичных ip-адресов, в которые мы будем транслировать наши приватные адреса.
Пул для NAT задается директивой ip nat pool <start-ip> <end-ip> netmask <netmask>, где <start-ip> это начальный адрес пула, <end-ip>, соответственно конечный адрес пула, ну и<netmask> - это маска сети. Так как для нашего примера мы используем по одному ip адресу от каждого провайдера, то start-ip и end-ip будут совпадать. Создаем два пула для нашего будущего NAT:
cisco# configure terminal cisco(config)# ip nat pool FirstTelecomPool 91.100.100.146 91.100.100.146 netmask 255.255.255.248 cisco(config)# ip nat pool SecondTelecomPool 91.1.11.117 91.1.11.117 netmask 255.255.255.224
Так же нам надо создать два списка доступа для локальных сетей самих провайдеров, чтобы в данные сети пользователи маршрутизировались всегда через того провайдера, которому сеть принадлежит. Скажем каждый провайдер обладает сетью класса B из того же диапазона, который выдан нам, то есть это будут сети 91.100.0.0/16 и 91.1.0.0/16. Для этого создадим еще два списка доступа FirstTelecomNet и SecondTelecomNet:
cisco# configure terminal cisco(config)# ip access-list extended FirstTelecomNet cisco(config-std-nacl)# permit ip any 91.100.0.0 0.0.255.255 cisco(config-std-nacl)# exit cisco(config)# ip access-list extended SecondTelecomNet cisco(config-std-nacl)# permit ip any 91.1.0.0 0.0.255.255 cisco(config-std-nacl)# exit
В данном случае мы используем extended списки доступа, которые отличаются от standart тем, что мы можем указать явно ip источника и назначения (в stanrart листах указываются просто ip и они могут быть как адресами источника, так и назначения). Таким образом мы указываем правила для соединений с любого ip на адреса, принадлежащие сети того или другого провайдера.
Карты маршрутов и обеспечение резервирования канала
Теперь мы подошли вплотную к понятию карты маршрутов (route-map). Я не буду приводить ссылки на документацию от cisco, а постараюсь объяснить вам все своими словами.
По сути карта маршрутов похожа по своему действию на списки доступа, за тем лишь исключением, что в карте маршрутов можно не только определить принадлежность к ней по какому-то параметру (например по ip-адресу), но и изменить какие-то параметры маршрутизации, например указать шлюз (nexthop), через который нужно маршрутизировать попавшие под данную карту маршрутов пакеты. Карта маршрутов поддерживает метки (match) по которым можно указать условия принадлежности каких-то пакетов в данной карте маршрутов, и инструкции set, при помощи которых можно изменить параметры маршрутизации. Так же для каждой карты маршрутов можно указать несколько правил, которые будут обрабатываться по возрастанию иx номера (sequence).
Как мы уже указали вначале, мы будем использовать для маршрутизации всего одну карту маршрутов с именем RouteSelect, но у нее будет несколько номеров.
Итак, начинаем создавать нашу карту маршрутов. Для начала добавим правила для маршрутизации пакетов, которые идут в сети провайдеров только через их шлюзы:
cisco# configure terminal cisco(config)# route-map RouteSelect permit 10 cisco(config-route-map)# match ip address FirstTelecomNet cisco(config-route-map)# set ip next-hop 91.100.100.145 cisco(config-route-map)# exit cisco(config)# route-map RouteSelect permit 20 cisco(config-route-map)# match ip address 20 cisco(config-route-map)# set ip next-hop 91.1.11.97 cisco(config-route-map)# exit
По сути мы говорим нашему маршрутизатору cisco устанавливать шлюзы для соотвествующих совпадений по спискам доступа. Соответственно для сетей первого провайдера мы устанавливаем наш шлюз для первого провайдера, а для сетей второго – наш шлюз второго провайдера.
Настройка резервирования канала
Теперь, прежде чем продолжить настройку карт маршрутов, нам нужно настроить резервирование каналов. Делается это через использование технологии IP SLA и механизма Track.
Track - это флаг состояния, который может иметь два значения: up или down. Этот флаг будет устанавливаться на основе данных полученных от IP SLA.
У IP SLA множество возможностей, но мы используем icmp-jitter. По сути, это тот же пинг, только он отправляет несколько пакетов и если хотя бы один из них возвращается, то IP SLA устанавливает соответсвующий Track в состояние UP. Использование jitter’а исключает случайные потери пингов, так как icmp сам по себе не приоритетный протокол и один пакет из нескольких вполне может потеряться. Может быть это выглядит и запутанно, но на практике оказывается все просто. Для начала нам нужно создать флаги Track:
cisco# configure terminal cisco(config)# track 100 ip sla 100 reachability cisco(config)# track 200 ip sla 200 reachability
Данными инструкциями мы привязываем флаг track #100 к ip sla с номером 100 и соответственно track #200 к ip sla с номером 200. Определим для себя, что track 100 будет соответствовать провайдеру FirstTelecom, а track 200 будет соответствовать провайдеру SecondTelecom.
Дальше нам нужно определить какие адреса из сетей провайдеров мы будем пинговать, чтобы удостовериться, что линк провайдера работает. Я обычно пингую dns сервера. Скажем в нашем примере это будут адреса 91.100.0.3 и 91.1.0.3, после чего мы можем настроить работу icmp-jitter’а в IP SLA:
cisco# configure terminal cisco(config)# ip sla 100 cisco(config-ip-sla)# icmp-jitter 91.100.0.3 interval 20 num-packets 3 source-ip 91.100.100.146 cisco(config-ip-sla-icmpjitter)# frequency 60 cisco(config-ip-sla-icmpjitter)# timeout 300 cisco(config-ip-sla-icmpjitter)# exit cisco(config-ip-sla)# exit cisco(config)#ip sla schedule 100 start-time now life forever cisco(config)# ip sla 200 cisco(config-ip-sla)# icmp-jitter 91.1.0.3 interval 20 num-packets 3 source-ip 91.1.11.117 cisco(config-ip-sla-icmpjitter)# frequency 60 cisco(config-ip-sla-icmpjitter)# timeout 300 cisco(config-ip-sla-icmpjitter)# exit cisco(config-ip-sla)# exit cisco(config)#ip sla schedule 200 start-time now life forever
Для обоих провайдеров директивы аналогичны, рассмотрим их значение:
- ip sla 100 - создает контейнер IP SLA с номером 100, который мы указали в соответствующем track
- icmp-jitter 91.100.0.3 interval 20 num-packets 3 source-ip 91.100.100.146 - говорит маршрутизатору cisco пинговать адрес 91.100.0.3 три раза с интервалом в 20 миллисекунд используя для этого адрес 91.100.100.146
- frequency 60 - запускать данный jitter раз в 60 секунд
- timeout 300 - считать icmp пакет не пришедшим спустя 300 миллисекунд
- ip sla schedule 100 start-time now life forever - запустить контейнер IP SLA с номером 100 начиная с текущего момента и не использовать “вечно” (можно указать конкретное время, в течение которого будет действовать указанный IP SLA, но нам нужно чтобы он работал все время, так что ставим forever)
Окончание настройки route-map. Распределение пользователей
В итоге нам осталось настроить карты маршрутов, которые будут отправлять одних пользователей по одному каналу, а других – по другому, а так же обеспечить корректную работу NAT и настроить базовую маршрутизацию. Делается это просто. Для начала заканчиваем с route-map:
cisco# configure terminal cisco(config)# route-map RouteSelect permit 100 cisco(config-route-map)# match ip address First cisco(config-route-map)# set ip next-hop 91.100.100.145 track 100 cisco(config-route-map)# set ip next-hop 91.1.11.97 track 200 cisco(config-route-map)# exit cisco(config)# route-map RouteSelect permit 200 cisco(config-route-map)# match ip address First cisco(config-route-map)# set ip next-hop 91.1.11.97 track 200 cisco(config-route-map)# set ip next-hop 91.100.100.145 track 100 cisco(config-route-map)# exit
Так же надо создать еще две карты маршрутов, но они по сути будут вести себя, как обычные списки доступа, так как не будут иметь директивы set:
cisco# configure terminal
cisco(config)# route-map FirstNat permit 10
cisco(config-route-map)# match interface fast ethernet 4
cisco(config-route-map)# exit
cisco(config)# route-map SecondNat permit 10
cisco(config-route-map)# match interface fast vlan 2
cisco(config-route-map)# exit
После чего нам остается только включить NAT и настроить маршруты по умолчанию с использованием track:
cisco# configure terminal cisco(config)#ip nat inside source route-map FirstNat pool FirstTelecomPool overload cisco(config)#ip nat inside source route-map SecondNat pool SecondTelecomPool overload cisco(config)#ip route 0.0.0.0 0.0.0.0 FastEthernet 4 91.100.100.145 track 100 cisco(config)#ip route 0.0.0.0 0.0.0.0 vlan 2 91.1.11.97 track 200
Вот собственно и все, наша конфигурация уже работает, остался маленький штрих, нам надо включить CEF, который будет отвечать за “быстрое” переключение между нашими каналами:
cisco# configure terminal cisco(config)# ip cef
Автор: Яковлев А.В
Полезные ссылки
Быстрое и недорогое обучение за рубежом английскому языку. Различные варианты обучения для всех уровней подготовки.
6 комментов оставлено (Add 1 more)