MPLS и VPLS в Mikrotik

С одной стороны, желание несколько странное – организация “серьезного” MPLS/VPLS на дешевом железе типа Mikrotik. С другой стороны – за 70 баксов (1500-2000р) за младшую модель RB/750(GL) мы получаем PE/CE-устройство, умеющее (помимо прочего) L2VPN/L3VPN поверх MPLS-среды и способное прокачать через себя порядка 70 мегабит дуплекса (на больших пакетах).
Mikrotik RouterOS умеет как MPLS (L3VPN, Traffic Engeneering), так и L2VPN (l2circuit aka VPWS, VPLS), что покрывает практически все возможные задачи (учитывая производительность железа, разумеется).

Интересно? Прошу под кат!

Для начала, немного теории.

MPLS (multiprotocol label switching) – механизм маршрутизации на основе меток. Каждому пакету, проходящему через MPLS-сеть, независимо от типа этого пакета, назначается определенная метка, на основе которой принимается решение о маршрутизации. Важно отметить, что содержимое при этом не изучается, т.е. внутри MPLS можно гонять абсолютно любой L2/L3 трафик (STP, BPDU и т.д., вплоть до SDH и ATM) без какого-либо влияния на транспортную сеть (флуд, вланы с большим количеством мак-адресов, петли и прочие “радости” становятся вам, как транспорту, глубоко фиолетовы).

Ключевым понятием в MPLS является LSP (Label Switched Path) – путь прохождения пакета, который устанавливается на основе протоколов LDP, RSVP-TE, BGP или CR-LDP. В данной статье я не буду распространяться, по каким критериям устанавливается LSP, а из протоколов остановлюсь на LDP. Литературы по MPLS в сети достаточно, чтобы интересующийся читатель почерпнул для себя много нового, целью же данной статьи является демонстрация вполне конкретных возможностей RouterOS.

Роутер в MPLS-сети может выполнять одну из трех функций:

1. CE-роутер (Client-edge) – не является членом MPLS-сети, и вообще ничего про нее не знает, это просто клиентское устройство, которое имеет L2/L3 связность с роутером провайдера.
2. PE-роутер (Provider-edge) – пограничный MPLS маршрутизатор. Является шлюзом для клиента и пересылает его трафик в MPLS-сеть провайдера. Другое название – LER – label edge router.
3. P-роутер (provider router) – MPLS маршрутизатор, который прозрачно пропускает MPLS-траффик, не занимаясь анализом его содержимого. Другое название – LSR (label-switch router).

VPWS (l2circuit) – канал точка-точка (он же pseudo-wire).
VPLS – многоточечный канал, для клиента выглядит как виртуальный “тупой” свич, прозрачно пропускающий любые пакеты.

Теперь, когда определились с терминологией, рассмотрим конкретные примеры:

1. Mikrotik – Juniper – Mikrotik L2Circuit
Вариант первый: Mikrotik выступает в качестве PE-роутера, Juniper – в качестве P-роутера.

Схема сети

Все картинки кликабельны


Конфигурация Miktorik в качестве PE-роутера

Поднимаем интерфейсы и ip-адреса:

/interface bridge
add name=loopback
add l2mtu=1526 name=vpn

/ip address
add address=10.0.11.24/24 interface=eth2
add address=172.19.238.33/32 interface=loopback network=172.19.238.33



Настраиваем OSPF, анонсируем сети, через которые видим своих соседей + loopback:

/routing ospf instance
set [ find default=yes ] router-id=172.19.238.33
/routing ospf interface
add interface=eth2
/routing ospf network
add area=backbone network=10.0.11.0/24
add area=backbone network=172.19.238.33/32



Настраиваем LDP, не забываем про mpls-mtu (для успешного прохождения тегированных пакетов и QinQ:

/mpls interface
set [ find default=yes ] mpls-mtu=1526
/mpls ldp
set enabled=yes lsr-id=172.19.238.33 transport-address=172.19.238.33
/mpls ldp interface
add interface=eth2



Наконец, поднимаем L2VPN и заворачиваем туда eth5, где будут жить наши клиенты:

/interface vpls
add advertised-l2mtu=1526 cisco-style=yes cisco-style-id=5 disabled=no l2mtu=1526 \
name=junos-l2circuit remote-peer=172.19.238.34

/interface bridge port
add bridge=vpn interface=eth5
add bridge=vpn interface=junos-l2circuit

Cisco-style определяет параметры id, по которому маршрутизаторы узнают друг друга. l2-mtu определяет максимальный размер кадра, который может пройти без фрагментации.

/interface bridge
add name=loopback
add l2mtu=1526 name=vpn

/ip address
add address=172.19.238.34/32 interface=loopback network=172.19.238.34
add address=192.168.168.2/24 interface=eth2 network=192.168.168.0

/routing ospf instance
set [ find default=yes ] router-id=172.19.238.34
/routing ospf interface
add interface=eth2
/routing ospf network
add area=backbone network=192.168.168.0/24
add area=backbone network=172.19.238.34/32

/mpls interface
set [ find default=yes ] mpls-mtu=1526
/mpls ldp
set enabled=yes lsr-id=172.19.238.34 transport-address=172.19.238.34
/mpls ldp interface
add interface=eth2

/interface vpls
add advertised-l2mtu=1526 cisco-style=yes cisco-style-id=5 disabled=no l2mtu=1526 \
name=junos-l2circuit remote-peer=172.19.238.33

/interface bridge port
add bridge=vpn interface=eth5
add bridge=vpn interface=junos-l2circuit





Конфигурация Juniper SRX в качестве P-роутера

Настраиваем интерфейсы, IP-адреса:

interfaces {
    fe-0/0/6 {
        description mkt.192.168.168.2--pe;
        mtu 1624;
        unit 0 {
            family inet {
                mtu 1500;
                address 192.168.168.1/24;
            }
            family mpls;
        }
    }
    fe-0/0/7 {
        description mkt.10.0.11.24--pe;
        mtu 1624;
        unit 0 {
            family inet {
                mtu 1500;
                address 10.0.11.23/24;
            }
            family mpls;
        }
    }
    lo0 {
        unit 0 {
            family inet {
                address 172.19.238.35/32;
            }
        }
    }
}



Затем поднимаем OSPF:

protocols {
    ospf {
        area 0.0.0.0 {
            interface fe-0/0/6.0 {
                hello-interval 10;
            }
            interface fe-0/0/7.0 {
                hello-interval 10;
            }
            interface lo0.0 {
                passive;
            }
        }
    }
}



Наконец, настраиваем MPLS:

protocols {
    mpls {
        interface all;
    }
    ldp {
        egress-policy CONNECTED-ONLY;
        transport-address 172.19.238.35;
        interface fe-0/0/6.0;
        interface fe-0/0/7.0;
        interface lo0.0;
    }
policy-options {
    prefix-list LOOPBACK-PREFIX {
        172.19.238.35/32;
    }
    policy-statement CONNECTED-ONLY {
        from {
            prefix-list LOOPBACK-PREFIX;
        }
        then accept;
    }
}
security {
    forwarding-options {
        family {
            mpls {
                mode packet-based;
            }
        }
    }
}

В данном случае SRX, как P-роутер, не устанавливает сам никаких MPLS-коннектов, а только лишь пропускает LDP-пакеты.




2. Juniper – Mikrotik – Mikrotik L2Circuit
Другой вариант – теперь Juniper SRX у нас выступает как PE-роутер, а Mikrotik – как P-роутер.

Схема сети

Конфигурация Juniper SRX в качестве PE-роутера
Конфигурация интерфейсов

interfaces {
    fe-0/0/5 {
        description vpws2--pe;
        vlan-tagging;
        mtu 1624;
        encapsulation vlan-ccc;
        unit 0 {
            encapsulation vlan-ccc;
            vlan-id 1806;
        }
    }
    fe-0/0/7 {
        description mkt.10.0.11.24--p;
        mtu 1624;
        unit 0 {
            family inet {
                mtu 1500;
                address 10.0.11.23/24;
            }
            family mpls {
                mtu 1526;
            }
        }
    }
    lo0 {
        unit 0 {
            family inet {
                address 172.19.238.35/32;
            }
        }
    }
}

Из особенностей стоит отметить encapsulation vlan-ccc; который говорит нам, что этот порт заворачивается в кросс-коннект. mpls-mtu должен совпадать с таковым у другого PE-устройства.

Настройка маршрутизации

routing-options {
    static {
        route 0.0.0.0/0 {
            next-hop 172.19.238.1;
            no-readvertise;
            preference 200;
        }
    }
}
protocols {
    mpls {
        interface all;
    }
    ospf {
        area 0.0.0.0 {
            interface fe-0/0/7.0 {
                hello-interval 10;
            }
            interface lo0.0 {
                passive;
            }
        }
    }
    ldp {
        egress-policy CONNECTED-ONLY;
        transport-address 172.19.238.35;
        interface all;
    }
    l2circuit {
        neighbor 172.19.238.34 {
            interface fe-0/0/5.0 {
                virtual-circuit-id 5;
                mtu 1526;
            }
        }
    }
}

Здесь мы строим l2circuit, указываем id и mpls-mtu.


Конфигурация Mikrotik в качестве P-роутера

/interface bridge
add name=loopback

/ip address
add address=10.0.11.24/24 interface=eth3
add address=172.19.238.33/32 interface=loopback network=172.19.238.33
add address=192.168.168.1/24 interface=eth2


/routing ospf instance
set [ find default=yes ] router-id=172.19.238.33

/routing ospf interface
add interface=eth2
add interface=eth3

/routing ospf network
add area=backbone network=10.0.11.0/24
add area=backbone network=172.19.238.33/32
add area=backbone network=192.168.168.0/24


/mpls interface
set [ find default=yes ] mpls-mtu=1526

/mpls ldp
set enabled=yes lsr-id=172.19.238.33 transport-address=172.19.238.33

/mpls ldp interface
add interface=eth2
add interface=eth3

Тут все абсолютно стандартно, vpls-интерфейсы создавать не нужно.




3. Juniper – Mikrotik VPLS
Третий вариант – настройка не L2circuit (он же – CrossConnect Circuit в реализации Juniper), а полноценного многоточечного VPLS.

Конфигурация Mikrotik в качестве P-роутера

/interface bridge
add name=loopback

/ip address
add address=10.0.11.24/24 interface=eth3
add address=10.0.12.24/24 interface=eth5
add address=172.19.238.33/32 interface=loopback network=172.19.238.33
add address=192.168.168.1/24 interface=eth2
add address=192.168.88.1/24 interface=eth4


/routing ospf instance
set [ find default=yes ] router-id=172.19.238.33

/routing ospf interface
add interface=eth2
add interface=eth3
add interface=eth4
add interface=eth5

/routing ospf network
add area=backbone network=10.0.11.0/24
add area=backbone network=10.0.12.0/24
add area=backbone network=172.19.238.33/32
add area=backbone network=192.168.168.0/24
add area=backbone network=192.168.88.0/24


/mpls interface
set [ find default=yes ] mpls-mtu=1526

/mpls ldp
set enabled=yes lsr-id=172.19.238.33 transport-address=172.19.238.33

/mpls ldp interface
add interface=eth2
add interface=eth3
add interface=eth4
add interface=eth5



Конфигурация Miktorik в качестве PE-роутера

/interface bridge
add name=loopback
add l2mtu=1526 name=vpn

/ip address
add address=172.19.238.34/32 interface=loopback network=172.19.238.34
add address=192.168.168.2/24 interface=eth2 network=192.168.168.0

/routing ospf instance
set [ find default=yes ] router-id=172.19.238.34
/routing ospf interface
add interface=eth2
/routing ospf network
add area=backbone network=192.168.168.0/24
add area=backbone network=172.19.238.34/32

/mpls interface
set [ find default=yes ] mpls-mtu=1526
/mpls ldp
set enabled=yes lsr-id=172.19.238.34 transport-address=172.19.238.34
/mpls ldp interface
add interface=eth2

/interface vpls
add advertised-l2mtu=1526 cisco-style=yes cisco-style-id=5 disabled=no l2mtu=1526 \
name=junos-l2circuit remote-peer=172.19.238.33

/interface bridge port
add bridge=vpn interface=eth5 
add bridge=vpn interface=junos-l2circuit horizon=1

Аналогично настройке для l2circuit, но есть пара нюансов:
1. Каналы в одном VPLS-домене должны иметь один vpls-id.
2. Связность должна быть full-mesh (каждый с каждым) для обеспечения наибольшей надежности. Впрочем, это условие не является обязательным.
3. Для избавления от возможности петли нужно использовать следующую опцию:

/interface bridge port set 0 horizon=1



Конфигурация Juniper SRX в качестве PE-роутера
Настройка интерфейсов

interfaces {
    fe-0/0/5 {
        description vpws2--pe;
        mtu 1624;
        encapsulation ethernet-vpls;
        unit 0 {
            family vpls;
        }
    }
    fe-0/0/6 {
        description mkt.192.168.168.2--pe;
        mtu 1624;
        unit 0 {
            family inet {
                mtu 1500;
                address 192.168.168.1/24;
            }
            family mpls;
        }
    }
    lo0 {
        unit 0 {
            family inet {
                address 172.19.238.35/32;
            }
        }
    }
}

Если для кросс-коннекта мы указывали encapsulation vlan-ccc, то для VPLS нам нужно encapsulation ethernet-vpls и указать family vpls в настройках юнита.


Настройка маршрутизации

protocols {
    mpls {
        interface all;
    }
    ospf {
        area 0.0.0.0 {
            interface fe-0/0/6.0 {
                hello-interval 10;
            }
            interface fe-0/0/7.0 {
                hello-interval 10;
            }
            interface lo0.0 {
                passive;
            }
        }
    }
    ldp {
        egress-policy CONNECTED-ONLY;
        transport-address 172.19.238.35;
        interface all;
    }
}
policy-options {
    prefix-list LOOPBACK-PREFIX {
        172.19.238.35/32;
    }
    policy-statement CONNECTED-ONLY {
        from {
            prefix-list LOOPBACK-PREFIX;
        }
        then accept;
    }
}
security {
    forwarding-options {
        family {
            mpls {
                mode packet-based;
            }
        }
    }
}

Настройка VPLS-коннектов

routing-instances {
    vpls-re {
        instance-type vpls;
        interface fe-0/0/5.0;
        protocols {
            vpls {
                no-tunnel-services;
                vpls-id 5;
                mtu 1526;
                neighbor 172.19.238.34;
                neighbor 172.19.238.105;
            }
        }
    }
}

VPLS-коннекты так же строятся, по возможности “каждый с каждым”, хотя это не обязательно.



4. Проверка
PE Juniper

snake@srx1> show ldp neighbor
Address            Interface          Label space ID         Hold time
172.19.238.34      lo0.0              172.19.238.34:0          42
10.0.11.24         fe-0/0/7.0         172.19.238.33:0          11


snake@srx1> show l2circuit connections status
Layer-2 Circuit Connections:

Legend for connection status (St)
EI -- encapsulation invalid      NP -- interface h/w not present
MM -- mtu mismatch               Dn -- down
EM -- encapsulation mismatch     VC-Dn -- Virtual circuit Down
CM -- control-word mismatch      Up -- operational
VM -- vlan id mismatch           CF -- Call admission control failure
OL -- no outgoing label          IB -- TDM incompatible bitrate
NC -- intf encaps not CCC/TCC    TM -- TDM misconfiguration
BK -- Backup Connection          ST -- Standby Connection
CB -- rcvd cell-bundle size bad  SP -- Static Pseudowire
LD -- local site signaled down   RS -- remote site standby
RD -- remote site signaled down  XX -- unknown

Legend for interface status
Up -- operational
Dn -- down
Neighbor: 172.19.238.34
    Interface                 Type  St     Time last up          # Up trans
    fe-0/0/5.0(vc 5)          rmt   Up     Nov  9 18:27:45 2012           1
      Remote PE: 172.19.238.34, Negotiated control-word: No
      Incoming label: 300096, Outgoing label: 21
      Negotiated PW status TLV: No
      Local interface: fe-0/0/5.0, Status: Up, Encapsulation: VLAN

PE Mikrotik

[admin@pe-router] /mpls ldp neighbor> print
Flags: X - disabled, D - dynamic, O - operational, T - sending-targeted-hello, V - vpls
 #      TRANSPORT LOCAL-TRANSPORT PEER SEND-TARGETED ADDRESSES
0 DO   172.19.238.33   172.19.238.34 172.19.238.33:0 no 10.0.11.24
                                      172.19.74.2
                                      172.19.238.33
                                      192.168.88.1
                                      192.168.168.1
1 DOTV 172.19.238.35   172.19.238.34 172.19.238.35:0 yes 10.0.11.23
                                      172.19.238.4
                                      172.19.238.30
                                      172.19.238.35
                                      172.19.238.58
[admin@pe-router] /mpls> forwarding-table print
Flags: L - ldp, V - vpls, T - traffic-eng
 #   IN-LABEL OUT-LABELS DESTINATION INTERFACE NEXTHOP
 0   expl-null
 1 L 16 56  172.19.238.56/30 eth2                    192.168.168.1
 2 L 17     10.0.11.0/24    eth2                     192.168.168.1
 3 L 18 57  172.19.238.28/30 eth2                     192.168.168.1
 4 L 19 58  172.19.238.35/32 eth2                     192.168.168.1
 5 L 20     172.19.238.33/32 eth2                     192.168.168.1
 6 V 21     junos-l2circuit
[admin@pe-router] > interface vpls monitor junos-l2circuit once
       remote-label: 300096
        local-label: 21
      remote-status:
          transport: 172.19.238.35/32
  transport-nexthop: 192.168.168.1
     imposed-labels: 58,300096

Если канал не поднялся сразу, то помогает выключение-включение VPLS-интерфейса со стороны Mikrotik. В остальных случаях канал, что называется, “либо работает, либо нет”.

На этом, собственно, все.

5. Теория
Мануалы по теме:
1. MPLS
2. MPLS Overview
3. MPLSVPLS
4. L2VPN with Juniper

P.S. Заранее прошу прощения за большой объем и большое количество конфигов, но тут, что называется, лучше один раз увидеть конфиг, чем пускаться в теоретические рассуждения.
P.P.S Это копия моей вчерашней статьи на Хабре, благодаря которой я получил инвайт и первые плюсы в карму ;).

Leave a Reply