Semestrální projekt do SPS Směrování pomocí MPLS v operačním systému linux Vypracoval: Milan Rumplík (rum015) Zbyněk Skála (ska095) Datum: 22.1.2006
Cíl projektu Cílem našeho projektu bylo ověřit podporu technologie Multiprotocol Label Switching (MPLS, rychlé přepínání paketů na základě značek) v OS Linux (síť Ethernet). Úvod do MPLS Primárním cílem pracovních skupin zabývajících se vývojem MPLS (Multi- Protocol Label switching) je standardizovat technologii která spojuje label swapping se směrováním na síťové vrstvě. Cílem této technologie je zlepšit poměr cena/výkon při směrování na síťové vrstvě, zlepšit rozšiřitelnost síťové vrstvy a poskytnout větší flexibilitu v doručování směrovaných služeb. Co je MPLS MPLS je připínací algoritmus, který je jednodušší než přepínací algoritmus IP. Přepínání paketů je založeno na značkách (labels), nikoliv na informaci IP hlavičky. Jak MPLS funguje Jakmile paket při své cestě sítí vstoupí do MPLS domény je označkován(klasifikován podle určených pravidel) a dále je v síti směrován na základě mu přiřazené značky. Ta se může při cestě přes směrovače měnit,ale nedochází již k opětné klasifikaci paketu. Na výstupu z MPLS domény je z paketu značka odebrána a paket je dále směrován pomocí jeho IP hlavičky.
MPLS a LDP Přiřazování značek k paketu může být nakonfigurováno buďto staticky na každém směrovači v MPLS doméně, nebo dynamicky. Pokud použijeme přístup dynamický musíme zajistit aby jednotlivé směrovače měli informaci o jednotlivých přeřazených značkách v MPLS doméně. K tomuto účelu slouží protokol LDP. LDP(label distribution protokol) je protokol, který zajišťuje výměnu přiřazených značek mezi jednotlivými směrovači pro naplnění jejich MPLS přepínacích tabulek. Praktická část Co bylo cílem a co se povedlo Našim cílem bylo vytvořit s PC, na kterém je nainstalován operační systém Linux směrovač, který by měl podporu pro MPLS. Vycházeli jsme z internetové adresy http://sourceforge.net/projects/mpls-linux/, na které se nachází dokumentace a soubory potřebné pro instalaci podpory MPLS v OS Linux. Zde se nám naskýtali dvě možnosti jak MPLS v Linuxu rozchodit : 1. Rozšířit naši instalaci OS Linux na PC o potřebné soubory pro podporu MPLS 2. Využít možnost stažení OS Linux-Knoppix MPLS s podporou pro MPLS
Ad1) Nejprve jsme se pokusili o možnost první. Zde jsme narazili hned na několik problémů, z nichž některé jsme nezvládli vyřešit. Náš postup byl následující: 1. Aby bylo možno MPLS podporu na Linuxu nainstalovat, je potřeba mít verzi jádra 2.6.9. Jelikož náš Linux měl verzi jádra starší, bylo potřeba nainstalovat jádro novější. 2. Do instalovaného jádra bylo potřeba provést patch dodatečných souborů 3. Dále bylo potřeba při instalaci jádra zvolit některé příslušné nastavení (zde jsme narazili na první problém, a to, že návod neodpovídal přesně skutečnosti.volby, které bylo potřeba označit se nenacházeli na určených místech a bylo je potřeba hledat, přičemž jednu se nám nepodařilo nalézt vůbec.) 4. Dále jsme provedli instalaci nového jádra, které jsme přidali do spouštěče LILO, aby jej bylo možno spustit. 5. Dále bylo nutné doinstalovat podporu LDP protokolu do quaggy. 6. Zde jsme narazili na další větší problém, který se nám již nepodařilo vyřešit. Jednalo se to, provést patch několika souborů do programu Quagga. Při tomto patchy docházelo k erorům, které se nám ani přes usilovnou snahu nepodařilo vyřešit a nakonec jsme tento pokus vzdali. ( Routovací démon Quagga spouští distribuci labelů. Dále se použije ke spuštění směrovacích protokolů OSPF, ) K tomuto pokusu bych chtěl závěrem říci, že i když se Nám nepodařilo MPLS tímto způsobem rozchodit, neznamená to že to nejde. Nicméně je nutné též konstatovat, že návody, které k tomuto byly nejsou příliš přesné a ani příliš podrobné. Ad2) Po té co jsme neuspěli s pokusem prvním, pokusili jsme se zprovoznit MPLS alespoň na OS Knoppix MPLS 3.7 (možné stáhnout zde) s již zabudovanou podporou pro MPLS. V tomto případě jsme byli již úspěšnější a podařilo se nám zprovoznit síť(viz obr. níže) pomocí statického nastavení MPLS(tedy bez LDP). Pokoušeli jsme se MPLS přepínání zprovoznit i dynamicky za pomoci routovacího démona Quagga. Při těchto pokusech se nám ovšem podařilo zprovoznit pouze LDP protokol ( routery si navzájem vyměňovali pakety LDP-hello ). K značkování paketů a k výměně značek však nedocházelo. LDP-hello pakety jsme zachytili pomocí programu Ethereal. Ještě bych zde chtěl zmínit některé problémy na které jsme narazili zde: Linux-Knoppix MPLS, který je zde ke stažení je francouzsky. Při startu sice můžete pomocí knoppix lang=us, zvolit jazyk anglický, ten ale změní na příslušní jazyk pouze nabídku start a popisky nikoliv však návod jak konfigurovat MPLS, který se zobrazí po startu systému (ten zůstane francouzsky).
Statická konfigurace MPLS na Linux-Knoppix MPLS Routery RA a RC vkládají/odstraňují značky, router RB přepíná na základě značek RA: bash# mpls nhlfe add key 0 Key: 0x00000002 bash# mpls nhlfe change key 0x2 instructions push gen 100 next hop eth0 ipv4 10.0.2.18 bash# ip route add 10.0.2.18/32 via 10.0.2.24 spec_nh 0x8847 0x2 bash# ip route add 10.0.3.19/32 via 10.0.2.24 spec_nh 0x8847 0x2 bash# ip route add 12.0.0.0/24 via 10.0.2.24 spec_nh 0x8847 0x2 bash# mpls labelspace add dev eth0 labelspace 0 bash# mpls ilm add label gen 200 labelspace 0 RB: bash# mpls nhlfe add key 0 Key: 0x00000002 bash# mpls nhlfe change key 0x2 instructions push gen 200 next hop eth0 ipv4 10.0.2.24 bash# ip route add 10.0.2.24/32 via 10.0.2.18 spec_nh 0x8847 0x2 bash# ip route add 11.0.0.0/24 via 10.0.2.18 spec_nh 0x8847 0x2 bash# mpls labelspace add dev eth1 labelspace 0 bash# mpls ilm add label gen 201 labelspace 0 bash# mpls nhlfe add key 0 Key: 0x00000003 bash# mpls nhlfe change key 0x3 instructions push gen 101 next hop eth1 ipv4 10.0.3.19 bash# ip route add 10.0.3.19/32 via 10.0.3.18 spec_nh 0x8847 0x3 bash# ip route add 12.0.0.0/24 via 10.0.3.18 spec_nh 0x8847 0x3
bash# mpls labelspace add dev eth0 labelspace 0 bash# mpls ilm add label gen 100 labelspace 0 RC: bash# mpls nhlfe add key 0 Key: 0x00000002 bash# mpls nhlfe change key 0x2 instructions push gen 201 next hop eth0 ipv4 10.0.3.18 bash# ip route add 10.0.2.24/32 via 10.0.3.19 spec_nh 0x8847 0x2 bash# ip route add 10.0.3.18/32 via 10.0.3.19 spec_nh 0x8847 0x2 bash# ip route add 11.0.0.0/24 via 10.0.3.19 spec_nh 0x8847 0x2 bash# mpls labelspace add dev eth0 labelspace 0 bash# mpls ilm add label gen 101 labelspace 0 Popis konfiguračních příkazů nhlfe gen labelspace přepínací tabulka MPLS značka MPLS v obecném formátu prostor značek, ze kterých se značky přidělují pro odchozí pakety záznamy v nhlfe tabulce jsou spojeny s identifikátorem (klíčem) bash# mpls nhlfe add key 0 Key: 0x00000002 - operační systém vytvořil klíč 0x2 Odchozí pakety značkuj číslem 100 a posílej přes rozhraní eth0 na 10.0.2.18 bash# mpls nhlfe change key 0x2 instructions push gen 100 next hop eth0 ipv4 10.0.2.18 Pakety do sítě (na počítač) 10.0.2.18/32 posílej na interface 10.0.2.24 0x2 spojuje statickou cestu se záznamy v nhlfe tabulce, nepodařilo se nám však dohledat co znamená příkaz spec_nh 0x8847 bash# ip route add 10.0.2.18/32 via 10.0.2.24 spec_nh 0x8847 0x2 Rozhraní eth0 začlen do prostoru značek 0 bash# mpls labelspace add dev eth0 labelspace 0 Přicházející pakety budou přicházet s návěstím 200 bash# mpls ilm add label gen 200 labelspace 0
Odchytnuté pakety 1. Ping 12.0.0.2 -> 11.0.0.2 Ethereal 1 ICMP reguest > Frame 1 (102 bytes on wire, 102 bytes captured) > Ethernet II, Src: 00:02:b3:2b:6a:c5, Dst: 00:02:b3:2b:6c:ca MPLS Label: Unknown (200) MPLS TTL: 62 > Internet Protocol, Src Addr: 12.0.0.2 (12.0.0.2), Dst Addr: 11.0.0.2 (11.0.0.2) ICMP reply > Frame 2 (102 bytes on wire, 102 bytes captured) > Ethernet II, Src: 00:02:b3:2b:6c:ca, Dst: 00:02:b3:2b:6a:c5 MPLS Label: Unknown (100) MPLS TTL: 63 > Internet Protocol, Src Addr: 11.0.0.2 (11.0.0.2), Dst Addr: 12.0.0.2 (12.0.0.2) Ethereal 2 ICMP reguest > Frame 1 (102 bytes on wire, 102 bytes captured) > Ethernet II, Src: 00:02:b3:2b:69:f5, Dst: 00:30:4f:3b:6b:63 MPLS Label: Unknown (201) MPLS TTL: 63 > Internet Protocol, Src Addr: 12.0.0.2 (12.0.0.2), Dst Addr: 11.0.0.2 (11.0.0.2) ICMP reply > Frame 2 (102 bytes on wire, 102 bytes captured) > Ethernet II, Src: 00:30:4f:3b:6b:63, Dst: 00:02:b3:2b:69:f5 MPLS Label: Unknown (101) MPLS TTL: 62 > Internet Protocol, Src Addr: 11.0.0.2 (11.0.0.2), Dst Addr: 12.0.0.2 (12.0.0.2)
Na výše uvedených výpisech z paketového analyzátoru vidíme, jak ICMP request paket postupně procházel přes směrovače, tak se postupně měnily MPLS značky. RC -> 201 ->RB -> 200 -> RA. Tomu odpovídá ICMP reply paket. RA -> 100 ->RB -> 101 -> RC. Pro úplnost uvádíme i ping opačným směrem 2. Ping 11.0.0.2 -> 12.0.0.2 Ethereal 1 ICMP reguest > Frame 1 (102 bytes on wire, 102 bytes captured) > Ethernet II, Src: 00:02:b3:2b:6c:ca, Dst: 00:02:b3:2b:6a:c5 MPLS Label: Unknown (100) MPLS TTL: 63 > Internet Protocol, Src Addr: 11.0.0.2 (11.0.0.2), Dst Addr: 12.0.0.2 (12.0.0.2) ICMP reply > Frame 2 (102 bytes on wire, 102 bytes captured) > Ethernet II, Src: 00:02:b3:2b:6a:c5, Dst: 00:02:b3:2b:6c:ca MPLS Label: Unknown (200) MPLS TTL: 62 > Internet Protocol, Src Addr: 12.0.0.2 (12.0.0.2), Dst Addr: 11.0.0.2 (11.0.0.2) Ethereal 2 ICMP reguest > Frame 1 (102 bytes on wire, 102 bytes captured) > Ethernet II, Src: 00:30:4f:3b:6b:63, Dst: 00:02:b3:2b:69:f5 MPLS Label: Unknown (101) MPLS TTL: 62 > Internet Protocol, Src Addr: 11.0.0.2 (11.0.0.2), Dst Addr: 12.0.0.2 (12.0.0.2) ICMP reply > Frame 2 (102 bytes on wire, 102 bytes captured) > Ethernet II, Src: 00:02:b3:2b:69:f5, Dst: 00:30:4f:3b:6b:63 MPLS Label: Unknown (201)
MPLS TTL: 63 > Internet Protocol, Src Addr: 12.0.0.2 (12.0.0.2), Dst Addr: 11.0.0.2 (11.0.0.2)
Konfigurace MPLS pomocí Quaggy a s použitím LDP Nejprve je nutné obsah adresáře /etc/quagga nahradit obsahem adresáře /KNOPPIX/etc/quagga. Dále musíme změnit soubor daemons... ldpd=yes... Tímto zásahem docílíme zpuštění distribuce MPLS značek. Soubor ldpd.conf Zebra configuration saved from vty 2006/01/23 12:39:00 hostname ldpd password zebra rozhraní eth0 bude používat LDP interface eth0 mpls ip interface eth1 interface lo interface sit0
spuštění instance LDP mpls ldp egress connected po přihlášení nebude docházet k automatickému odhlašování line vty exec-timeout 0 0 Soubor zebra.conf Zebra configuration saved from vty 2006/01/23 12:36:11 hostname Router password zebra přiřadí eth0 ip adresu a zařadí jej do labespace 0 interface eth0 mpls labelspace 0 ip address 10.0.0.2/24 ipv6 nd suppress-ra interface lo interface sit0 ipv6 nd suppress-ra ip forwarding line vty exec-timeout 0 0 Quaggu spustíme příkazem bash# /etc/init.d/quagga start Nyní se musíme připojit ke každé instanci, kterou jsme tímto příkazem spustili ( zebra, ldpd ). bash#telnet 127.0.0.1 zebra nebo bash#telnet 127.0.0.1 ldpd heslo je vždy zebra Tyto kroky je třeba zopakovat na všech routerech, přičemž je nutné měnit ip adresy a masky podle vámi zvolené konfigurace.
Po těchto krocích se dostanete do stavu, kdy si sousední routery vyměňují LDP-hello zprávy a keep alive zprávy. Podle našeho názoru není možné s touto verzí quaggy ( tedy tou, obsaženou na CD KNOPPIX-MPLS ) dosáhnout výměny MPLS značek pomocí LDP. hello Frame 1 (84 bytes on wire, 84 bytes captured) Ethernet II, Src: 00:02:b3:2b:6a:c5, Dst: 01:00:5e:00:00:02 Internet Protocol, Src Addr: 10.0.0.2 (10.0.0.2), Dst Addr: 224.0.0.2 (224.0.0.2) User Datagram Protocol, Src Port: 646 (646), Dst Port: 646 (646) Label Distribution Protocol Version: 1 PDU Length: 38 LSR ID: 11.0.0.2 (11.0.0.2) Label Space ID: 0 Hello Message 0...... = U bit: Unknown bit not set Message Type: Hello Message (0x100) Message Length: 28 Message ID: 0x00000001 Common Hello Parameters TLV 00..... = TLV Unknown bits: Known TLV, do not Forward (0x00) TLV Type: Common Hello Parameters TLV (0x400) TLV Length: 4 Hold Time: 15 0............ = Targeted Hello: Link Hello.0........... = Hello Requested: Source does not request periodic hellos..00 0000 0000 0000 = Reserved: 0x0000 IPv4 Transport Address TLV 00..... = TLV Unknown bits: Known TLV, do not Forward (0x00) TLV Type: IPv4 Transport Address TLV (0x401) TLV Length: 4 IPv4 Transport Address: 11.0.0.2 (11.0.0.2) Configuration Sequence Number TLV 00..... = TLV Unknown bits: Known TLV, do not Forward (0x00) TLV Type: Configuration Sequence Number TLV (0x402) TLV Length: 4 Configuration Sequence Number: 4
Keep alive Frame 6 (84 bytes on wire, 84 bytes captured) Ethernet II, Src: 00:02:b3:2b:6c:ca, Dst: 00:02:b3:2b:6a:c5 Internet Protocol, Src Addr: 10.0.0.1 (10.0.0.1), Dst Addr: 10.0.0.2 (10.0.0.2) Transmission Control Protocol, Src Port: 646 (646), Dst Port: 1046 (1046), Seq: 0, Ack: 0, Len: 18 Label Distribution Protocol Version: 1 PDU Length: 14 LSR ID: 10.0.0.1 (10.0.0.1) Label Space ID: 0 Keep Alive Message 0...... = U bit: Unknown bit not set Message Type: Keep Alive Message (0x201) Message Length: 4 Message ID: 0x0000001b Použité zdroje http://mpls-linux.sourceforge.net/simple.php http://perso.enst.fr/~casellas/mpls-linux/index.html