V programu nebyla implementovana zadna rozsireni, vypis odposlechnutych informaci ma format odpovidajici programu wireshark a vypis databaze LSA odpovida formatu na zarizenich firmy Cisco.
Program je spustitelny na operacnich systemech FreeBSD a Linux. Pro preklad na operacnim systemu FreeBSD pouzijte GNU Make bez parametru.
> gmake
Pro preklad na operacnim systemu Linux je potreba dodat parametr linux.
> make linux
Pro dalsi nastaveni chovani programu je mozne zmenit definice v hlavickovem souboru const.h. Popis definic je mozne najit v dokumentaci.
@z tohoto souboru byla pro kompatibilitu odstranena diakritika
Cílem projektu bylo implementovat aplikaci pro odposlech OSPF zpráv podporující IPv4 a IPv6 LSA topologické informace a po ukončení tohoto programu i exportér OSPFv3 LSA topologických informací. Aplikace je implementována v programovacím jazyku C pro prostředí FreeBSD/Linux.
Směrovací protokoly zahrnují sadu procesů, datových struktur, algoritmů a zpráv, které slouží k přenosu informací mezi směrovači. Umožňují tak směrovači se autonomně rozhodnout o tom, na který výstup odešle zprávy, které nejsou určeny pro zařízení k němu přímo připojená, ale pro zařízení, ke kterým pomocí směrovacích protokolů získal cestu.
Směrovací protokoly se rozdělují na Distance Vector a Link State protokoly. Distance Vector protokoly jsou vhodné pro menší sítě, ve kterých není potřeba znát síťovou topologii. Pro výpočet nejlepší cesty používají Bellman-Fordův algoritmus a mezi typické zástupce patří protokoly RIPv1, RIPv2, IGRP, EIGRP. Oproti tomu Link State protokoly vytváří kompletní pohled na topologii sítě a umožňují tak efektivnější směrování v rozsáhlejších sítích.
Open Shortest Path First, neboli zkráceně OSPF je Link State směrovací protokol využívající Dijkstrova algoritmu stejného názvu. Byl vyvinut jako náhrada protokolu RIP, zahrnuje koncept oblastí a pomocí výše zmíněného algoritmu vytváří kompletní topologii sítě. To mu umožňuje nasazení ve větších, hierarchicky strukturovaných sítích s možností pozdějšího růstu.
Protokol za svou dobu prošel několika inovacemi. Původní OSPFv1 byl pouze experimentální, ktežto OSPFv2, který byl vyvinut Johnem Moyem v roce 1991 se dočkal okamžitého nasazení na poli počítačových sítí. Nejnovější revize OSPFv3 zahrnuje podporu IPv6 a zjednodušuje některé ze zpráv, které používá jeho předchůdce.
Následující tabulka uvádí typy zpráv protokolu OSPFv2 a OSPFv3.
Kód zprávy | Typ zprávy | Popis |
0x01 | Hello | Slouží k objevení sousedů a navázání spojení mezi směrovači. |
0x02 | Database Description | Obsahuje zkracený seznam databáze směrovacích informací. |
0x03 | Link-State Request | Požadavek na směrovací informace. |
0x04 | Link-State Update | Odpověď na požadavek obsahující směrovací informace. |
0x05 | Link-State Acknowledgment | Potvrzení příjmu směrovacích informací. |
Informace o databázi směrovače jsou distribuovány ve formě zpráv Link-State Advertisments (LSA), které jsou obsaženy ve zprávě typu Link-State Update. Zde jsou již typy zpráv různých revizí více odlišné. V následující tabulce jsou uvedeny typy zpráv a jejich popis pro OSPFv3.
Kód zprávy | Typ zprávy | Popis |
0x2001 | Router-LSA | Popis stavu a metriky rozhranní směrovače. |
0x2002 | Network-LSA | Popis všech směrovaču připojených k danému spoji. |
0x2003 | Inter-Area-Prefix-LSA | Popis cest a prefixů v jiných oblastech. |
0x2004 | Inter-Area-Router-LSA | Původcem těchto zpráv jsou hraniční směrovače informující ostatní hraniční směrovače v jiných oblastech o vnitřních cestách. |
0x4005 | AS-External-LSA | Slouží pro popis implicitní cesty. |
0x2006 | Neschváleno | |
0x2007 | NSSA-LSA | Vysílány hraničními směrovači k popisu vzdálených lokací mimo autonomní systém. |
0x0008 | Link-LSA | Pro každý fyzický spoj je generána zpráva tohoto typu, která poskytuje informace směrovačům na daném spoji o adresách typu link-local a prefixech. |
0x2009 | Intra-Area-Prefix-LSA | Určeno pro šíření informací o prefixech spojených s místní adresou směrovače, síťovým segmentem, nebo připojeným tranzitním síťovým segmentem. |
Program zachytává zprávy na naslouchaném ethernetovém rozhranní v promiskuitním módu a vypisuje informace v nich obsažené. Tyto informace zahrnují výpis hlavičky ethernetového rámce, výpis hlavičky IP packetu a dále hlavičku, typ zprávy popř. další doplňující informace OSPF ve zprávě obsažené. Po ukončení programu zasláním signálu SIGINT je programem vypsána OSPFv3 topologie z odposlechnutých zpráv.
Pro spuštění je potřeba programu pomocí parametru zadat rozhranní, na kterém bude naslouchat pomocí přepínače –i následujícím způsobem :
./myospfsniffer –i eth1 ,kde eth1 je rozhranní, na kterém se bude naslouchat. Pro výpis nápovědy je možné použít přepínač –h.
Program je rozčleněn do několika modulů :
- sys - obsahuje funkce pro tisk nápovědy, ethernetových a ip hlaviček a dále funkce pro tisk IPv4 a IPv6 adres a jejich prefixů
- const - definice kostant použitých v programu
- binary - makro pro převod čísla z binární reprezentace do reprezentace programovacího jazyka C
- ospfv2 - struktury a funkce pro výpis OSPFv2 informací
- ospfv3 - struktury a funkce pro výpis OSPFv3 informací
- ospfv3_db - struktury a funkce pro záznam a výpis OSPFv3 topologie
- main - samotný program
Pro odposlech byla použita knihovna libpcap, bez použití filtrace, což umožnilo zpracovat přijaté zprávy přímo v programu a vypsat tak přesné pořadové číslo tak, jak to dělá například program Wireshark. Pro použití filtru je však možné změnit definici FILTER_EXP, v hlavičkovém souboru main.h. Stejně tak je možné zapnout/vypnout výpis ladících informací pomocí definice DEBUG, v hlavičkovém souboru const.h. Seznam dalšího nastavení překladu programu je obsažen v příloze 1.
O zpracování zprávy se stará funkce got_packet, která postupně rozlišuje struktury zprávy dle jejího typu (IPv4/IPv6, OSPF typy zpráv), vypisuje celé tyto struktury na standartní výstup a ukládá relevantní informace do databáze za použití dříve uvedených modulů. Formát výpisu zprávy lze změnit pomocí změny definic ETHERNET_FORMAT, IP_FORMAT, OSPF_HEADER_FORMAT, OSPF_TYPE_FORMAT, OSPF_LSA_HEADER_FORMAT a OSPF_LSA_FORMAT.
Je vhodné zmínit funkce pro tisk print_ospf2_lsa a print_ospf3_lsa. Tyto funkce přijímají jako parametr ukazatel na hlavičku LSA části OSPF zprávy, samostatně pak rozlišují typ předaného LSA a prostřednictvým pomocných funkcí tisknou LSA na standartní výstup. Problém nastává u struktur zprávy, které nemají přesně danou velikost jako například pole prefix u OSPFv3 Inter-Area-Prefix LSA, kde je nutné tuto velikost zjistit a pracovat s pamětí pouze v rozsahu zprávy. Dále se ve zprávách vyskytují pole, která se mohou opakovat. Je opět nutné ze zprávy zjistit počet opakování a tisknout pouze relevantní informace.
Databáze topologických informací je rozčleněna do několika struktur. Je vhodné rozlišovat informace od různých směrovačů, jejichž informace byla na rozhranní odposlechnuta a dále identifiční číslo instance procesu OSPF, která dané informace ze směrovače vyslala. LSA informace mohou patřit do různých oblastí a mohou být různého typu, což je potřeba pro efektivní prohledávání databáze také rozlišit. Vzhledem k tomu, že předem nevíme kolik routerů/instancí/oblastí budou odposlechnuté zprávy obsahovat, byly pro implementaci databáze zvoleny jednosměrně vázané seznamy. Na následujícím diagramu je znázorněna struktura databáze.
Topologická databáze je po zaslání signálu SIGINT celá vytištěna na standartní výstup ve formátu blížícímu se výpisu topologické databáze na směrovačích Cisco.
- RFC5340, RFC2328
- Přednášky CCNA2
3061 řádků kódu
Program je spustitelný na operačních systémech FreeBSD a Linux. Pro překlad na operačním systému FreeBSD použijte GNU Make bez parametrů.
> gmake
Pro překlad na operačním systému Linux je potřeba dodat parametr linux.
make linux
V následující tabulce jsou uvedena různá nastavení programu, kterými lze změnit chování programu.
Nastavení | Popis |
PRINT_IP | výpis IP hlaviček |
PRINT_ETHERNET | výpis Ethernetových hlaviček |
PRINT_PACKET_NUMBER | výpis pořadového čísla packetu |
PRINT_OSPF_NUMBER | výpis pořadového čísla OSPF zprávy |
IP_PRETTY_PRINT | zapne výpis zkraceného tvaru IP adres a prefixů |
DEBUG | zapne výpis ladících zpráv |
ETHERNET_FORMAT | odsazení výpisu Ethernetové hlavičky |
IP_FORMAT | odsazení výpisu IP hlavičky |
OSPF_HEADER_FORMAT | odsazení výpisu OSPF hlavičky |
OSPF_TYPE_FORMAT | odsazení výpisu OSPF zprávy (Hello, DBU, ...) |
OSPF_LSA_HEADER_FORMAT | odsazení výpisu LSA hlavičky |
OSPF_LSA_FORMAT | odsazení výpisu LSA zprávy |
PRINT_LLS | zapne výpis LLS bloku |
Tato nastavení se provádějí změnou definic v hlavičkovém souboru const.h.