headermask image

Notice: Undefined variable: t in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15

Notice: Undefined variable: r in /var/www/user97185/data/www/system-administrators.info/yandex-ad.php on line 15
Рекомендую: Фриланс-биржа | Кэшбэк-сервис | Интернет-бухгалтерия

Два и более провайдера в Интернет на cisco 871

В данной статье мне хотелось бы рассмотреть настройку маршрутизатора 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)

  1. А вот как быть, первый раз попала каса в руки, я несколько дней эксперементировал с разными статьями пока не наткунля на вашу, и теперь не могу вернуть ёё к дефолту erase startup-config, но это не помогло, как быть ?

    1. Peering22 on May 7th, 2012 at 7:50 am
  2. да и в этом куске ошибка :

    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

    в обоих частях прописан интерфейс First, хотя во второй части должен быть Second

    2. seal on September 8th, 2011 at 7:45 am
  3. > cisco(config-if)# ip nat outside
    > cisco(config-if)# ip nat enable
    Это разные технологии, – зачем вводите в заблуждение людей ?

    3. Alexey on April 30th, 2011 at 10:01 am
  4. есть тут небольшая ещё одна опечатка
    cisco# configure terminal
    cisco(config)# interface fast ethernet 0
    cisco(config-if)# SWITCH PORT access vlan 2
    cisco(config-if)# no shutdown
    так вот SWITHPORT пишется СЛИТНО!

    4. Кирилл on September 15th, 2010 at 5:05 pm
  5. Я правильно понимаю, что в примере конфигурации в разделе “Карты маршрутов и обеспечение резервирования канала” есть опечатка?

    Вместо
    # match ip address 20
    должно быть
    # match ip address SecondTelecomNet
    ??

    5. kraskov on March 30th, 2010 at 2:55 pm
  6. команда
    set ip next-hop 91.100.100.145 track 100
    не отрабатывает :(

    Cisco IOS Software, 2800 Software (C2800NM-ADVIPSERVICESK9-M), Version 12.4(24)T, RELEASE SOFTWARE (fc1)

    6. tailor on February 10th, 2010 at 10:00 am