Организация VPN на базе MPLS
Автор: Максимович Вадим (vmaksv at gmail.com)
В данной статье разобраны типовые решения для реализации VPN на базе MPLS сети использующей в качестве внутреннего протокола маршрутизации (IGP) EIGRP. Я надеюсь, что это статья будет полезна при внедрении технологии MPLS/VPN в вашей сети. Используя этот документ, Вы как минимум получите сеть, изображенную на Рис.1, использующую технологию MPLS/VPN. Любые замечания, пожелания, найденные ошибки и опечатки приветствуются.
- Введение
- Этапы настройки
- Настройка EIGRP и CEF
- Настройка TDP
- Настройка VRF
- Настройка MP-BGP
- Настройка маршрутизации между PE-CE по протоколу EIGRP
- PE-CE соединение с использованием OPSF.
- PE-CE соединение с использованием RIP.
Введение
Этапы настройки
- Настройка EIGRP и CEF
- Настройка TDP
- Настройка VRF
- Настройка MP-BGP
- Настройка маршрутизации между устройствами PE-CE с использованием протоколов:
- EIGRP;
- OSPF;
- RIP.
Настройка EIGRP и CEF
Для начала необходимо запустить на всех маршрутизаторах входящих в MPLS домен протокол маршрутизации (в нашем случае EIGRP) и включить на этих маршрутизаторах коммутации Cisco Express Forwarding (CEF).
#запущен процесс маршрутизации EIGRP 1 #Маршрутизировать все сети, подключенные к этому маршрутизаторы с адресами, попадающими в диапазон 10.0.0.0/8. #отключить автоматическую суммаризацию. #включена коммутация 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 имеет следующую конфигурацию:
На маршрутизаторе Router_A поднят Loopback0 с сетью 10.108.254.39/32, на маршрутизаторе Router_C поднят Loopback0 с сетью 10.108.254.40/32.
Запускаем поддержку MPLS используя команду mpls ip
Создание Label Information Base и запуск TDP/LDP произойдет только после запуска MPLS на одном из интерфейсов. Предварительно запустим на маршрутизаторе debug для наглядности.
Запускаем MPLS на интерфейсе
#Подготовка к запуску MPLS
#База LFIB создана
#Маршрутизатор начинает расставлять локальные метки на маршруты находящиеся в таблице маршрутизации
#После привязки меток маршрутизатор готов к работе по MPLS на интерфейсе Serial0/0:0. Стартует LDP/TDP.
#Как видно из сообщений IOS открывает порты для обоих протоколов распространения меток, внезависимости от значения команды mpls label protocol. И разумеется первыми исходят сообщения Hello.
#Хотя на интерфейсе Serial0/1:0 у нас находится маршрутизатор, готовый работать по MPLS, на этом интерфейсе у нас не разрешен MPLS, поэтому пакеты LDP/TDP игнорируются
#Ура сосед ответил
#Обнаружен новый сосед с ID 10.108.254.40 на Serial 0/0:0
#Оба маршрутизатора обменялись своими ID и устанавливают соединение по TDP
#Маршрутизаторы договорились между собой, установили соседские отношения и теперь информацию о соседе можно получить, выполнив команду show mpls ldp neighbor
#PIE это protocol information element, если я правильно понял это у нас теперь так пакет с данным называется
#Получаем метки от соседа и передаем их в LFIB
#Процесс установления соседских отношений завершен, обмен необходимой информацией закончен и маршрутизаторы обмениваются пакетами 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 на втором интерфейсе.
Выполним еще раз команду show mpls forwarding-table на маршрутизаторе 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.
Поле in label — содержит входящую метку, параметр inuse указывает на то, что метка сейчас используется для работы, out label содержит исходящую метку, то есть метку, полученную от маршрутизатора, ID которого выведен в поле lsr.
Поле rev есть так называемый revision number — используется для внутреннего управления метками, remote binding — тоже самое, что out label.
Присутствие записи с пометкой (no route) вызвано работой механизма Liberal Label Retention Mode. В данном случае маршрут 10.108.254.254/32 был удален по каким то причинам из таблицы маршрутизации, но маршрутизатор сохранил метку для уменьшения времени сходимости при восстановлении данного маршрута.
Механизм PHP используется только для сетей, непосредственно подключенных к маршрутизатору или для суммарных маршрутов.
Можно использовать вместо implicit-null метки так называемую explicit null метки. В случае использования explicit null метки, предпоследний маршрутизатор устанавливает в пакет метку 0 (для IPv4) или 2 (для IPv6). Это необходимо для передачи на последний маршрутизатор поля MPLS-exp. Включается такой режим работы командой mpls ldp explicit-null. Используя параметры этой команды можно ограничить работу этого механизма только для определенных соседей. По умолчанию включается для всех соседей. Далее показан пример вывода команды show mpls ldp bindings с использованием explicit null меток.
Вывод команды show mpls forwarding-table на остальных маршрутизаторах.
Разберем подробно вывод команды show mpls forwarding-table .
- Поле Local tag показывает локальное значение метки для префикса, указанного в поле Prefix or Tunnel Id.
- Поле Outgoing tag or VC указывает исходящую метку или действие производимое с меткой. Pop tag означает удаление метки из пакета (в данном случае удаляется метка 16). Untagged означает, что IP префикс доступен через неMPLS интрефейс. Aggregate означает использование метки для нескольких префиксов.
- Поле Bytes tag switched показывает количество переданных байтов с этой меткой.
- В поле Outgoing interface указывается исходящий интерфейс.
- Поле Next hop показывает IP адрес следующего маршрутизатора или, как в этом случае, тип интерфейса.
Получить информацию о соседях можно выполнив команду show mpls ldp neighbors.
Описание полей выводе данной команды приведено в таблице.
Поле | Описание |
---|---|
Peer TDP Ident | идентификатор соседа |
Local TDP Ident | идентификатор маршрутизатора |
TCP connection | содержит информацию о соединении TCP между локальным маршрутизатором и соседом |
State | состояние соединения, кратковременно может менять свое значение на отличные от Oper (Operational) |
Downstream | тип обмена метками, может быть Downstream, как сейчас и Downstream on demand |
Uptime | время существования сессии |
PIEs sent/rcvd | количество переданных пакетов. В случае протокола LDP название этого поля будет изменено на Msgs sent/rcvd |
TDP discovery sources | информацию через какой интерфейс доступен сосед и какой у него IP адрес. Addresses bound to peer TDP Ident: известные адреса для этой TDP/LDP сессии. Информация об этих адресах берется из LFIB |
В случае использования LDP все упоминания TDP будут заменены на LDP.
Есть возможность указать маршрутизатору соседа вручную командой mpls ldp neighbor . Однажды пришлось использовать эту команду при нежелании двух маршрутизаторов друг друга находить по LDP/TDP. Команда использовалась как временная мера, так как последующая замена IOSa на одном из них решила эту проблему. Команда mpls ldp neighbor используется также в целях повышении безопасности, так как позволяет установить пароль на сессию для соседа (рекомендовано использовать MD5) mpls ldp neighbor ip-address password [ 0-7 ] password-string .
Узнать параметры протокола распространения меток вы можете, выполнив команду show mpls ldp parameters
В выводе команды show mpls ldp parameters выводится информация о версии протокола, диапазоне используемых меток, временных параметрах протоколов TDP/LDP. Поле TDP for targeted sessions зависит от команды mpls ldp targeted-sessions . Эта команда используется для установление сессии между маршрутизаторами не соединенными прямым каналом. В результате маршрутизатор опрашивает соседей перечисленных в этой команде не многоадресной рассылкой, а одноадресными пакетами. Параметры LDP backoff командой mpls ldp backoff . Параметр Session hold time можно изменить командой mpls ldp hold-time .
Замечу, что механизм предотвращения колец (LDP loop detection) выключен потому, что этим по идее должен протокол маршрутизации заниматься. Этот механизм можно включить командой mpls ldp loop-detection и используется он, как правило, в сетях ATM совместно с механизмом Downstream on demand.
Временные параметры можно изменить командой mpls ldp discovery . При этом возможно указание разных параметров для разных соседей.
Настройка VRF
Вернемся к полигону. Настроим маршрутизатор Router_A для работы в MPLS сети с VPN vpn_1.
Для определения VPN комплекса маршрутизации на маршрутизаторе Router_A для VPN vpn_1 выполним следующие действия:
Назначим имя vrf :
Назначим Route Distinguisher:
Можно RD конфигурировать одним из двух форматов:
- 16-bit номер AS: 32-bit номер. Пример, 101:3.
- 32-bit IP адрес: 16-bit номер. Пример, 192.168.122.15:1.
Указать какие сообщества маршрутов должен импортировать и экспортировать vrf:
Подход к формированию значения RT такой же, как и к RD.
Возможно использование различных правил обработки для импортируемых маршрутов с помощью команды import map route-map. Необходимо помнить, что параметры VRF локальны и распространяются только на конфигурируемый маршрутизатор.
Указать интерфейсы, входящие в vrf комплекс, используя команду ip vrf forwarding vrf-name :
Так как при связывание интерфейса с vrf удаляется адрес интерфейса (о чем IOS радостно сообщает) назначаем интерфейсу адрес:
Теперь можно посмотреть таблицу маршрутизации vrf vpn_1, используя команду show ip route vrf vpn_1:
Таким же образом настраиваем остальные интерфейсы.
Настройка MP-BGP
Теперь необходимо сконфигурировать обмен маршрутной информацией vrf между PE маршрутизаторами. Для этого надо настроить протокол маршрутизации MP-BGP.
Назначаем номер автономной системы:
Назначаем идентификатор для BGP. Обычно это, как в примере, адрес интерфейса Loopback0:
Отключаем одноадресатные аносы префиксов протокола IPv4. Теперь BGP будет переносить только информацию о VRF:
Описываем соседа по протоколу BGP. IP адрес 10.108.254.40 принадлежит маршрутизатору Router_C на котором будет настроен рефлектор маршрутной информации. Настройка рефлектора маршрутной информации будет рассмотрена ниже, а на этом этапе рассмотрим вариант точка-точка:
Посылать пакеты будем от имени Loopback0:
Поднимаемся в режим конфигурирования VPN:
Разрешаем обмен информацией с соседом 10.108.254.40:
Разрешаем рассылку только расширенных атрибутов BGP:
При настройке маршрутизатора Router_C мы получим следующую конфигурацию:
После ввода команды neighbor 10.108.254.39 send-community extended не стоит удивляться отсутствию каких либо изменений в таблице маршрутизации vrf vpn_1. Протокол BGP торопливостью не отличается и на данном полигоне время, затрачиваемое на обмен маршрутной информацией, доходило до 15 секунд.
Обмен маршрутной информацией между PE осуществляется через протокол MP-BGP. Самый простой вариант настроить соединения точка-точка между маршрутизаторами PE. За простоту приходится платить сложностью администрирования. Второй вариант заключается в настройке двух(редко более) маршрутизаторов как рефлекторов маршрутной информации. Режим рефлектора включается для каждого соседа BGP командой neighbor x.x.x.x|peer-group route-reflector-client. Так как настройки для большинства соседей BGP однотипны, рекомендовано объединять соседей в группы, а уже группам присваивать необходимые настройки. На полигоне в качестве рефлектора настроен маршрутизатор Router_C. Рассмотрим настройку протокола BGP на маршрутизаторе Router_C
#запускаем процесс маршрутизации BGP для автономной системы 1.
#назначаем идентификатор маршрутизатора для протокола BGP
#Отключаем передачу одноадресатных анонсов протокола IPv4. Сейчас BGP будет переносить информацию только о VPNах.
#Объявляем группу соседей clients
#Объявляем, что члены группы clients принадлежат автономной системе 1.
#Весь обмен с членами группы clients будет происходить от адреса интерфейса Loopback0
#10.108.253.252 объявляется членом группы clients
#Объявляется группа clients
#Для всех членов группы clients маршрутизатор Rooter_C является отражателем маршрутной информации
#Разрешить посылать расширенные атрибуты членам группы clients
#Настройка BGP для vpn_1 #передавать информацию о маршрутах vpn_1 в процесс EIGRP 3
Кстати, очень много интересной информации можно получить из вывода команды show ip bgp vpnv4 all:
Команда выводит содержимое таблицы BGP на маршрутизаторе.
Вывод команды show ip bgp vpnv4 all на маршрутизаторе Router_A:
Присутствие в Status Code значение r указывает на наличие маршрута в таблице BGP при отсутствии его в таблице маршрутизации VRF. Рассмотрение причин этого явления выходит за рамки этой статьи.
Настройка маршрутизации между PE-CE по протоколу EIGRP
Настраиваем маршрутизации между PE и CE:
Объявляем семейств адресов vrf vpn_1:
Разрешаем перераспределять маршруты из BGP в EIGRP, без указания метрики EIGRP будем назначать полученным маршрутам метрику infinity, то есть бесконечность:
Указываем номер автономной системы для процесса маршрутизации для vrf vpn_1:
Настроим bgp для vrf vpn_1:
Объявлем семейство адресов vpn_1 для bgp:
Настраиваем обмен маршрутов в MP-BGP:
Отключаем синхронизацию:
Конфигурация маршрутизатора CE Router_M
На данном этапе маршрутизаторы Router_M и Router_A установили соседские отношения между собой по протоколу EIGRP, используя номер процесс 3. Выполнив команду show ip eigrp neighbors на маршрутизаторе Router_M и команду show ip eigrp vrf vpn_1 neighbors на маршрутизаторе Router_A, мы удостоверимся в этом. Команда show ip route vrf vpn_1 выполняемая на маршрутизаторе Router_A покажет таблицу маршрутизации для vrf vpn_1. Команды show ip cef vrf vpn_1 и show ip vrf vpn_1 выведут, соответственно, таблицу CEF для vrf vpn_1 и общую информацию о vrf vpn_1.
Также маршрутизаторы Router_C и Router_A установили соседские отношения по протоколу BGP и обменялись необходимой информацией.
Настройка vpn_3 аналогична настройке vpn_1, конфигурация маршрутизаторов Router_B, Router_C приведена ниже:
Приводить конфигурацию маршрутизаторов Router_K, Router_D не вижу смысла, так как она принципиально не отличается от конфигурации маршрутизатора Router_M. Как видно из конфигураций vrf vpn_3 использует номер процесса 2 для работы с CE по EIGRP.
Можно объединить два VPN разрешив взаимный импорт маршрутной информации.
Необходимо помнить, что настройки vrf локальны, то есть если взаимный импорт настроен только на одном маршрутизаторе Router_C, то между собой будут работать пользователи VPNов, подключенные к маршрутизатору Router_C.
Конфигурация Router_C
Разумеется, такое объединение разных VPNов возможно при отсутствии перекрывающихся адресных пространств в обоих VPNах. Иначе необходимо использовать NAT.
PE-CE соединение с использованием OPSF.
В этом случае канал PE-CE помещается в Зону 0. CE маршрутизатор становится для маршрутизаторов C ABR. ABR будет собирать информацию о маршрутах с других зон и передавать ее PE. PE маршрутизатор становится ASBR для облака OSPF-MPLS/VPN. CE и PE обмениваются между собой LSA, которые PE создает на основе полученной из MP-iBGP информации.
В отличии от EIGRP, OSPF на каждый vrf запускает отдельные копии своих процессов, что требует больших, по сравнению с EIGRP, ресурсов маршрутизатора.
Конфигурация Router_F.
#Настраиваем перераспределение маршрутов. Рекомендуется жестко устанавливать ID OSPF командой router-id a.b.c.d.
#Для BGP настройка отличается только в настройке перераспределения маршрутов.
Вывод команды show ip ospf на маршрутизаторе Router_F.
В этом примере важна строка Connected to MPLS VPN Superbackbone, показывающая, что OSPF корректно увидел MPLS/VPN. При этом команда show ip protocols показывает информацию по протоколам маршрутизации, работающим во вне VPN.
Вывод команды show ip protocols на маршрутизаторе Router_F.
Также как мы объединяли VPNы с EIGRP, можно объединить VPNы с разными протоколами IGP, например, vpn_1 и vpn_2.
Конфигурация Router_I.
Конфигурация Router_A.
Для импорта маршрутной информации не имеет значения, каким образом маршруты попали в MP-BGP.
Вывод команды show ip route vrf vpn_2
В выводе команды видно присутствие в таблице маршрутизации маршрутов из vpn_1 (10.111.1.0/24, 10.112.12.0/24 и тд).
Теперь рассмотрим вариант использования протокола OSPF без Зоны 0. У нас немного изменится логическая топология полигона на маршрутизаторах, работающих с OSPF (см рис. 2). Остальные маршрутизаторы изменения не затронут, поэтому они скрыты облаком MPLS backbone.
Принципиально конфигурирование в этом случае мало отличается от предыдущего, поэтому перейдем сразу к конфигурациям маршрутизаторов Router_F, Router_I:
Конфигурация маршрутизатора Router_F
Конфигурация маршрутизатора Router_I
Вывод команды show ip route vrf vpn_2
Как видно, мало что изменилось.
PE-CE соединение с использованием RIP.
В этом случае все очень похоже на EIGRP, только отсутствует необходимость указывать номер процесса и другие значения метрик. Так как никаких сложностей здесь, на мой взгляд нет, подробных комментариев не будет.
Конфигурация соединения PE-CE на маршрутизаторе Router_B
Источник