1. Topoloji ve Amaç

Nokia SR OS tarafında Türkçe kaynak çok az, ben de lab’da öğrendiklerimi buraya not alıyorum. Bu yazıda sade bir MPLS çekirdeği kuruyoruz ve iki şeyi göstereceğiz:

  1. IGP ile LDP birlikte nasıl çalışır? OSPF loopback’leri birbirine öğretir, LDP de bu rotaların üstüne etiket (label) bindirerek PE’ler arasında bir LSP (transport tüneli) oluşturur.
  2. Etiketin amacı nedir? Paket çekirdekte IP lookup ile değil, etiket ile ilerler. Etiketin nerede takıldığını (push), nerede değiştiğini (swap), nerede söküldüğünü (pop) adım adım göreceğiz.

Kargo analojisi

IP routing’i, her aktarma merkezinde kolinin üzerindeki adresi okuyup “bu nereye gidiyordu?” diye düşünmeye benzetebiliriz. MPLS’te ise kolinin başlangıç merkezinde üzerine bir barkod yapıştırılır. Aradaki merkezler adresi okumaz, sadece barkoda bakar ve bandı yönlendirir. LDP de komşu merkezlerin birbirine “bu barkod bu adrese gider” bilgisini dağıttığı protokoldür.

Topoloji

LDP Lab Topolojisi

CihazRolLoopback (System)
CE1Müşteri ucu1.1.1.1
PE1Provider Edge2.2.2.2
PProvider (core)3.3.3.3
PE2Provider Edge4.4.4.4
CE2Müşteri ucu5.5.5.5
LinkSubnetArayüzler
CE1 - PE1192.168.10.0/24CE1 1/1/1 (.1) - PE1 1/1/1
PE1 - P10.23.23.0/24PE1 1/1/2 (.2) - P 1/1/2 (.3)
P - PE210.34.34.0/24P 1/1/1 (.3) - PE2 1/1/1 (.4)
PE2 - CE2192.168.10.0/24PE2 1/1/2 - CE2 1/1/2 (.2)

Provider tarafında (PE1, P, PE2) IGP olarak OSPF çalışıyor. Hedefimiz PE1 (2.2.2.2) ile PE2 (4.4.4.4) arasında LDP ile bir LSP kurmak.

2. Mevcut Durum: OSPF ve Loopback Erişilebilirliği

LDP’nin tek başına bir yol bulma yeteneği yok. Etiket dağıtırken IGP’nin kurduğu rotalara bakar: “bu prefix’e giden next-hop kim?” sorusunun cevabını routing tablosundan alır. Yani önce IGP’nin düzgün çalışması şart. Burada üç router da tek area (0.0.0.0) içinde OSPF çalıştırıyor.

OSPF konfigürasyonu

Üç router’da da yapı aynı: tek area (0.0.0.0), system interface’i (loopback’i duyurmak için) ve core’a bakan interface’ler. Link’leri point-to-point yaptık, böylece komşulukta DR/BDR seçimi yapılmıyor ve komşuluk daha hızlı oturuyor.

PE1

A:PE1-R2>config>router>ospf# info
----------------------------------------------
            area 0.0.0.0
                interface "system"
                    no shutdown
                exit
                interface "toP"
                    interface-type point-to-point
                    no shutdown
                exit
            exit
            no shutdown
----------------------------------------------

P

A:P-R3>config>router>ospf# info
----------------------------------------------
            area 0.0.0.0
                interface "system"
                    no shutdown
                exit
                interface "toPE1"
                    interface-type point-to-point
                    no shutdown
                exit
                interface "toPE2"
                    interface-type point-to-point
                    no shutdown
                exit
            exit
            no shutdown

PE2

A:PE2-R4>config>router>ospf# info
----------------------------------------------
            area 0.0.0.0
                interface "system"
                    no shutdown
                exit
                interface "toP"
                    interface-type point-to-point
                    no shutdown
                exit
            exit
            no shutdown

CE’lere bakan interface’leri (PE1 1/1/1, PE2 1/1/2) OSPF’e eklemedik. Müşteri tarafı provider IGP’sine karışmıyor.

OSPF komşulukları

PE1, P ve PE2 üzerinde komşulukların hepsi Full durumda:

A:PE1-R2# show router ospf neighbor

===============================================================================
Rtr Base OSPFv2 Instance 0 Neighbors
===============================================================================
Interface-Name                   Rtr Id          State      Pri  RetxQ   TTL
   Area-Id
-------------------------------------------------------------------------------
toP                              3.3.3.3         Full       1    0       31
   0.0.0.0
-------------------------------------------------------------------------------
No. of Neighbors: 1
===============================================================================
A:P-R3# show router ospf neighbor

===============================================================================
Rtr Base OSPFv2 Instance 0 Neighbors
===============================================================================
Interface-Name                   Rtr Id          State      Pri  RetxQ   TTL
   Area-Id
-------------------------------------------------------------------------------
toPE1                            2.2.2.2         Full       1    0       33
   0.0.0.0
toPE2                            4.4.4.4         Full       1    0       36
   0.0.0.0
-------------------------------------------------------------------------------
No. of Neighbors: 2
A:PE2-R4# show router ospf neighbor

===============================================================================
Rtr Base OSPFv2 Instance 0 Neighbors
===============================================================================
Interface-Name                   Rtr Id          State      Pri  RetxQ   TTL
   Area-Id
-------------------------------------------------------------------------------
toP                              3.3.3.3         Full       1    0       35
   0.0.0.0
-------------------------------------------------------------------------------
No. of Neighbors: 1

P router’ı ortada olduğu için iki komşusu var (PE1 ve PE2), uçtaki PE’lerin ise yalnızca birer komşusu var.

Route tablosu

PE1’in route tablosuna bakalım:

A:PE1-R2# show router route-table

===============================================================================
Route Table (Router: Base)
===============================================================================
Dest Prefix[Flags]                            Type    Proto     Age        Pref
      Next Hop[Interface Name]                                    Metric
-------------------------------------------------------------------------------
2.2.2.2/32                                    Local   Local     00h01m45s  0
       system                                                       0
3.3.3.3/32                                    Remote  OSPF      00h00m51s  10
       10.23.23.3                                                   100
4.4.4.4/32                                    Remote  OSPF      00h00m31s  10
       10.23.23.3                                                   200
10.23.23.0/24                                 Local   Local     00h00m55s  0
       toP                                                          0
10.34.34.0/24                                 Remote  OSPF      00h00m51s  10
       10.23.23.3                                                   200
-------------------------------------------------------------------------------
No. of Routes: 5

Burada dikkat edeceğimiz yer şu: PE1, PE2’nin loopback’ini (4.4.4.4/32) OSPF ile öğrenmiş, next-hop 10.23.23.3 (P router’ı) ve metric 200 (iki hop, hop başına 100). LDP’nin etiket dağıtacağı FEC’ler tam olarak bu loopback prefix’leri olacak.

Ama bu noktada IP erişilebilirliği var, henüz MPLS yok. PE1’den 4.4.4.4’e giden paket P’de normal IP lookup ile yönlendiriliyor. Sıradaki bölümde LDP’yi açıp bu tabloya etiketlerin nasıl bindirildiğine bakacağız.

3. LDP Konfigürasyonu

LDP konfigürasyonu aslında çok kısa. Yapmamız gereken tek şey, LDP’yi router’da açmak ve hangi interface’lerden komşu aranacağını söylemek. Biz sadece core’a bakan interface’leri ekliyoruz, CE’ye bakan interface’lere LDP açmıyoruz. Müşteriye etiket vermenin bir anlamı yok.

LDP, session’ı kurarken varsayılan olarak system (loopback) adresini kullanır. Yani iki router birbirinin loopback’ine ulaşabilmeli. Bir önceki bölümde OSPF ile bunu sağlamıştık, LDP’nin neden IGP’ye ihtiyaç duyduğu tam olarak burada görülüyor.

LDP açıldığında router, interface-parameters altındaki her interface’i dual-stack olarak oluşturuyor. Çıktıda ipv4 bloğunu ve fec-type-capability altında IPv6 FEC’lerinin kapalı (disable) olduğunu görüyoruz. Biz sadece IPv4 kullandığımız için burası bizi ilgilendirmiyor. En alttaki targeted-session bloğu uzak (loopback’ten loopback’e) LDP session’ları içindir, servis tarafında lazım olacak.

PE1

A:PE1-R2>config>router>ldp# info
----------------------------------------------
            interface-parameters
                interface "toP" dual-stack
                    ipv4
                        fec-type-capability
                            prefix-ipv6 disable
                            p2mp-ipv6 disable
                        exit
                        no shutdown
                    exit
                    no shutdown
                exit
            exit
            targeted-session
            exit
            no shutdown
----------------------------------------------

P

A:P-R3>config>router>ldp# info
----------------------------------------------
            interface-parameters
                interface "toPE1" dual-stack
                    ipv4
                        fec-type-capability
                            prefix-ipv6 disable
                            p2mp-ipv6 disable
                        exit
                        no shutdown
                    exit
                    no shutdown
                exit
                interface "toPE2" dual-stack
                    ipv4
                        fec-type-capability
                            prefix-ipv6 disable
                            p2mp-ipv6 disable
                        exit
                        no shutdown
                    exit
                    no shutdown
                exit
            exit
            targeted-session
            exit
            no shutdown
----------------------------------------------

PE2

A:PE2-R4>config>router>ldp# info
----------------------------------------------
            interface-parameters
                interface "toP" dual-stack
                    ipv4
                        fec-type-capability
                            prefix-ipv6 disable
                            p2mp-ipv6 disable
                        exit
                        no shutdown
                    exit
                    no shutdown
                exit
            exit
            targeted-session
            exit
            no shutdown
----------------------------------------------

Özetle her router’da iki iş yaptık: LDP’yi no shutdown ile açtık ve core’a bakan interface’leri interface-parameters altına ekledik. PE’lerde bir, P’de iki interface var.

4. LDP Durum Doğrulaması

Konfigürasyon tamam. Şimdi LDP’nin gerçekten çalıştığını üç adımda doğruluyoruz: komşuluk (hello adjacency), label dağıtımı (bindings) ve ortaya çıkan tünel (tunnel-table). Çıktıları PE1 üzerinden alıyorum.

Hello adjacency

LDP önce bağlı interface’lerden hello paketleri göndererek komşusunu bulur. Estab durumu, PE1’in P ile komşuluğunu kurduğunu gösteriyor:

A:PE1-R2# show router ldp discovery

===============================================================================
LDP IPv4 Hello Adjacencies
===============================================================================
Interface Name                   Local Addr                              State
AdjType                          Peer Addr
-------------------------------------------------------------------------------
toP                              2.2.2.2:0                               Estab
link                             3.3.3.3:0

-------------------------------------------------------------------------------
No. of IPv4 Hello Adjacencies: 1
===============================================================================

AdjType link yani doğrudan bağlı komşuluk. Komşunun adresi 3.3.3.3:0, yani LDP session’ı P’nin loopback adresiyle kuruluyor. (IPv6 adjacency tablosu boş, çünkü sadece IPv4 kullanıyoruz.)

Label bindings

Komşuluktan sonra router’lar birbirine “şu prefix için şu label’ı kullan” bilgisini yollar. PE1’deki IPv4 prefix binding’leri:

A:PE1-R2# show router ldp bindings

===============================================================================
LDP IPv4 Prefix Bindings
===============================================================================
Prefix                                      IngLbl                    EgrLbl
Peer                                        EgrIntf/LspId
EgrNextHop
-------------------------------------------------------------------------------
2.2.2.2/32                                  131071U                     --
3.3.3.3:0                                     --
  --

3.3.3.3/32                                    --                      131071
3.3.3.3:0                                   1/1/2
10.23.23.3

4.4.4.4/32                                  131069N                   131069
3.3.3.3:0                                   1/1/2
10.23.23.3

-------------------------------------------------------------------------------
No. of IPv4 Prefix Bindings: 3
===============================================================================

Gerçek çıktıda IPv6, P2MP ve servis FEC tabloları da var. Hepsi No Matching Entries Found olduğu için burada kestim.

Sütunları okumak için:

  • IngLbl (ingress label): Bu router’ın komşusuna “bu prefix’e gelmek istiyorsan bana şu label’la gel” diye verdiği label.
  • EgrLbl (egress label): Komşunun bu router’a “bu prefix için bana şu label’la gönder” diye verdiği label.
  • U / N: U label kullanımda, N kullanımda değil.

Burada 131071 özel bir değer: implicit null. “Bu prefix benim, label’ı sen söküp yolla” anlamına geliyor. PE1 kendi loopback’i (2.2.2.2/32) için P’ye 131071 vermiş. P de kendi loopback’i (3.3.3.3/32) için PE1’e 131071 vermiş. Bunun neden önemli olduğunu 5. bölümde göreceğiz.

PE1’in 4.4.4.4/32 için kullanacağı egress label ise 131069, bunu P vermiş.

Tunnel table

Label’lar dağıtıldıktan sonra LDP, her FEC için bir tünel oluşturur ve bunu tunnel-table’a yazar:

A:PE1-R2# show router tunnel-table

===============================================================================
IPv4 Tunnel Table (Router: Base)
===============================================================================
Destination       Owner     Encap TunnelId  Pref     Nexthop        Metric
-------------------------------------------------------------------------------
3.3.3.3/32        ldp       MPLS  65537     9        10.23.23.3     100
4.4.4.4/32        ldp       MPLS  65538     9        10.23.23.3     200
-------------------------------------------------------------------------------
Flags: B = BGP backup route available
       E = inactive best-external BGP route
===============================================================================

İşte aradığımız şey: PE1’den PE2’nin loopback’ine (4.4.4.4/32) giden bir LDP LSP’si var. Owner ldp, encapsulation MPLS, next-hop P. Bu tünelin yolunu belirleyen OSPF (metric 200 hâlâ aynı), üzerine label’ı bindiren de LDP. Yani IGP yolu seçiyor, LDP o yola label dağıtıyor.

5. Push / Swap / Pop

Şimdi label’ın hop hop ne yaptığına bakıyoruz. Bunun için üç router’da aktif (FIB’e girmiş, kullanılan) binding’leri listeliyoruz:

show router ldp bindings active

Çıktıda Op sütunu bize o router’ın label’la ne yaptığını söylüyor.

Üç işlem

İşlemNe yaparKargo analojisi
PushPaketin üzerine label eklerKolinin çıkış merkezinde üzerine barkod yapıştırmak
SwapGelen label’ı, bir sonraki router’ın verdiği label ile değiştirirAra merkezde eski barkodu söküp bir sonraki merkezin okuyacağı yeni barkodu yapıştırmak
PopLabel’ı sökerTeslimat merkezinde barkodu çıkarıp adrese göre teslim etmek

Kritik nokta: bu işlemler PE’ler arasındaki LSP için yapılıyor. Label’ı sadece giriş PE’si (ingress PE) paketin üzerine koyar. Aradaki P router’ı (transit) IP adresine bakmaz, sadece label’a bakıp değiştirir. Çıkış tarafı (egress PE) ise label’ı söker.

Aktif binding çıktıları

PE1

A:PE1-R2# show router ldp bindings active

LDP IPv4 Prefix Bindings (Active)
===============================================================================
Prefix                                      Op              IngLbl    EgrLbl
EgrNextHop                                  EgrIf/LspId
-------------------------------------------------------------------------------
2.2.2.2/32                                  Pop             131071      --
  --                                          --

3.3.3.3/32                                  Push              --      131071
10.23.23.3                                  1/1/2

4.4.4.4/32                                  Push              --      131069
10.23.23.3                                  1/1/2

4.4.4.4/32                                  Swap            131069    131069
10.23.23.3                                  1/1/2

-------------------------------------------------------------------------------

P

A:P-R3# show router ldp bindings active

LDP IPv4 Prefix Bindings (Active)
===============================================================================
Prefix                                      Op              IngLbl    EgrLbl
EgrNextHop                                  EgrIf/LspId
-------------------------------------------------------------------------------
2.2.2.2/32                                  Push              --      131071
10.23.23.2                                  1/1/2

2.2.2.2/32                                  Swap            131070    131071
10.23.23.2                                  1/1/2

3.3.3.3/32                                  Pop             131071      --
  --                                          --

4.4.4.4/32                                  Push              --      131071
10.34.34.4                                  1/1/1

4.4.4.4/32                                  Swap            131069    131071
10.34.34.4                                  1/1/1

-------------------------------------------------------------------------------

PE2

A:PE2-R4# show router ldp bindings active

LDP IPv4 Prefix Bindings (Active)
===============================================================================
Prefix                                      Op              IngLbl    EgrLbl
EgrNextHop                                  EgrIf/LspId
-------------------------------------------------------------------------------
2.2.2.2/32                                  Push              --      131070
10.34.34.3                                  1/1/1

2.2.2.2/32                                  Swap            131070    131070
10.34.34.3                                  1/1/1

3.3.3.3/32                                  Push              --      131071
10.34.34.3                                  1/1/1

4.4.4.4/32                                  Pop             131071      --
  --                                          --

-------------------------------------------------------------------------------

Üç router’ın çıktısını GNS3 ekranında yan yana görmek isteyenler için:

PE1, P ve PE2 aktif LDP binding çıktıları

PE1’den PE2’ye giden yol (4.4.4.4/32)

Çıktılardan PE1’den PE2’nin loopback’ine (4.4.4.4/32) giden yolu adım adım çıkaralım:

AdımRouterİşlemLabel
1PE1 (ingress)PushPaketin üzerine 131069 konur, 1/1/2 ile P’ye gider
2P (transit)SwapGelen 131069 değiştirilir, çıkış label’ı 131071 (implicit null), 1/1/1 ile PE2’ye gider
3PE2 (egress)Pop4.4.4.4/32 PE2’nin kendi adresi, label zaten 131071, paket düz IP olarak işlenir

Ters yön: PE2’den PE1’e (2.2.2.2/32)

Yön tersine dönünce aynı mantık işliyor:

AdımRouterİşlemLabel
1PE2 (ingress)Push131070 konur, 1/1/1 ile P’ye gider
2P (transit)Swap131070 → 131071 (implicit null), 1/1/2 ile PE1’e gider
3PE1 (egress)Pop2.2.2.2/32 PE1’in kendisi

Implicit null ve PHP

Yukarıdaki P satırında dikkat çekici bir şey var: egress label 131071. Bu implicit null. P router’ı label’ı gerçek bir değerle değiştirmiyor, söküp PE2’ye düz IP paketi olarak gönderiyor. Buna PHP (Penultimate Hop Popping) deniyor, yani sondan bir önceki hop’ta label sökülüyor.

Neden böyle yapılıyor? Label’ı PE2 sökseydi, PE2 önce label’a bakıp sonra bir de IP lookup yapmak zorunda kalırdı. Label P’de sökülünce PE2 sadece IP lookup yapıyor, bir iş eksiliyor.

Pratikte bunun anlamı şu: P ile PE2 arasındaki linkte (10.34.34.0/24) paket yakalarsan üzerinde label görmezsin. PE1 ile P arasındaki linkte ise 131069 label’ını görürsün. Label sadece bu LSP’nin ilk bacağında taşınıyor.

Diğer FEC’lere bakarsak (örneğin PE1’in 3.3.3.3/32 satırı) aynı şey orada da var: P’nin kendi loopback’i için verdiği label 131071, PE1 de bu yüzden label eklemeden (Push + implicit null) P’ye gönderiyor, P’de Pop olarak görünüyor.

PE1 ve PE2’de görünen ek Swap satırları (ör. PE1’de 4.4.4.4/32 için 131069 → 131069) bu akışın parçası değil. Tablo okurken Push, P’deki Swap ve hedef PE’deki Pop satırlarına odaklanmak yeterli.

6. Özet

  • OSPF, PE’lerin loopback’lerini birbirine öğretti ve yolu belirledi.
  • LDP, bu rotalar üzerinden label dağıttı ve PE1 ile PE2 arasında bir LSP kurdu (show router tunnel-table).
  • Giriş PE’si label’ı push, P router’ı swap, çıkış tarafı pop ediyor. Implicit null sayesinde label aslında P’de sökülüyor (PHP).
  • P router’ı paketin IP adresine bakmadan sadece label ile yönlendirme yapıyor, MPLS’in çekirdekte sağladığı kazanç bu.

Bir sonraki yazıda bu LSP’nin üzerine servis (Epipe/VPLS) kurup CE1 ile CE2’yi birbirine bağlayacağız.