понедельник, 28 декабря 2009 г.

Cisco, 2 ISP (Провайдера) мои 5 копеек и парочка граблей

В сети много раз описывались варианты настройки маршрутизаторов Cisco для работы с двумя каналами (2 Провайдера - один основной + запасной), встречались даже реализации с использование VRF'ов! Здесь я постараюсь описать оптимальный, на мой взгляд, конфиг и встреченные в процессе настройки грабли (с решениями). Итак базовая настройка рутера 2851 со свичевым модулем.
Так как модуль - L2, то интерфейсы к провайдерам  реализуются через SVI.
interface GigabitEthernet0/0
 description Внутренняя Сеть
 ip address 172.20.1.1 255.255.0.0 secondary
 ip address 172.20.1.2 255.255.0.0
 no ip redirects
 no ip unreachables
 no ip proxy-arp
 ip nat inside
 ip virtual-reassembly
 duplex auto
 speed auto
 no mop enabled
interface Vlan12
 description To_ISP1
 ip address ***1
 no ip redirects
 no ip unreachables
 no ip proxy-arp
 ip dns view-group ISP1
 ip nat outside
 ip virtual-reassembly
 interface Vlan13
 description To_ISP2
 ip address ***2
 no ip redirects
 no ip unreachables
 no ip proxy-arp
 ip dns view-group ISP2
 ip nat outside
 ip virtual-reassembly
# Вяжем SVI с физикой
interface FastEthernet0/0/0
 switchport access vlan 11
 spanning-tree portfast
interface FastEthernet0/0/1
 switchport access vlan 12
 spanning-tree portfast
# добавляем список доступа для NAT
ip access-list extended NAT
 permit ip 172.20.0.0 0.0.255.255 any
# теперь нужно "занатить" внутреннюю сеть на двух провов, это сделаем через route-map'ы
route-map DMZ-ISP2 permit 10
 match ip address DMZ-ISP2
 set ip next-hop verify-availability *** 1 track 2
route-map DMZ-ISP2 permit 20
 match ip address DMZ-ISP1
 set ip next-hop verify-availability *** 1 track 1
ip nat inside source route-map ISP1 interface Vlan12 overload
ip nat inside source route-map ISP2 interface Vlan13 overload
# отдельно нужно описать треки (отслеживание состояния какого либо параметра - в нашем случае трек опирается на доступность определенных сетевых сервисов через механизм sla)
ip sla 20
 icmp-echo 93.158.134.8 source-interface Vlan12
 timeout 2000
 frequency 3
ip sla schedule 20 life forever start-time now
ip sla 30
 icmp-echo 217.69.128.42 source-interface Vlan12
 timeout 2000
 frequency 3
ip sla schedule 30 life forever start-time now
ip sla 40
 icmp-echo 194.87.0.50 source-interface Vlan12
 timeout 2000
 frequency 3
ip sla schedule 40 life forever start-time now
ip sla 120
 icmp-echo 93.158.134.8 source-interface Vlan13
 timeout 2000
 frequency 3
ip sla schedule 20 life forever start-time now
ip sla 130
 icmp-echo 217.69.128.42 source-interface Vlan13
 timeout 2000
 frequency 3
ip sla schedule 30 life forever start-time now
ip sla 140
 icmp-echo 194.87.0.50 source-interface Vlan13
 timeout 2000
 frequency 3
ip sla schedule 40 life forever start-time now
# в качестве критерия доступности выступают ответы на пинги от крупных сетевых сервисов (Яндекс, Мейл.ру и пр.)
track 20 ip sla 20
track 30 ip sla 30
track 40 ip sla 40
track 120 ip sla 120
track 130 ip sla 130
track 140 ip sla 140
track 2 list boolean or
 object 120
 object 130
 object 140
track 1 list boolean or
 object 20
 object 30
 object 40
# Группируем треки для карт маршрутизации, так что они считаются доступными, если хоть один из пингуемых сервисов  "жив" (логическое "или").
ip route 0.0.0.0 0.0.0.0 *** track 1
ip route 0.0.0.0 0.0.0.0 *** 2 track 2
# также вешаем треки на дефолтные маршруты (маршрут ко второму провайдеру имеет AD 2)
Полученная в результате конфигурация может считаться работоспособной, но есть два вопроса:
1. при переключении каналов уже установленные сессии находятся в таблице NAT трансляций, их нужно оперативно убрать.
2. на втором канале могут возникнуть сложности с разрешением имен.
Для решения первого вопроса добавляем механизм реакции на события (event manager):
event manager applet CHANGE_ISP
 event track 1 state any
 action 1.0 cli command "enable"
 action 2.0 cli command "clear ip nat trans forced"
# при переходе трека 1 из состояния Up -> Down или обратно принудительно выполняется очистка таблицы трансляций.
Для второй проблемы настраиваем DNS фичу - DNS View:
ip dns view ISP1-OBIT
 domain name-server  ***
 domain name-server  ***
ip dns view ISP2-PTRST
 domain name-server  ***
 domain name-server  ***
ip dns view-list ISP2
 view ISP2-PTRST 1
ip dns view-list ISP1
 view ISP1-OBIT 1
ip dns server
# Далее эти вьюсы навешиваются на SVI внешних каналов (см. настройки Vlan 12 / 13).
Звездочками *** обозначены различные внешние адреса (выданные провами, гейтвеи и ДНСы).

UPD: В последних версиях IOS были внесены некоторые изменения в синтаксисе команд трекинга и убраны некоторые шаблоны отслеживания track'ов. В новой интерпретации получится примерно такое:
изменения в ip sla
ip sla monitor 20
type echo protocol ipIcmpEcho 8.8.8.8 source-interface FastEthernet0/0
frequency 5
ip sla monitor schedule 20 life forever start-time now
ip sla monitor 30
type echo protocol ipIcmpEcho 4.2.2.2 source-interface FastEthernet0/0
frequency 5
ip sla monitor schedule 30 life forever start-time now
ip sla monitor 40
type echo protocol ipIcmpEcho 62.76.76.62 source-interface FastEthernet0/0
frequency 5
ip sla monitor schedule 40 life forever start-time now
ip sla monitor 120
type echo protocol ipIcmpEcho 8.8.8.8 source-interface FastEthernet0/1
frequency 5
ip sla monitor schedule 120 life forever start-time now
ip sla monitor 130
type echo protocol ipIcmpEcho 4.2.2.2 source-interface FastEthernet0/1
frequency 5
ip sla monitor schedule 130 life forever start-time now
ip sla monitor 140
type echo protocol ipIcmpEcho 62.76.76.62 source-interface FastEthernet0/1
frequency 5
ip sla monitor schedule 140 life forever start-time now
!
track 1 list boolean or
object 20
object 30
object 40
!
track 2 list boolean or
object 120
object 130
object 140
!
track 20 rtr 20 reachability
!
track 30 rtr 30 reachability
!
track 40 rtr 40 reachability
!
track 120 rtr 120 reachability
!
track 130 rtr 130 reachability
!
track 140 rtr 140 reachability

Реакция при наступлении события будет на основании записи в логе:
event manager applet CLEAR_NAT
event syslog pattern "%TRACKING-5-STATE: 1 list boolean or"
action 1.0 cli command "enable"
action 2.0 cli command "clear ip nat trans forced"


5 комментариев:

  1. Спасибо огромное!

    ОтветитьУдалить
  2. Спасибо! прекрасная статья! А если 4 или 5 ISP? и у 4-х из 5-ти ISP неизвестные, меняющиеся ip-сети (Satellite, 3G, Wi-Fi hotspots, провод со статикой и DHCP)?

    ОтветитьУдалить
    Ответы
    1. Если есть один провайдер, выдающий сетевые параметры по DHCP, можно в route-map и маршруте сделать небольшие изменения:
      route-map ISP3 permit 30
      match ip address ...
      set ip next-hop dynamic dhcp
      --
      ip route 0.0.0.0 0.0.0.0 vlan N track 3
      в остальном принципы создания track'ов, NAT трансляций сохраняются.
      К сожалению, не уверен, что аналогичная конструкция сработает для PPP соединений.
      По нескольким провайдерам с DHCP есть еще один момент - если будут выдаваться адреса из одинаковых подсетей на разные интерфейсы - будет конфликт (в частности, в локальной сети такая ситуация приводила к исчерпанию DHCP пула).
      В целом, рекомендация - если у вас провайдеров больше 2х - старайтесь уходить от NAT'а и смотрите в сторону автономок и BGP, а также IPv6.

      Удалить
  3. Добрый день. пытаюсь настроить DNSы и какая то странная ситуация получается...
    Сделал такой конфиг:
    ip dns view ISP1-Gold
    domain name-server *.106.68.2
    domain name-server *.106.71.254
    ip dns view ISP2-MTS
    domain name-server *.242.139.10
    domain name-server *.242.140.10
    ip dns view-list ISP1
    view ISP1-Gold 1
    ip dns view-list ISP2
    view ISP2-MTS 1

    interface GigabitEthernet0/1
    description EXT1_Gold
    ip dns view-group ISP1

    interface GigabitEthernet0/2
    description EXT2_MTS
    ip dns view-group ISP2

    Если сделать так, то Роутер каким то образом узнает о внутренних серврах, внутри сети. например выдает mail.corp.ru 192.168.1.2, вместо внешнего ip который он должен получать на внешних DNS серврах.
    Если дописать:
    ip name-server *.106.68.2
    ip name-server *.242.139.10
    ip name-server *.106.71.254
    ip name-server *.242.140.10

    Все работает как надо, но чувствую что тогда нет ни какого смысла в DNS view группах...

    Может будут идеи куда копать...?

    ОтветитьУдалить
    Ответы
    1. Приветствую, с момента публикации основного поста прошло уже достаточно времени, поэтому сейчас я придерживаюсь мнения, что заставлять пограничный маршрутизатор заниматься ресолвом не правильно. Помимо возрастания нагрузки (причем, весьма ощутимого!) в некоторых версиях IOS в логах периодически появлялись записи ошибки CEF.
      Предполагаю, что в вашем случае речь идет о компании, где DNS сервис присутствует как минимум в качестве роли на первичном контроллере домена. Рекомендую именно его и использовать в качестве ДНС сервера для хостов, указав внешние провайдерские ДНС сервера в качестве серверов пересылки. Если вы не содержите собственный зарегистрированный домен и у вас не требуется ДНС пиринг с регистратором (tcp 53), а также вы не пользуетесь какими-то внутренними ресурсами провадеров, то необходимости в провайдерских ДНСах, на мой взгляд, нет. Можно пользоваться открытыми ДНСами, например, Гугловые 8.8.8.8 и 8.8.4.4, еще открытый 4.2.2.2, для России ДНС от MSK IX 62.76.76.62

      Удалить