воскресенье, 25 ноября 2012 г.


В данной статье разобраны типовые решения для реализации VPN на базе MPLS сети использующей в качестве внутреннего протокола маршрутизации (IGP) EIGRP. Я надеюсь, что это статья будет полезна при внедрении технологии MPLS/VPN в вашей сети. Используя этот документ, Вы как минимум получите сеть, изображенную на Рис.1, использующую технологию MPLS/VPN. Любые замечания, пожелания, найденные ошибки и опечатки приветствуются.
  • Введение
  • Этапы настройки
  • Настройка EIGRP и CEF
  • Настройка TDP
  • Настройка VRF
  • Настройка MP-BGP
  • Настройка маршрутизации между PE-CE по протоколу EIGRP
  • PE-CE соединение с использованием OPSF.
  • PE-CE соединение с использованием RIP.

Введение

В данной статье разобраны типовые решения для реализации L3 VPN на базе сети MPLS использующей в качестве внутреннего протокола маршрутизации (IGP) EIGRP. На полигоне использовалось оборудование Cisco Systems 26xxXM, 36xx c программным обеспечением IOS 12.3.10. Соответственно, в статье будет разобрана работа MPLS/VPN только для пакетных сетей. В статье не будут обсуждаться вопросы и команды связанные с TE и QoS.
В рамках технологии MPLS/VPN принято использование следующих терминов:
  • CE (Customer Edge) - маршрутизатор со стороны узла клиента, который непосредственно подключается к маршрутизатору оператора.
  • PE (Provider Edge) - граничный маршрутизатор со стороны оператора (MPLS домена), к которому подключаются устройства CE. PE устройства выполняют функции E-LSR-ов. На нашем полигоне эту роль выполняют маршрутизаторы Router_A, Router_B, Router_C, Router_I, Router_F.
  • P (Provider) - маршрутизатор внутри сети Оператора (MPLS домена). P устройства выполняют функции LSR. На нашем полигоне роль маршрутизатора P возложена на маршрутизатор Router_G.


Рис. 1. Схема полигона.
Для эксперимента в качестве внутреннего протокола маршрутизации MPLS домена был выбран протокол EIGRP. Данный протокол маршрутизации является гибридным протоколом маршрутизации. Создание EIGRP есть попытка соединить в одном протоколе достоинства "дистанционно-векторных" (distance-vector) протоколов маршрутизации и протоколов "состояния канала" (link-state) без недостатков присущих этим протоколам. EIGRP комбинирует простоту и надежность "дистанционно-векторных" протоколов, а также быструю сходимость протоколов "состояния канала. EIGRP поддерживает маршрутизацию протоколов IP, IPX, Aplletalk. С версии IOS 12.3 поддерживает VPN/MPLS с использованием EIGRP (разумеется в train релизах 12.2 эта возможность появилась раньше). В качестве протокола распространения меток был выбран протокол TDP.

Этапы настройки

  1. Настройка EIGRP и CEF
  2. Настройка TDP
  3. Настройка VRF
  4. Настройка MP-BGP
  5. Настройка маршрутизации между устройствами PE-CE с использованием протоколов:
  • EIGRP;
  • OSPF;
  • RIP.

Настройка EIGRP и CEF

Для начала необходимо запустить на всех маршрутизаторах входящих в MPLS домен протокол маршрутизации (в нашем случае EIGRP) и включить на этих маршрутизаторах коммутации Cisco Express Forwarding (CEF).
router eigrp 1
#запущен процесс маршрутизации EIGRP 1
 network 10.0.0.0
#Маршрутизировать все сети, подключенные к этому маршрутизаторы с адресами, попадающими в диапазон 10.0.0.0/8.
no auto-summary
#отключить автоматическую суммаризацию.
ip cef
#включена коммутация Cisco Express Forwarding
Проверить функционирование протокола EIGRP можно командой show ip protocols (команда также покажет основные параметры протокола EIGRP на маршрутизаторе) и командой show ip eigrp neighbors убедится в создание соседских отношений между маршрутизаторами. Проверить работу CEF можно выполнив команду show ip cef summary:
Подробно на этом этапе мы останавливаться не будем, так как рассмотрение настройки и отладки EIGRP и CEF выходит за рамки статьи.

Настройка TDP

По умолчанию IOS использует протокол TDP, но можно выбрать LDP командой mpls label protocol ldp. Можно также этой командой включить или выключить на отдельном интерфейсе любой из протоколов. При выполнении команды mpls label protocol both на интерфейсах соседей маршрутизаторов маршрутизаторы будут использовать протокол LDP.
Так как настройка протокола LDP является типовым процессом, то мы рассмотрим настройку только маршрутизатора Router_B, предполагая, что на остальных маршрутизаторах MPLS домена протокол LDP уже функционирует. Изначально маршрутизатор Router_B имеет следующую конфигурацию:
Current configuration : 1122 bytes
!
version 12.3
!
hostname Router_B
!
ip cef
no tag-switching ip
!
interface Loopback0
 ip address 10.108.254.45 255.255.255.255
!
interface FastEthernet0/0
 ip address 10.18.1.1 255.255.255.0
!
interface Serial0/0:0
 description Router_C
 ip address 10.108.253.190 255.255.255.252
!
interface Serial0/1:0
 description Router_A
 ip address 10.108.253.201 255.255.255.252
!
router eigrp 1
 network 10.0.0.0
 no auto-summary
!
end
На маршрутизаторе Router_A поднят Loopback0 с сетью 10.108.254.39/32, на маршрутизаторе Router_C поднят Loopback0 с сетью 10.108.254.40/32.
Запускаем поддержку MPLS используя команду mpls ip
Router_B(config)# mpls ip
Создание Label Information Base и запуск TDP/LDP произойдет только после запуска MPLS на одном из интерфейсов. Предварительно запустим на маршрутизаторе debug для наглядности.
Router_B#show debug
MPLS:
  MPLS events debugging is on
  LFIB data structure changes debugging is on
  LFIB enable/disable state debugging is on
  MPLS adjacency debugging is on
MPLS ldp:
  LDP Label Information Base (LIB) changes debugging is on
  LDP received messages, excluding periodic Keep Alives debugging is on
  LDP sent PDUs, excluding periodic Keep Alives debugging is on
  LDP transport events debugging is on
  LDP transport connection events debugging is on
  LDP session state machine (low level) debugging is on
Запускаем MPLS на интерфейсе
Router_B(config)#interface Serial0/0:0
Router_B(config-if)#tag-switching ip
01:32:07: mpls: Add mpls app; Serial0/0:0
01:32:07: mpls: Add mpls app; Serial0/0:0
01:32:07: mpls: Add mpls app; i/f status change; Serial0/0:0
01:32:07: ldp: enabling ldp on Serial0/0:0
#Подготовка к запуску MPLS
01:32:07: LFIB: enable entered, table does not exist,enabler type=0x1
01:32:07: LFIB: enable, TFIB allocated, size 6032 bytes, maxtag = 500
#База LFIB создана
01:32:07: tib: find route tags: 10.18.1.0/24, Fa0/0, nh 0.0.0.0, res nh 0.0.0.0
01:32:07: tagcon: tibent(10.18.1.0/24): created; find route tags request
01:32:07: tagcon: tibent(10.18.1.0/24): label 1 (#2) assigned
01:32:07: tagcon: announce labels for: 10.18.1.0/24; nh 0.0.0.0, Fa0/0,inlabel imp-null,
  outlabel unknown (from 0.0.0.0:0), find route tags
01:32:07: tib: find route tags: 10.108.253.188/30, Se0/0:0, nh 0.0.0.0, res nh 0.0.0.0
01:32:07: tagcon: tibent(10.108.253.188/30): created; find route tags request
01:32:07: tagcon: tibent(10.108.253.188/30): label 1 (#4) assigned
01:32:07: tagcon: announce labels for: 10.108.253.188/30; nh 0.0.0.0, Se0/0:0, inlabel imp-null
  outlabel unknown (from 0.0.0.0:0), find route tags
01:32:07: tib: find route tags: 10.108.253.200/30, Se0/1:0, nh 0.0.0.0, res nh 0.0.0.0
01:32:07: tagcon: tibent(10.108.253.200/30): created; find route tags request
01:32:07: tagcon: tibent(10.108.253.200/30): label 1 (#6) assigned
01:32:07: tagcon: announce labels for: 10.108.253.200/30; nh 0.0.0.0, Se0/1:0, inlabel imp-null,
  outlabel unknown (from 0.0.0.0:0), find route tags
01:32:07: tib: find route tags: 10.108.254.40/32, Se0/0:0, nh 10.108.253.189, res nh 10.108.253.189
01:32:07: tagcon: tibent(10.108.254.40/32): created; find route tags request
01:32:07: tagcon: tibent(10.108.254.40/32): label 16 (#8) assigned
#Маршрутизатор начинает расставлять локальные метки на маршруты находящиеся в таблице маршрутизации
01:32:07: mpls: Enable MPLS forwarding on Serial0/0:0
01:32:07: ldp: enabling ldp on Serial0/0:0
#После привязки меток маршрутизатор готов к работе по MPLS на интерфейсе Serial0/0:0. Стартует LDP/TDP.
01:32:07: ldp: Got LDP Id, ctx 0
01:32:07: ldp: LDP Hello process inited
01:32:07: ldp: Start MPLS discovery Hellos for Serial0/0:0
01:32:07: ldp: Got TDP UDP socket for port 711
01:32:07: ldp: Got LDP UDP socket for port 646
#Как видно из сообщений IOS открывает порты для обоих протоколов распространения меток, внезависимости от значения команды mpls label protocol. И разумеется первыми исходят сообщения Hello.
01:32:07: ldp: Send tdp hello; Serial0/0:0, src/dst 10.108.253.190/255.255.255.255, inst_id 0
01:32:08: ldp: Ignore Hello from 10.108.253.202, Serial0/1:0; no intf
#Хотя на интерфейсе Serial0/1:0 у нас находится маршрутизатор, готовый работать по MPLS, на этом интерфейсе у нас не разрешен MPLS, поэтому пакеты LDP/TDP игнорируются
01:32:09: ldp: Rcvd tdp hello; Serial0/0:0, from 10.108.253.189 (10.108.254.40:0), intf_id 0, opt 0x4
#Ура сосед ответил
01:32:09: ldp: tdp Hello from 10.108.253.189 (10.108.254.40:0) to 255.255.255.255, opt 0x4
01:32:09: ldp: New adj 0x82EA0510 for 10.108.254.40:0, Serial0/0:0
#Обнаружен новый сосед с ID 10.108.254.40 на Serial 0/0:0
01:32:09: ldp:  adj_addr/xport_addr 10.108.253.189/10.108.254.40
01:32:09: ldp: local idb = Serial0/0:0, holdtime = 15000, peer 10.108.253.189 holdtime = 15000
01:32:09: ldp: Link intvl min cnt = 2, intvl = 5000, idb = Serial0/0:0
01:32:09: ldp: Opening tdp conn; adj 0x82EA0510, 10.108.254.45 <-> 10.108.254.40; with normal priority
#Оба маршрутизатора обменялись своими ID и устанавливают соединение по TDP
01:32:09: ldp: ptcl_adj:10.108.253.189(0x82EA0A60): Non-existent -> Opening Xport
01:32:09: ldp: create ptcl_adj: tp = 0x82EA0A60, ipaddr = 10.108.253.189
01:32:09: ldp: ptcl_adj:10.108.253.189(0x82EA0A60): Event: Xport opened;
    Opening Xport -> Init sent
01:32:09: ldp: tdp conn is up; adj 0x82EA0510, 10.108.254.45:11000 <-> 10.108.254.40:711
01:32:09: ldp: Sent open PIE to 10.108.254.40 (pp 0x0)
01:32:09: ldp: Rcvd open PIE from 10.108.254.40 (pp 0x0)
01:32:09: ldp: ptcl_adj:10.108.253.189(0x82EA0A60): Event: Rcv Init;
    Init sent -> Init rcvd actv
01:32:09: ldp: Rcvd keep_alive PIE from 10.108.254.40:0 (pp 0x0)
01:32:09: ldp: ptcl_adj:10.108.253.189(0x82EA0A60): Event: Rcv KA;
    Init rcvd actv -> Oper
01:32:09: tagcon: Assign peer id; 10.108.254.40:0: id 0
01:32:09: %LDP-5-NBRCHG: TDP Neighbor 10.108.254.40:0 is UP
#Маршрутизаторы договорились между собой, установили соседские отношения и теперь информацию о соседе можно получить, выполнив команду show mpls ldp neighbor
01:32:09: ldp: Sent address PIE to 10.108.254.40:0 (pp 0x82EA0C10)
01:32:09: ldp: Sent bind PIE to 10.108.254.40:0 (pp 0x82EA0C10)
#PIE это protocol information element, если я правильно понял это у нас теперь так пакет с данным называется
01:32:09: ldp: Rcvd address PIE from 10.108.254.40:0 (pp 0x82EA0C10)
01:32:09: tagcon: 10.108.254.40:0: 10.108.254.40 added to addr<->ldp ident map
01:32:09: tagcon: 10.108.254.40:0: 10.108.253.189 added to addr<->ldp ident map
01:32:09: ldp: Rcvd bind PIE from 10.108.254.40:0 (pp 0x82EA0C10)
01:32:09: tagcon: tibent(10.108.253.188/30): label imp-null from 10.108.254.40:0 added
#Получаем метки от соседа и передаем их в LFIB
01:32:09: tib: Not OK to announce label; nh 0.0.0.0 not bound to 10.108.254.40:0
01:32:09: tagcon: omit announce labels for: 10.108.253.188/30; nh 0.0.0.0, Se0/0:0,
  from 10.108.254.40:0: add rem binding: connected route
01:32:09: tagcon: tibent(10.108.254.40/32): label imp-null from 10.108.254.40:0 added
01:32:09: tagcon: announce labels for: 10.108.254.40/32; nh 10.108.253.189, Se0/0:0,
  inlabel 16, outlabel imp-null (from 10.108.254.40:0), add rem binding
01:32:09: LFIB: set loadinfo,tag=16,no old loadinfo,no new loadinfo
01:32:09: LFIB: delete tag rew, incoming tag 16
01:32:09: LFIB: create tag rewrite: inc 16,outg Imp_null
-------------------------------------------------
01:32:09: tagcon: tibent(10.108.254.39/32): label 19 from 10.108.254.40:0 added
01:32:09: tib: Not OK to announce label; nh 10.108.253.202 not bound to 10.108.254.40:0
01:32:09: tagcon: omit announce labels for: 10.108.254.39/32; nh 10.108.253.202, Se0/1:0,
  from 10.108.254.40:0: add rem binding: next hop = 10.108.253.202
01:32:11: ldp: Send tdp hello; Serial0/0:0, src/dst 10.108.253.190/255.255.255.255, inst_id 0
01:32:13: ldp: Rcvd tdp hello; Serial0/0:0, from 10.108.253.189 (10.108.254.40:0), intf_id 0, opt 0x4
01:32:15: ldp: Send tdp hello; Serial0/0:0, src/dst 10.108.253.190/255.255.255.255, inst_id 0
01:32:17: ldp: Rcvd tdp hello; Serial0/0:0, from 10.108.253.189 (10.108.254.40:0), intf_id 0, opt 0x4g
#Процесс установления соседских отношений завершен, обмен необходимой информацией закончен и маршрутизаторы обмениваются пакетами Hello
В качестве идентификатора выбирается наибольший IP адрес из интерфейсов Loopback. Если интерфейсы Loopback отсутствуют, то в качестве идентификатора выбирается наибольший IP адрес с любого интерфейса. Можно установить идентификатор вручную, используя команду mpls ldp router-id interface с необязательным параметром force. Только с параметром force ID будет изменен для существующих сессий и повлечет за собой переустановление соседских отношений.
Многие не задумываются о сходимости пакетной MPLS сети, хотя для многих приложений MPLS этот параметр очень важен (например для MPLS/VPN) так как он может повлечь увеличение задержки распространения меток. В пакетных сетях при использовании режима обмена информацией о метках без запроса (Downstream Unsolicited), независимого контроля над распространением меток (Independent Label Distribution Control) и свободного режима сохранения меток (Liberal Label Retention Mode) время сходимости сведено до минимума, позволяя находить метки после завершения процесса сходимости IGP без опрашивания соседа. Но это быстро и хорошо работает при падении канала, но не при более глубоких изменениях сети. Надо иметь ввиду, что сначала должен завершить свою работу по поиску маршрутов IGP, и только после завершения его работы начнется работа по поиску меток MPLS. Из вышесказанного следует, что при проблемах с MPLS не забудьте проверить работу IGP.
Настроим MPLS на втором интерфейсе.
Router_B(config)#interface Serial0/1:0
Router_B(config-if)# tag-switching ip
Выполним еще раз команду show mpls forwarding-table на маршрутизаторе Router_B.
Router_B#show mpls forwarding-table
Local  Outgoing    Prefix            Bytes tag  Outgoing   Next Hop
tag    tag or VC   or Tunnel Id      switched   interface
16     Pop tag     10.108.254.40/32  214        Se0/0:0    point2point
17     Pop tag     10.108.254.39/32  170        Se0/1:0    point2point
Router_B#
Из всех маршрутизируемых сетей в LFIB маршрутизатора Router_B присутствует только две сети. Такой результат связан с работой механизма PHP (Penultimate Hop Popping). При использовании механизма PHP последний маршрутизатор сообщает предыдущему о том, что он может удалять метку у себя для определенного FEC. Сделано это для снижения нагрузки на PE маршрутизатор за счет перекладывание части работы на предыдущий P маршрутизатор. Информация об использовании PHP передается с помощью TDP или LDP, использующими для этого специальные метки (3 для LDP, 1 для TDP), которые принято называть implicit-null метками. В выводе команд show mpls ip bindings и show mpls ldp bindings такие метки показываются как imp-null. Команда show mpls ip bindings показывает информацию о привязке меток полученных через протокол LDP/TDP. Команда show mpls ldp bindings показывает содержимое Label Information Base