Показаны сообщения с ярлыком Cisco BGP. Показать все сообщения
Показаны сообщения с ярлыком Cisco BGP. Показать все сообщения

суббота, 2 августа 2014 г.

Настройка MPLS на Cisco. Часть №2

Как обычно, для общей теории предлагаю вам обратиться к интернету, я же начну с примера и по ходу повествования буду пояснять непонятные вещи :).
Представим себя, ненадолго, провайдером. У нас имеется в распоряжении группа роутеров расположенных на определенной территории, между которыми настроено сетевое взаимодействие. К нам обратились два клиента и попросили организовать связь между их подразделениями, находящимися на приличном удалении друг от друга. Причем оказалось, что у этих клиентов существует уже настроенная IP – адресация, от которой они не хотят отказываться и, мало того, она пересекается.
Для реализации такой задачи простыми методами не обойтись. Вот тут и появляются нам на помощь технологии VRF и MPLS (конечно же, можно использовать и другие способы, например, IPsec VPN, но это уже темы других постов). По большому счету, технология VRF близка к понятию VPN. Но VPN – это принцип объединения узлов клиента, находящихся под единым административным подчинением, через публичную сеть оператора, а VRF – это больше описание VPN в приделах одного устройства, которое включает в себя атрибуты и правила распространения маршрутной информации, отдельную таблицу маршрутизации и так далее. Другими словами, VRF-ы делят один физический роутер, на определенное количество виртуальных роутеров, которые работают независимо друг от друга. Таким образом получается, что сколько у нас будет запланировано VPN-ов, столько VRF-ов нам необходимо будет создать на устройстве.
Собравшись с мыслями, обдумав, как решить такую задачу, появилось вот такое решение, которое я и предлагаю вам сегодня реализовать:


    Что мы имеем:
  • Router_1 и Router_5 – Customer Edge (CE) роутеры, к которым подключены клиентские сети.
  • Router_2 и Router_4 – роутеры на границе MPLS домена (ELSR – Edge Label Switch Router или PE – Provider Edge router).
  • Router_3 – роутер, находящийся внутри домена MPLS (LSR – Label Switch Router или P – Provider router).
  • Host_1 – пользователь для проверки от клиента №1 (IP – 192.168.1.10/24).
  • Host_2 – пользователь для проверки от клиента №2 (IP – 172.16.1.10/24).
Клиент №1 имеет у себя сети с адресацией из следующих диапазонов: 172.16.1.0/24 и 192.168.2.0/24. Клиент №2 имеет у себя сети с адресацией из следующих диапазонов: 172.16.1.0/24 и 192.168.2.0/24. Для сетей клиентов мы будем использовать sub – интерфейсы на CE роутерах. Клиент №1 будет относиться к VRF_A, клиент №2 будет относиться к VRF_B. На CE роутерах прописаны default маршруты в сторону ELSR-ов (на ELSR роутерах прописаны статические маршруты в обратную сторону к сетям клиентов).
Для организации сетевой доступности внутри MPLS домена используется протокол маршрутизации OSPF. Для обмена маршрутной информацией VRF-ов между ELSR-ми используется протокол MP-BGP.
Зачем же нужен MPLS, спросите вы? А он нам понадобится для того, чтобы перенести данные протокола BGP, работающего между ELSR-ми.
Рассмотрим следующую ситуацию. Нам нужно добраться из сети 192.168.1.0/24 в сеть 172.16.1.0/24 (сети клиента №1, VRF_A). Согласно статическому маршруту на Router_1 пакет долетит до Router_2, который, в свою очередь, согласно информации от протокола BGP, отправит его в сторону Router_4. По внутреннему протоколу маршрутизации (OSPF) Router_2 знает, что его сосед по BGP Router_4 находится за роутером Router_3. И тут произойдет следующее, Router_3, приняв пакет, просто отбросит его, так как он не знает о сети 172.16.1.0/24. Почему так произойдет? А потому, что Router_3 не участвует в процессе BGP. Чтобы этого не случилось, на нем тоже надо включать этот протокол (об этом можно посмотреть в моем посте по настройке протокола BGP, я затрагивал там эту тему в общих чертах). Это в наши планы не входит (это только тут у нас один роутер, а в реальной сети их может быть очень много и включать на каждом роутере BGP как то не хочется).
Вот тут то и приходит нам на помощь MPLS. Именно организовав MPLS домен, мы сможем обеспечить быстрый проброс информации BGP между нужными нам точками без включения самого протокола на всех роутерах.
Как будет работать пример выше после того, как мы настроим MPLS? Теперь, приняв пакет, Router_2 (ELSR) поймет, что он относится к VRF_A, пометит его 2-мя метками и отправит дальше. Первая метка будет использоваться для коммутации этого пакета при прохождении его по MPLS домену. Вторая метка, будет использоваться либо для идентификации нужного VRF, либо для идентификации интерфейса, куда надо будет послать пакет дальше на конечном ELSR (Router_4). При настроенном PHP (Penultimate Hop Popping) первая метка будет снята с пакета на последнем роутере, стоящем перед ELSR (в нашем случае на Router_3). Таким образом, Router_4 примет пакет уже с одной меткой, которая поможет ему определить, куда отправить пакет. В итоге, пакет благополучно дойдет до адресата.
Надеюсь, немного разобрались. Перейдем непосредственно к настройкам. Как всегда, начнем с организации обычной сетевой доступности.
Настроим сначала CE роутеры Router_1 и Router_5.
Router_1:

R1>en
R1#conf t
R1(config)#hostname Router_1
Router_1(config)#int loopback 0
Router_1(config-if)#ip address 10.10.10.10 255.255.255.255
Router_1(config-if)#exit
Router_1(config)#int fa 0/0.3
Router_1(config-subif)#encapsulation dot1Q 3 – создаем sub-интерфейс;
Router_1(config-subif)#ip address 192.168.1.1 255.255.255.0
Router_1(config-subif)#exit
Router_1(config)#int fa 0/0
Router_1(config-if)#no sh
Router_1(config-if)#no shutdown
Router_1(config-if)#exit
Router_1(config)#int fa 1/0
Router_1(config-if)#ip address 1.1.1.2 255.255.255.252
Router_1(config-if)#exit
Router_1(config)#ip route 0.0.0.0 0.0.0.0 1.1.1.1 – прописываем маршрут по умолчанию;
Router_1(config)#exit
Router_1#wr
Router_1#

Router_5:

R5>en
R5#conf t
R5(config)#hostname Router_5
Router_5(config)#int loopback 0
Router_5(config-if)#ip address 50.50.50.50 255.255.255.255
Router_5(config-if)#exit
Router_5(config)#int fa 0/0.4
Router_5(config-subif)#encapsulation dot1Q 4
Router_5(config-subif)#ip address 172.16.1.1 255.255.255.0
Router_5(config-subif)#exit
Router_5(config)#int fa 0/0
Router_5(config-if)#no shutdown
Router_5(config-if)#exit
Router_5(config)#int fa 1/0
Router_5(config-if)#ip address 4.4.4.2 255.255.255.252
Router_5(config-if)#no shutdown
Router_5(config-if)#exit
Router_5(config)#ip route 0.0.0.0 0.0.0.0 4.4.4.1
Router_5(config)#exit
Router_5#wr
Router_5#

Теперь перейдем к роутерам, которые, впоследствии, будут подключены к MPLS домену.
Router_2:

R2>en
R2#conf t
R2(config)#hostname Router_2
Router_2(config)#int loopback 0
Router_2(config-if)#ip address 20.20.20.20 255.255.255.255
Router_2(config-if)#exit
Router_2(config)#int fa 0/0
Router_2(config-if)#ip address 1.1.1.1 255.255.255.252
Router_2(config-if)#no shutdown
Router_2(config-if)#exit
Router_2(config)#int fa 1/0
Router_2(config-if)#ip address 2.2.2.1 255.255.255.252
Router_2(config-if)#no shutdown
Router_2(config-if)#exit
Router_2(config)#int fa 2/0
Router_2(config-if)#ip address 192.168.2.1 255.255.255.0
Router_2(config-if)#no shutdown
Router_2(config-if)#exit
Router_2(config)#router ospf 1 – настраиваем внутренний протокол маршрутизации (OSPF);
Router_2(config-router)#passive-interface default
Router_2(config-router)#no passive-interface fa 1/0
Router_2(config-router)#network 20.20.20.20 0.0.0.0 area 0
Router_2(config-router)#network 2.2.2.0 0.0.0.3 area 0
Router_2(config-router)#exit
Router_2(config)#ip route 192.168.1.0 255.255.255.0 1.1.1.2
Router_2(config)#exit
Router_2#wr
Router_2#

Router_3:

R3>en
R3#conf t
R3(config)#hostname Router_3
Router_3(config)#int loopback 0
Router_3(config-if)#ip address 30.30.30.30 255.255.255.255
Router_3(config-if)#exit
Router_3(config)#int fa 0/0
Router_3(config-if)#ip address 2.2.2.2 255.255.255.252
Router_3(config-if)#no shutdown
Router_3(config-if)#exit
Router_3(config)#int fa 1/0
Router_3(config-if)#ip address 3.3.3.2 255.255.255.252
Router_3(config-if)#no shutdown
Router_3(config-if)#exit
Router_3(config)#router ospf 1
Router_3(config-router)#network 30.30.30.30 0.0.0.0 area 0
Router_3(config-router)#network 2.2.2.0 0.0.0.3 area 0
Router_3(config-router)#network 3.3.3.0 0.0.0.3 area 0
Router_3(config-router)#exit
Router_3(config)#exit
Router_3#wr
Router_3#

Router_4:

R4>en
R4#conf t
R4(config)#hostname Router_4
Router_4(config)#int loopback 0
Router_4(config-if)#ip address 40.40.40.40 255.255.255.255
Router_4(config-if)#exit
Router_4(config)#int fa 0/0
Router_4(config-if)#ip address 3.3.3.1 255.255.255.252
Router_4(config-if)#no shutdown
Router_4(config-if)#exit
Router_4(config)#int fa 1/0
Router_4(config-if)#ip address 4.4.4.1 255.255.255.252
Router_4(config-if)#no shutdown
Router_4(config-if)#exit
Router_4(config)#int fa 2/0
Router_4(config-if)#ip address 172.16.1.1 255.255.255.0
Router_4(config-if)#no shutdown
Router_4(config-if)#exit
Router_4(config)#router ospf 1
Router_4(config-router)#passive-interface default
Router_4(config-router)#no passive-interface fa 0/0
Router_4(config-router)#network 40.40.40.40 0.0.0.0 area 0
Router_4(config-router)#network 3.3.3.0 0.0.0.3 area 0
Router_4(config-router)#exit
Router_4(config)#ip route 172.16.1.0 255.255.255.0 4.4.4.2 – не волнуйтесь насчет этого маршрута, он немного будет немного переделан при настройке VFR-ов, сейчас он нужен чисто для вида;
Router_4(config)#exit
Router_4#wr
Router_4#

Остановимся и посмотрим, что мы имеем на данный момент. Зайдем на Router_2:


Видим, что OSPF работает. Сетевая доступность присутствует. Сеть 172.16.1.0/24 пока не доступна.
Посмотрим, куда может «достучаться» Host_1:


Шлюз доступен (1), доступен IP – адрес, смотрящий в сторону Router_3, сеть 172.16.1.0/24 так же пока не доступна (3).
Двигаемся дальше. Так как VRF-ы настраиваются локально на устройстве, то их надо настроить только на роутерах Router_2 и Router_4. Возвращаемся на Router_2:

Router_2#conf t
Router_2(config)#ip vrf VRF_A – создаем первый VRF;
Router_2(config-vrf)#rd 1:1 – задаем уникальный идентификатор, который будет использоваться для определения принадлежности маршрутной информации тому или иному VPN-у. Он может задаваться двумя способами: 16-bit номер: 32-bit номер (пример, 1:3) или 32-bit IP адрес: 16-bit номер (пример, 172.16.1.1:1);
Router_2(config-vrf)#route-target export 1:1 – определяем идентификатор, описывающий правила экспорта маршрутов (сети, которые будут выходить из данного VRF (можно настроить передачу сетей между VRF-ми));
Router_2(config-vrf)#route-target import 1:1 – определяем идентификатор, описывающий правила импорта маршрутов (сети, которые будут входить в данный VRF (можно настроить передачу сетей между VRF-ми));
Router_2(config-vrf)#exit
Router_2(config)#ip vrf VRF_B
Router_2(config-vrf)#rd 2:1
Router_2(config-vrf)#route-target export 2:1
Router_2(config-vrf)#route-target import 2:1
Router_2(config-vrf)#exit
Router_2(config)#int fa 0/0
Router_2(config-if)#ip vrf forwarding VRF_A – назначаем принадлежность интерфейса нужному VRF-у;
% Interface FastEthernet0/0 IP address 1.1.1.1 removed due to enabling VRF VRF_A – при назначении интерфейса в VRF с него снимается IP-адрес (если он был настроен);
Router_2(config-if)#ip address 1.1.1.1 255.255.255.252 – заново назначаем IP-адрес на интерфейсе;
Router_2(config-if)#exit
Router_2(config)#int fa 2/0
Router_2(config-if)#ip vrf forwarding VRF_B
% Interface FastEthernet2/0 IP address 192.168.2.1 removed due to enabling VRF VRF_B
Router_2(config-if)#ip address 192.168.2.1 255.255.255.0
Router_2(config-if)#exit
Router_2(config)#no ip route 192.168.1.0 255.255.255.0 1.1.1.2 –убираем статический маршрут из общей конфигурации;
Router_2(config)#ip route vrf VRF_A 192.168.1.0 255.255.255.0 1.1.1.2 –добавляем этот маршрут в нужный VRF;
Router_2(config)#exit
Router_2#wr
Router_2#

Теперь Router_4:

Router_4>en
Router_4#conf t
Router_4(config)#ip vrf VRF_A
Router_4(config-vrf)#rd 1:1
Router_4(config-vrf)#route-target both 1:1 – вместо двух команд (смотри выше), можно использовать одну. Результат один и тот же;
Router_4(config-vrf)#exit
Router_4(config)#ip vrf VRF_B
Router_4(config-vrf)#rd 2:1
Router_4(config-vrf)#route-target both 2:1
Router_4(config-vrf)#exit
Router_4(config)#int fa 1/0
Router_4(config-if)#ip vrf forwarding VRF_B
Router_4(config-if)#ip address 4.4.4.1 255.255.255.252
Router_4(config-if)#exit
Router_4(config)#int fa 2/0
Router_4(config-if)#ip vrf forwarding VRF_A
Router_4(config-if)#ip address 172.16.1.1 255.255.255.0
Router_4(config-if)#exit
Router_4(config)#no ip route 172.16.1.0 255.255.255.0 4.4.4.2
Router_4(config)#ip route vrf VRF_B 172.16.1.0 255.255.255.0 4.4.4.2
Router_4(config)#exit
Router_4#wr
Router_4#

Итак, VRF-ы настроены. Теперь, для того чтобы выполнить команду ping с этих роутеров, нужно добавлять параметр VRF. Выглядит это так: ping vrf VRF_A 192.168.1.1.
Двигаемся дальше. Теперь настроим BGP соседство между этими роутерами и определим сети, которыми они должны обмениваться (определим политику редистрибуции). Если со статическими маршрутами все понятно, то для сетей 192.168.2.0/24 (Router_2) и 17216.1.0/24 VRF_A (Router_4), которые являются directly connected, следует создать route-map, согласно которому в BGP будут попадать только они (так как помимо них есть еще и другие directly connected сети). Так же в этом блоке настроим связку BGP и VRF.
Снова возвращаемся на Router_2:

Router_2#conf t
Router_2(config)#ip access-list extended FOR_BGP – создаем список доступа, согласно которому пропускаться будет только нужная нам сеть;
Router_2(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 any –определяем эту сеть;
Router_2(config-ext-nacl)#deny ip any any – запрещаем все остальное;
Router_2(config-ext-nacl)#exit
Router_2(config)#route-map PERMIT_CONNECTED permit 10 – создаем «пропускающую» route-map;
Router_2(config-route-map)#match ip address FOR_BGP – привязываем к ней список доступа;
Router_2(config-route-map)#exit
Router_2(config)#router bgp 6500 – включаем процесс BGP и определяем номер AS;
Router_2(config-router)#no auto-summary – выключаем автоматическое суммирование маршрутов (если включено);
Router_2(config-router)#no synchronization – выключаем синхронизацию (если включена);
Router_2(config-router)#neighbor 40.40.40.40 remote-as 6500 –прописываем IP-адрес соседа, находящегося в этой же AS;
Router_2(config-router)#neighbor 40.40.40.40 update-source loopback 0 –указываем, что в качестве источника обновлений информации будет выступать IP-адрес loopback 0 интерфейса;
Router_2(config-router)#bgp router-id 20.20.20.20 – определяем ID роутера в процессе BGP;
Router_2(config-router)#address-family vpnv4 – переходим в режим конфигурирования VPN;
Router_2(config-router-af)#neighbor 40.40.40.40 activate – активируем ранее указанного «соседа» (разрешаем обмен информацией);
Router_2(config-router-af)#neighbor 40.40.40.40 send-community extended – включаем рассылку расширенных атрибутов BGP;
Router_2(config-router-af)#exit-address-family – выходим из этого режима;
Router_2(config-router)#address-family ipv4 vrf VRF_A – определяем семейство адресов для данного VRF-а;
Router_2(config-router-af)#redistribute static – указываем, что для данного VRF-а для объявления использовать адреса сетей, полученные через редистрибуцию статических маршрутов;
Router_2(config-router-af)#exit-address-family
Router_2(config-router)#address-family ipv4 vrf VRF_B
Router_2(config-router-af)#redistribute connected route-map PERMIT_CONNECTED – указываем, что для данного VRF-а для объявления использовать адреса сетей, полученные через редистрибуцию connected маршрутов, соответствующих ранее настроенной route-map;
Router_2(config-router-af)#exit-address-family
Router_2(config-router)#exit
Router_2(config)#exit
Router_2#wr
Router_2#

Теперь Router_4:

Router_4#conf t
Router_4(config)#ip access-list extended FOR_BGP
Router_4(config-ext-nacl)#permit ip 172.16.1.0 0.0.0.255 any
Router_4(config-ext-nacl)#deny ip any any
Router_4(config-ext-nacl)#exit
Router_4(config)#route-map PERMIT_CONNECTED permit 10
Router_4(config-route-map)#match ip address FOR_BGP
Router_4(config-route-map)#exit
Router_4(config)#router bgp 6500
Router_4(config-router)#no auto-summary
Router_4(config-router)#no synchronization
Router_4(config-router)#neighbor 20.20.20.20 remote-as 6500
Router_4(config-router)#neighbor 20.20.20.20 update-source loopback 0
Router_4(config-router)#bgp router-id 40.40.40.40
*Mar 1 05:29:56.526: %BGP-5-ADJCHANGE: neighbor 20.20.20.20 Up
Router_4(config-router)#address-family vpnv4
Router_4(config-router-af)#neighbor 20.20.20.20 activate
*Mar 1 05:31:24.206: %BGP-5-ADJCHANGE: neighbor 20.20.20.20 Down Address family activated
*Mar 1 05:31:26.342: %BGP-5-ADJCHANGE: neighbor 20.20.20.20 Up –соседство установилось;
Router_4(config-router-af)#neighbor 20.20.20.20 send-community extended
Router_4(config-router-af)#exit-address-family
Router_4(config-router)#address-family ipv4 vrf VRF_A
Router_4(config-router-af)#redistribute connected route-map PERMIT_CONNECTED
Router_4(config-router-af)#exit-address-family
Router_4(config-router)#address-family ipv4 vrf VRF_B
Router_4(config-router-af)#redistribute static
Router_4(config-router-af)#exit-address-family
Router_4(config-router)#exit
Router_4(config)#exit
Router_4#wr
Router_4#

Проверим, что у нас есть на данный момент. Зайдем на Router_2:


Как видно из рисунка, на роутере присутствуют две разные таблицы маршрутизации для соответствующих VRF-ов. «Сосед» по BGP тот, который нужен. Но помимо этих двух таблиц, существует и третья общая таблица (не относящаяся ни к одному из VRF). Она сформирована с использованием протокола OSPF, и по ней видно, как добраться до роутера Router_4 (40.40.40.40):


Видно, что путь к Router_4 лежит через Router_3. По идее, должно все работать, но если вы попробуете сделать команду ping с Host_1 на адрес удаленной сети 172.16.1.1/24:


то у вас ничего не получиться (2). Напомню, это происходит из-за того, что Router_2 не знает о сети 172.16.1.0/24 (да и о других сетях тоже). Из рисунка также можно проследить работу VRF. Ping на IP-адрес Router_2 (1), находящийся в VRF_A, проходит, а вот на IP-адрес, находящийся в VRF_B (3), роутер возвращает ответ, что он не знает о такой сети («Заданный узел недоступен»).
Теперь перейдем к окончательной настройке нашей сети. Настроим MPLS на роутерах провайдера. Начнем с Router_2:

Router_2#conf t
Router_2(config)#mpls ip – глобально включаем MPLS;
Router_2(config)#mpls label protocol ldp – определяем протокол для обмена метками;
Router_2(config)#mpls ldp router-id loopback 0 – указываем ID роутера для использования в MPLS домене;
Router_2(config)#int fa 1/0
Router_2(config-if)#mpls ip – включаем MPLS на интерфейсе;
Router_2(config-if)#mpls mtu 1512 – увеличиваем размер mtu для MPLS;
Router_2(config-if)#exit
Router_2(config)#exit
Router_2#wr
Router_2#

Теперь Router_3:

Router_3#conf t
Router_3(config)#mpls ip
Router_3(config)#mpls label protocol ldp
Router_3(config)#mpls ldp router-id loopback 0
Router_3(config)#int fa 0/0
Router_3(config-if)#mpls ip
*Mar 1 02:35:28.639: %LDP-5-NBRCHG: LDP Neighbor 20.20.20.20:0 (1) is UP – соседство по протоколу LDP установилось;
Router_3(config-if)#mpls mtu 1512
Router_3(config-if)#exit
Router_3(config)#int fa 1/0
Router_3(config-if)#mpls ip
Router_3(config-if)#mpls mtu 1512
Router_3(config-if)#exit
Router_3(config)#exit
Router_3#wr
Router_3#

И Router_4:

Router_4#conf t
Router_4(config)#mpls ip
Router_4(config)#mpls label protocol ldp
Router_4(config)#mpls ldp router-id loopback 0
Router_4(config)#int fa 0/0
Router_4(config-if)#mpls ip
*Mar 1 02:37:52.559: %LDP-5-NBRCHG: LDP Neighbor 30.30.30.30:0 (1) is UP
Router_4(config-if)#mpls mtu 1512
Router_4(config-if)#exit
Router_4(config)#exit
Router_4#wr
Router_4#


Ну вот, вроде и все :). Теперь давайте все проверим. Сделаем ping с конечных хостов, посмотрим, что твориться на роутерах и отловим парочку пакетов :).
Host_1 и Host_2:


Видно, что Host_2 успешно ping-ует удаленную сеть (1) (192168.2.0/24), которая относится, как и он сам, к VRF_B. Ping на IP-адрес из другого VRF_A не проходит (2). Host_1 успешно «достукивается» до сети 172.16.1.0/24 (3) и не может попасть в сеть, где находится Host_2 (4), так как это уже другой VRF (хоть IP - адресация в этой сети такая же).
Что есть на Router_2 и Router_4:


Как видно из рисунка, все работает. MPLS пометила нужные маршруты (в графе «Outgoing» видны сети, которые относятся к VFR-ам, помеченные символом «V»; параметр «Untaged» означает, что данная сеть доступна через НЕ MPLS интерфейс и пакет, адресованный ей, после снятия метки будет отправлен основываясь на обычной таблице маршрутизации (FIB), «Aggregate» означает, что сеть появилась через редистрибуцию directly connected сетей), видны таблицы маршрутизации BGP для каждого VRF-а. Так же, обычные таблицы маршрутизации VRF_A и VRF_B содержат нужные маршруты.
Теперь посмотрим на содержимое пакетов. Отловим пакет ICMP request от Host_1 в сторону 172.16.1.1 на интерфейсе Router_2 (Int Fa 1/0), смотрящем в сторону Router_3:


Присутствуют две метки. №17 (1) – метка, используемая для доставки пакета по MPLS домену. №21 (1) – метка, используемая для идентификации VRF-а (или интерфейса, через который далее отправлять пакет). Если вы посмотрите на предыдущий рисунок, то в таблице LFIB роутера Router_4 заметите, что метке №21 соответствует directly connected сеть 172.16.1.0/24.
Посмотрим на тот же пакет уже на входе в роутер Router_4 (Int Fa 0/0):


Видно, что метка №17 уже снята и осталась только метка с №21. Согласно таблице LFIB у нее стоит параметр «Aggregate», это означает, что данная сеть попала через редистрибуцию directly connected сетей в BGP. Router_4 снимет эту метку, определит, что она относится к VRF_A и отправит пакет по месту назначения.
ICMP reply обрабатывается таким же образом, только в другую сторону. На Router_4 навешиваются две метки (одна для продвижения пакета по MPLS домену, вторая для идентификации VRF-а на другой стороне и так далее).
Для сравнения, давайте еще посмотрим на пакет ICMP reply от Router_2, идущий обратно на ICMP request от Host_2 на роутере Router_4 (Int Fa 0/0):


Видно, что метка уже имеет значение №22. Теперь Router_4, согласно своей таблице LFIB видит, что пакет соответствует VRF_B и, после снятия метки, его следует отправить через интерфейс Int Fa 1/0 (next hop 4.4.4.2).
Ну что же, осилили :). Поздравляю вас!!! Все работает.
На этом, я хочу закончить этот пост. Как всегда надеюсь, что он был для вас познавательным, не скучным и информативным.

Источник: go-to-easyit.com/2012/04/mpls-cisco-2.html

Настройка MPLS на Cisco. Часть №1

Немного теории (в определениях и моём понимании этой технологии :)). 
MPLS — (англ. Multiprotocol Label Switching) — мультипротокольная коммутация по меткам. Если рассматривать модель OSI, то данную технологию теоретически можно расположить между вторым и третьим уровнями. 
Технология MPLS должна «подниматься» на уже существующей и нормально функционирующей IP сети, так как она использует таблицу маршрутизации (FIB - Forwarding Information Base).
Принцип работы заключается в том, что после организации IP связности, на роутерах включается MPLS. Каждому маршруту присваивается метка. Происходит формирование таблицы меток (LIB - MPLS Label Information Base), которая содержит информацию обо всех существующих метках (даже о метках, которые могут и не использоваться). После этого, каждый роутер формирует для себя другую таблицу (LFIB - MPLS Label Forwarding Information Base), согласно которой он уже и будет осуществлять передачу трафика. Другими словами, роутеру не надо более просматривать свою таблицу маршрутизации (FIB), выбирать маршрут и так далее (если конечно этот маршрут есть в LFIB). Практически получается, что роутер осуществляет коммутацию, а не маршрутизацию, что в свою очередь очень ускоряет работу по доставке трафика в место назначения.
Прелесть еще заключается и в том, что поверх MPLS могут работать различные протоколы 2-го и 3-го уровней.
Но, много погружаться в теорию не будем, так как сетевых решений (Network Solutions) существует много. Остальное можно найти в интернете.
Рассмотрение технологии начнем с общей настройки на обычной Ethernet сети (Задача №1) (так называемый Frame-Mode MPLS, когда метка вставляется внутрь фрейма), затем создадим схему с Layer 2 VPN с инкапсуляцией MPLS (Задача №2), потом погрузимся немного глубже и настроим схему с использованием технологии VRF и MPLS (Задача №3).
Итак, первая схема, которую мы реализуем, будет следующая:


На схеме представлены 4 роутера. Router_1 и Router_4 являются пограничными ELSR - Edge Label Switch Router (иногда их еще называют PE – Provider Edge Router). Они занимаются, с одной стороны, для «навешивания» (pushing) меток при входе пакета в домен MPLS и, с другой стороны, для «снятия» (popping) меток при выходе из домена MPLS. Роутеры Router_2 и Router_3 являются внутренними роутерами домена MPLS и называются LSR - Label Switch Router (второе название P – Provider Router). Они занимаются только передачей пакетов от одного MPLS роутера другому.
Итак, приступим. Для организации сетевой доступности (IP) будем использовать протокол динамической маршрутизации OSPF (почитать про его настройку можно вот в этих постах:№1 и №2). Хосты для проверки расположены в разных сетях.
Начнем с настройки стандартной сетевой доступности. Заходим на роутер Router_1:

R1>en
R1#conf t
R1(config)#hostname Router_1
R1(config)#int loopback 0 – создаем loopback интерфейс;
Router_1(config-if)#ip address 10.10.10.10 255.255.255.255
Router_1(config-if)#exit
Router_1(config)#int fa 0/0
Router_1(config-if)#ip address 192.168.1.1 255.255.255.0
Router_1(config-if)#no sh
Router_1(config-if)#exit
Router_1(config)#int fa 1/0
Router_1(config-if)#ip address 1.1.1.1 255.255.255.252
Router_1(config-if)#no sh
Router_1(config-if)#exit
Router_1(config)#int fa 2/0
Router_1(config-if)#ip address 2.2.2.1 255.255.255.252
Router_1(config-if)#no sh
Router_1(config-if)#exit
Router_1(config)#router ospf 1 – настраиваем протокол динамической маршрутизации OSPF;
Router_1(config-router)#passive-interface default – выберем, на какие интерфейсы отправлять дежурные пакеты OSPF;
Router_1(config-router)#no passive-interface fastEthernet 1/0
Router_1(config-router)#no passive-interface fastEthernet 2/0
Router_1(config-router)#network 192.168.1.0 0.0.0.255 area 1 –определяем сети для объявления;
Router_1(config-router)#network 1.1.1.0 0.0.0.3 area 0
Router_1(config-router)#network 2.2.2.0 0.0.0.3 area 0
Router_1(config-router)#network 10.10.10.10 0.0.0.0 area 0
Router_1(config-router)#exit
Router_1(config)#exit
Router_1#wr
Router_1# 


Роутер Router_2:

R2>en
R2#conf t
R2(config)#hostname Router_2
Router_2(config)#int loopback 0
Router_2(config-if)#ip address 20.20.20.20 255.255.255.255
Router_2(config-if)#exit
Router_2(config)#int fa 0/0
Router_2(config-if)#ip address 1.1.1.2 255.255.255.252
Router_2(config-if)#no sh
Router_2(config-if)#exit
Router_2(config)#int fa 1/0
Router_2(config-if)#ip address 3.3.3.2 255.255.255.252
Router_2(config-if)#no sh
Router_2(config-if)#exit
Router_2(config)#router ospf 1
Router_2(config-router)#network 1.1.1.0 0.0.0.3 area 0
Router_2(config-router)#network 3.3.3.0 0.0.0.3 area 0
Router_2(config-router)#network 20.20.20.20 0.0.0.0 area 0
Router_2(config-router)#exit
Router_2(config)#exit
Router_2#wr
Router_2# 


Роутер Router_3:

R3>en
R3#conf t
R3(config)#hostname Router_3
Router_3(config)#int loopback 0
Router_3(config-if)#ip address 30.30.30.30 255.255.255.255
Router_3(config-if)#exit
Router_3(config)#int fa 0/0
Router_3(config-if)#ip address 2.2.2.2 255.255.255.252
Router_3(config-if)#no sh
Router_3(config-if)#exit
Router_3(config)#int fa 1/0
Router_3(config-if)#ip address 4.4.4.2 255.255.255.252
Router_3(config-if)#no sh
Router_3(config-if)#exit
Router_3(config)#router ospf 1
Router_3(config-router)#network 2.2.2.0 0.0.0.3 area 0
Router_3(config-router)#network 4.4.4.0 0.0.0.3 area 0
Router_3(config-router)#network 30.30.30.30 0.0.0.0 area 0
Router_3(config-router)#exit
Router_3(config)#exit
Router_3#wr
Router_3# 


И роутер Router_4:

R4>en
R4#conf t
R4(config)#hostname Router_4
Router_4(config)#int loopback 0
Router_4(config-if)#ip address 40.40.40.40 255.255.255.255
Router_4(config-if)#exit
Router_4(config)#int fa 0/0
Router_4(config-if)#ip address 3.3.3.1 255.255.255.252
Router_4(config-if)#no sh
Router_4(config-if)#exit
Router_4(config)#int fa 1/0
Router_4(config-if)#ip address 4.4.4.1 255.255.255.252
Router_4(config-if)#no sh
Router_4(config-if)#exit
Router_4(config)#int fa 2/0
Router_4(config-if)#ip address 192.168.2.1 255.255.255.0
Router_4(config-if)#no sh
Router_4(config-if)#exit
Router_4(config)#router ospf 1
Router_4(config-router)#passive-interface default
Router_4(config-router)#no passive-interface fastEthernet 0/0
Router_4(config-router)#no passive-interface fastEthernet 1/0
Router_4(config-router)#network 192.168.2.0 0.0.0.255 area 2
Router_4(config-router)#network 3.3.3.0 0.0.0.3 area 0
Router_4(config-router)#network 4.4.4.0 0.0.0.3 area 0
Router_4(config-router)#network 40.40.40.40 0.0.0.0 area 0
Router_4(config-router)#exit
Router_4(config)#exit
Router_4#wr
Router_4# 


Проверим сетевую доступность. Сделаем ping и tracert с Host_1 на Host_2:


Как видно, сетевая доступность присутствует.
Приступим к настройке MPLS. Снова возвращаемся на роутер Router_1 и добавляем следующие команды:

Router_1#conf t
Router_1(config)#ip cef – включаем Cisco Express Forwarding, технология быстрой коммутации пакетов на 3-ем уровне компании cisco (если не включено);
Router_1(config)#mpls ip – включаем глобально процесс коммутации по меткам (MPLS);
Router_1(config)#mpls label protocol ldp – выбираем протокол, по которому будут обмениваться метками LSR (ELSR) между собой (есть еще TDP, он является проприетарным);
Router_1(config)#mpls ldp router-id loopback 0 – определяем, какой интерфейс (IP-адрес) берется в качестве ID роутера в процессе MPLS;
Router_1(config)#int fa 1/0
Router_1(config-if)#mpls ip – включаем MPLS на интерфейсе;
Router_1(config-if)#mpls mtu 1512 – увеличиваем размер mtu для избегания фрагментации (разбивки) фреймов (стандартный размер 1500);
Router_1(config-if)#exit
Router_1(config)#int fa 2/0
Router_1(config-if)#mpls ip
Router_1(config-if)#mpls mtu 1512
Router_1(config-if)#exit
Router_1(config)#exit
Router_1#wr
Router_1# 


Router_2:

Router_2#conf t
Router_2(config)#ip cef
Router_2(config)#mpls ip
Router_2(config)#mpls label protocol ldp
Router_2(config)#mpls ldp router-id loopback 0
Router_2(config)#int fa 0/0
Router_2(config-if)#mpls ip
Router_2(config-if)#mpls mtu 1512
Router_2(config-if)#exit
Router_2(config)#int fa 1/0
Router_2(config-if)#mpls ip
Router_2(config-if)#mpls mtu 1512
Router_2(config-if)#exit
Router_2(config)#exit
Router_2#wr
Router_2# 


Router_3:

Router_3#conf t
Router_3(config)#ip cef
Router_3(config)#mpls ip
Router_3(config)#mpls label protocol ldp
Router_3(config)#mpls ldp router-id loopback 0
Router_3(config)#int fa 0/0
Router_3(config-if)#mpls ip
Router_3(config-if)#mpls mtu 1512
Router_3(config-if)#exit
Router_3(config)#int fa 1/0
Router_3(config-if)#mpls ip
Router_3(config-if)#mpls mtu 1512
Router_3(config-if)#exit
Router_3(config)#exit
Router_3#wr 


Router_4:

Router_4#conf t
Router_4(config)#ip cef
Router_4(config)#mpls ip
Router_4(config)#mpls label protocol ldp
Router_4(config)#mpls ldp router-id loopback 0
Router_4(config)#int fa 0/0
Router_4(config-if)#mpls ip
Router_4(config-if)#mpls mtu 1512
Router_4(config-if)#exit
Router_4(config)#int fa 1/0
Router_4(config-if)#mpls ip
Router_4(config-if)#mpls mtu 1512
Router_4(config-if)#exit
Router_4(config)#exit
Router_4#wr
Router_4# 


Надеюсь, у вас получилось. Теперь вопрос, как проверить нашу работу :). А проверим мы командами группы show на одном из роутеров (например, Router_1) и посмотрим отловленные пакеты (при прохождении ping) на интерфейсе FastEthernet 1/0 роутера Router_2 (смотрящий в сторону Router_4).
Итак, вот результат нашей работы над задачей №1 настройки MPLS:


    где:
  • 1 – таблица LFIB (видно, что все маршруты помечены метками);
  • 2 – таблица «соседей» по протоколу ldp (как и надо, присутствуют два «соседа»).


    где:
  • 1 – таблица соответствия меток и маршрутов (с информацией, какой LSR ее предоставил).


Из отловленных пакетов возьмем ICMP. И, как видно из рисунка, у нас появилась закладка MultiProtocol Label Switching Header. В ней показаны различные параметры, которые вставляются во фрейм (значение метки, время жизни (ttl) и так далее). Если еще посмотреть на отловленные пакеты на рисунке, то можно заметить и LDP пакеты (hello messages). Эти пакеты рассылаются роутерами на мультикаст адрес 224.0.0.2.
Ну что же, первая задача успешно завершена, базовая конфигурация MPLS работает. Оказалось, не все так страшно :).
Приступаем к реализации задачи №2, а именно к настройке L2 VPN over MPLS.
Первую схему я создавал и настраивал, используя cisco 3640. Но, начиная делать вторую схему, обнаружил, что cisco 3640 не поддерживает инкапсуляцию mpls на интерфейсах. Так что, пришлось заменить их на cisco серии 7200. Вот, для ориентировки, slot-ы, которые я использовал на роутерах Router_1 и Router_4:


И на Router_2 и Router_3:


Помимо этого, немного преобразовалась и сама схема. Теперь она будет выглядеть следующим образом (напоминаю, на данный момент мы будем настраивать Layer 2 VPN через MPLS (EoMPLS в нашем случае)):


Осталось те же 4 роутера, но на пограничных роутерах у нас появились sub-интерфейсы, которые соответствуют некоторым vlan-ам (10 и 20 соответственно). И теперь, конечные станции находятся в одной сети 192.168.1.0/24. Задача состоит в том, чтобы Host_1 и Host_2 видели друг друга так, как будто они находятся в одном vlan-е. Выполнить эту задачу можно и через IP сеть (технология l2tpv3), но мы будем использовать L2 VPN с инкапсуляцией MPLS (l2mpls).
Приступим. Заходим на роутер Router_1 и делаем следующие настройки (настройки IP маршрутизации, базовые настройки MPLS будут такие же, как и в задаче №1):

R1>en
R1#conf t
R1(config)#hostname Router_1
Router_1(config)#ip cef
Router_1(config)#mpls ip
Router_1(config)#mpls label protocol ldp
Router_1(config)#mpls ldp router-id loopback 0
Router_1(config)#int loopback 0
Router_1(config-if)#ip address 10.10.10.10 255.255.255.255
Router_1(config-if)#exit
Router_1(config)#int fa 1/0
Router_1(config-if)#ip address 1.1.1.1 255.255.255.252
Router_1(config-if)#no sh
Router_1(config-if)#mtu 1512
Router_1(config-if)#mpls ip
Router_1(config-if)#mpls mtu 1512
Router_1(config-if)#exit
Router_1(config)#int fa 1/1
Router_1(config-if)#ip address 2.2.2.1 255.255.255.252
Router_1(config-if)#no sh
Router_1(config-if)#mtu 1512
Router_1(config-if)#mpls ip
Router_1(config-if)#mpls mtu 1512
Router_1(config-if)#exit
Router_1(config)#router ospf 1
Router_1(config-router)#passive-interface default
Router_1(config-router)#no passive-interface fastEthernet 1/0
Router_1(config-router)#no passive-interface fastEthernet 1/1
Router_1(config-router)#network 10.10.10.10 0.0.0.0 area 0
Router_1(config-router)#network 1.1.1.0 0.0.0.3 area 0
Router_1(config-router)#network 2.2.2.0 0.0.0.3 area 0
Router_1(config-router)#exit
Router_1(config)#int fa 0/0
Router_1(config-if)#no sh
Router_1(config-if)#exit
Router_1(config)#int fa 0/0.10 – создаем sub-интерфейс для vlan 10;
Router_1(config-subif)#encapsulation dot1Q 10 – прописываем инкапсуляцию dot1q с тегом 10 (№ vlan). На другом роутере (Router_4) тег может быть другим;
Router_1(config-subif)#xconnect 40.40.40.40 9999 encapsulation mpls –создаем специальное подключение до второго роутера. Указываем метод инкапсуляции mpls. 9999 – это номер виртуального канала VC (Virtual Circuit). Он должен быть одинаковым с двух сторон и идентифицирует сам канал;
Router_1(config-subif-xconn)#exit
Router_1(config-subif)#no sh
Router_1(config-subif)#exit
Router_1(config)#exit
Router_1#wr
Router_1# 


Переходим к Router_2:

R2>en
R2#conf t
R2(config)#hostname Router_2
Router_2(config)#ip cef
Router_2(config)#mpls ip
Router_2(config)#mpls label protocol ldp
Router_2(config)#mpls ldp router-id loopback 0
Router_2(config)#int loopback 0
Router_2(config-if)#ip address 20.20.20.20 255.255.255.255
Router_2(config-if)#exit
Router_2(config)#int fa 1/0
Router_2(config-if)#ip address 1.1.1.2 255.255.255.252
Router_2(config-if)#no sh
Router_2(config-if)#mtu 1512
Router_2(config-if)#mpls ip
Router_2(config-if)#mpls mtu 1512
Router_2(config-if)#exit
Router_2(config)#int fa 1/1
Router_2(config-if)#ip address 3.3.3.2 255.255.255.252
Router_2(config-if)#no sh
Router_2(config-if)#mpls ip
Router_2(config-if)#mtu 1512
Router_2(config-if)#mpls ip
Router_2(config-if)#mpls mtu 1512
Router_2(config-if)#exit
Router_2(config)#router ospf 1
Router_2(config-router)#network 20.20.20.20 0.0.0.0 area 0
Router_2(config-router)#network 1.1.1.0 0.0.0.3 area 0
Router_2(config-router)#network 1.1.1.0 0.0.0.3 area 0
Router_2(config-router)#network 3.3.3.0 0.0.0.3 area 0
Router_2(config-router)#exit
Router_2(config)#exit
Router_2#wr
Router_2# 


Router_3:

R3>en
R3#conf t
R3(config)#hostname Router_3
Router_3(config)#ip cef
Router_3(config)#mpls ip
Router_3(config)#mpls label protocol ldp
Router_3(config)#mpls ldp router-id loopback 0
Router_3(config)#int loopback 0
Router_3(config-if)#ip address 30.30.30.30 255.255.255.255
Router_3(config-if)#exit
Router_3(config)#int fa 1/0
Router_3(config-if)#ip address 2.2.2.2 255.255.255.252
Router_3(config-if)#no sh
Router_3(config-if)#mtu 1512
Router_3(config-if)#mpls ip
Router_3(config-if)#mpls mtu 1512
Router_3(config-if)#exit
Router_3(config)#int fa 1/1
Router_3(config-if)#ip address 4.4.4.2 255.255.255.252
Router_3(config-if)#no sh
Router_3(config-if)#mtu 1512
Router_3(config-if)#mpls ip
Router_3(config-if)#mpls mtu 1512
Router_3(config-if)#exit
Router_3(config)#router ospf 1
Router_3(config-router)#network 30.30.30.30 0.0.0.0 area 0
Router_3(config-router)#network 2.2.2.0 0.0.0.3 area 0
Router_3(config-router)#network 4.4.4.0 0.0.0.3 area 0
Router_3(config-router)#exit
Router_3(config)#exit
Router_3#wr
Router_3# 


Router_4:

R4>en
R4#conf t
R4(config)#hostname Router_4
Router_4(config)#ip cef
Router_4(config)#mpls ip
Router_4(config)#mpls label protocol ldp
Router_4(config)#mpls ldp router-id loopback 0
Router_4(config)#int loopback 0
Router_4(config-if)#ip address 40.40.40.40 255.255.255.255
Router_4(config-if)#exit
Router_4(config)#int fa 1/0
Router_4(config-if)#ip address 4.4.4.1 255.255.255.252
Router_4(config-if)#no sh
Router_4(config-if)#mtu 1512
Router_4(config-if)#mpls ip
Router_4(config-if)#mpls mtu 1512
Router_4(config-if)#exit
Router_4(config)#int fa 1/1
Router_4(config-if)#ip address 3.3.3.1 255.255.255.252
Router_4(config-if)#no sh
Router_4(config-if)#mtu 1512
Router_4(config-if)#mpls ip
Router_4(config-if)#mpls mtu 1512
Router_4(config-if)#exit
Router_4(config)#router ospf 1
Router_4(config-router)#passive-interface default
Router_4(config-router)#no passive-interface fastEthernet 1/0
Router_4(config-router)#no passive-interface fastEthernet 1/1
Router_4(config-router)#network 40.40.40.40 0.0.0.0 area 0
Router_4(config-router)#network 3.3.3.0 0.0.0.3 area 0
Router_4(config-router)#network 4.4.4.0 0.0.0.3 area 0
Router_4(config-router)#exit
Router_4(config)#int fa 0/0
Router_4(config-if)#no sh
Router_4(config-if)#exit
Router_4(config)#int fa 0/0.20
Router_4(config-subif)#encapsulation dot1Q 20
Router_4(config-subif)#xconnect 10.10.10.10 9999 encapsulation mpls
Router_4(config-subif-xconn)#exit
*Mar 22 15:05:48.439: %LDP-5-NBRCHG: LDP Neighbor 10.10.10.10:0 (3) is UP – это сообщение должно появиться, если вы все правильно настроили;
Router_4(config-subif)#exit
Router_4(config)#exit
Router_4#wr
Router_4# 


Ну что, переходим к проверкам. Для начала, посмотрим, что у нас имеется на роутерах. Router_1:


На Router_4:


Из рисунков видно, что l2 канал установлен, тип у него Ethernet, сопоставлен он с нужным интерфейсом (Int fa 0/0.10 с одной стороны и Int fa 0/0.20 с другой стороны), показаны IP – адреса «соседей», ID виртуального канала (vc) и самое главное, его статус UP. Так же, можно увидеть, какие локальные метки навесил каждый роутер.
Далее, сделаем ping с Host_2 на Host_1:


Все работает. Замечу лишь то, что при таких l2 тоннелях следует следить, чтобы не было одинаковых IP – адресов. Помните, что пользователи находятся в одной сети :).
Теперь, для полноты картины, отловим несколько пакетов и посмотрим, что у них внутри. Первая точка – Int fa 1/1 на Router_4 (этот интерфейс смотрит на Router_2):


Вторая точка - Int fa 1/0 на Router_2 (этот интерфейс смотрит на Router_1):


Третья точка – Int fa 0/0 на Router_1 (этот интерфейс смотрит в сторону Host_1):


Теперь посмотрим, как все происходит. Router_4, приняв пакет ICMP (Request) от Host_2 на интерфейс Int fa 0/0.20, понимает, что он относится к l2vpn mpls каналу и должен быть передан через сеть MPLS. Для этого он навешивает на него 2 метки. Первая метка используется для коммутации пакета в сети MPLS, а вторая метка используется для дальнейшей идентификации канала vc. Обе метки имеют ttl, равный 255. Пакет отправляется дальше. Router_2 принимает пакет и начинает обработку. Он видит, что пакет адресован сети, которая находится сразу за Router_1 и, чтобы упростить задачу «соседу» (технология снятия метки на предпоследнем LSR (PHP - Penultimate Hop Popping), снимает одну из меток, которая используется для коммутации. У второй метки всего лишь уменьшается ttl на единицу. Пакет летит дальше. Конечный роутер Router_1, принимая пакет, видит, что транспортная метка отсутствует, но есть метка, которая соответствует имеющемуся у него виртуальному каналу vc. Он снимает эту метку и, согласно уже своей внутренней таблице, отправляет его на интерфейс Int fa 0/0.10.
Объяснял так, как понимаю сам :). Надеюсь, мне удалось.
Ну что же, на этом можно завершить и задачу №2. Все получилось. В следующем посте я постараюсь немного углубиться и реализовать задачу №3, а именно совместное применение технологии MPLS и VRF.
А на этом я заканчиваю этот пост. Как всегда надеюсь, что он был вам интересен и познавателен.

Источник: go-to-easyit.com/2012/03/mpls-cisco-1.html