Martin Liška Pasivn´ı analyzátor s´ıt´ı - NEPAL
Transkript
Martin Liška Pasivn´ı analyzátor s´ıt´ı - NEPAL
Univerzita Karlova v Praze Matematicko-fyzikálnı́ fakulta BAKALÁŘSKÁ PRÁCE Martin Liška Pasivnı́ analyzátor sı́tı́ Katedra aplikované matematiky Vedoucı́ bakalářské práce: Mgr. Martin Mareš, Ph.D. Studijnı́ program: Informatika, obor Programovánı́ 2010 Chtěl bych poděkovat Mgr. Martinu Marešovi, Ph.D. za vedenı́ bakalářské práce, cenné rady, účelné připomı́nky a za ochotu při společné práci. Prohlašuji, že jsem svou bakalářskou práci napsal(a) samostatně a výhradně s použitı́m citovaných pramenů. Souhlası́m se zapůjčovánı́m práce a jejı́m zveřejňovánı́m. V Praze dne 3. srpna 2010 Martin Liška 2 Obsah 1 Úvod 1.1 Analýza sı́t’ového provozu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Problémy s provozovánı́m sı́tě . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Motivace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Rodina protokolů TCP/IP 2.1 Architektura protokolu TCP/IP . . . . 2.2 Historie protokolu TCP/IP . . . . . . . 2.3 Porovnánı́ s modelem ISO/OSI . . . . 2.4 Linková vrstva a technologie Ethernet . 2.5 Sı́t’ová vrstva IP . . . . . . . . . . . . . 2.6 Transportnı́ vrstva . . . . . . . . . . . 2.6.1 Protokol UDP . . . . . . . . . . 2.6.2 Protokol TCP . . . . . . . . . . 3 Pasivnı́ sı́t’ové analyzátory 3.1 Definice . . . . . . . . . . . . 3.2 Tcpdump . . . . . . . . . . . 3.3 Tcpflow . . . . . . . . . . . . 3.4 Wireshark . . . . . . . . . . . 3.4.1 Historie . . . . . . . . 3.4.2 Filtrovánı́ . . . . . . . 3.4.3 Analýza rámců . . . . 3.4.4 Statistické komponenty 3.5 Netgrind . . . . . . . . . . . . 4 Sı́t’ový analyzátor NEPAL 4.1 Představenı́ . . . . . . . . . . 4.2 Zapojenı́ programu . . . . . . 4.3 Datový objekt . . . . . . . . . 4.4 Představenı́ modulů . . . . . . 4.4.1 Modul PCAP . . . . . 4.4.2 Modul Ethernet . . . . 4.4.3 Modul ARP . . . . . . 4.4.4 Modul ARP view . . . 4.4.5 Modul IPv4 . . . . . . 4.4.6 Modul IPv6 . . . . . . 4.4.7 Modul IP reassembler 4.4.8 Modul UDP . . . . . . 4.4.9 Modul TCP . . . . . . 4.4.10 Modul TCP flow . . . 4.4.11 Modul HTTP . . . . . 4.4.12 Modul DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 6 6 6 . . . . . . . . 8 8 8 9 10 11 13 13 13 . . . . . . . . . 16 16 16 17 17 18 18 19 19 19 . . . . . . . . . . . . . . . . 20 20 20 21 21 22 23 23 24 24 24 25 26 26 27 27 28 5 Ovládánı́ programu NEPAL 5.1 Překlad programu . . . . . . . . . . . 5.2 Ukázka programu . . . . . . . . . . . 5.3 Ovládánı́ a programátorské rozhranı́ . 5.4 Spouštěnı́ programu . . . . . . . . . . . . . . 29 29 29 30 32 . . . . . . . . . 33 33 33 33 34 35 35 37 37 39 . . . . . 42 42 42 42 43 43 8 Závěr 8.1 Zhodnocenı́ práce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Možnosti budoucı́ho vývoje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 45 45 Literatura 46 6 Ukázky z programu NEPAL 6.1 Modul pro HTTP . . . . . 6.1.1 Prvnı́ přı́klad . . . 6.1.2 Druhý přı́klad . . . 6.1.3 Třetı́ přı́klad . . . 6.2 Grafový modul . . . . . . 6.2.1 Prvnı́ přı́klad . . . 6.2.2 Druhý přı́klad . . . 6.3 Modul ARP/RARP . . . . 6.4 Modul DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Vnitřnı́ řešenı́ analyzátoru 7.1 Soubory programu . . . . . . . . 7.2 Implementace datového objektu . 7.3 Zásobnı́k událostı́ . . . . . . . . . 7.4 Programovánı́ modulů . . . . . . 7.5 Představa fungovánı́ modulu TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Název práce: Pasivnı́ analyzátor sı́tı́ Autor: Martin Liška Katedra (ústav): Katedra aplikované matematiky Vedoucı́ bakalářské práce: Mgr. Martin Mareš, Ph.D. E-mail vedoucı́ho: [email protected] Abstrakt: Cı́lem práce je navrhnout a implementovat program pro monitorovánı́ a analýzu provozu v počı́tačových sı́tı́ch, který bude pracovat čistě pasivně, tedy aniž by ovlivňoval měřenou komunikaci. Informace o chovánı́ sı́tě bude zı́skávat odposlouchávánı́m přenášených paketů, z nichž bude rekonstruovat chod sı́t’ových spojenı́ a činnost přenosových protokolů. Klı́čová slova: analýza, TCP/IP, počı́tačové sı́tě Title: A passive network analyser Author: Martin Liška Department: Department of Applied Mathematics Supervisor: Mgr. Martin Mareš, Ph.D. Supervisor’s e-mail address: [email protected] Abstract: The aim of this thesis is to design and implement a program for computer network traffic monitoring and analysis that would operate in a purely passive mode, i.e., without affecting the measured traffic. Information about the network performance will be received by tapping the transmitted packets, which will enable the software to reconstruct the operation of network connections as well as activity of the transfer protocols. Keywords: analysis, TCP/IP, computer networks 5 Úvod 1.1 Analýza sı́t’ového provozu Provozovánı́ sı́t’ové komunikace mezi počı́tači je v dnešnı́ době již dávno zaběhlá praxe a množstvı́ datového provozu a počet lidı́, kteřı́ majı́ přı́stup k Internetu budiž toho důkazem. Počet uživatelů sı́tě Internet se vyšvihl na dnešnı́ hodnotu 1,8 miliardy lidı́, což odpovı́dá vı́ce než čtvrtině obyvatelstva planety a oproti roku 2000 vzrostl tento počet uživatelů čtyřnásobně. Jenom v rámci páteřnı́ sı́tě NIX.CZ v České republice vzrostlo množstvı́ přenesených dat dvojnásobně oproti roku minulému. Z pohledu samotného sı́t’ového provozu je valná většina informacı́ přenášena pomocı́ rodiny protokolů TCP/IP a dı́ky nezašifrované většině provozu je možné záznamy komunikace sledovat, ukládat a následně analyzovat. Viděno očima běžného uživatele, napřı́klad sı́tě Internet, je komunikace a přenos dat v rámci sı́tě černou skřı́ňkou, která zdánlivě funguje velmi spolehlivě, intuitivně a bezpečně. 1.2 Problémy s provozovánı́m sı́tě Druhá strana mince ale jasně ukazuje, že zneužitı́ přenášených informacı́ je vcelku snadné, přı́kladem budiž možnost sledovánı́ navštı́vených webových stránek, odeslaných formulářů a emailových zpráv obsahujı́cı́ch osobnı́ informace, zobrazených obrázků, odeslaných zpráv napřı́klad pomocı́ protokolu IRC či možnost dohledánı́ hesel, kterými se uživatel autorizuje na nezašifrovaných webových serverech. Se svojı́ velikostı́ se stal Internet kolbištěm nejrůznějšı́ch zájmů, počı́naje masivnı́ reklamou na každém kroku, přes rozesı́lánı́ nevyžádané pošty, šı́řenı́ internetových červů a konče útoky na citlivé osobnı́ údaje v podobě databázových aplikacı́. Druhým fenoménem dnešnı́ch počı́tačových sı́tı́ je tempo narůstánı́ přenosového výkonu infrastruktury. Docházı́ k nasazovánı́ stále sofistikovanějšı́ch sı́t’ových zařı́zenı́, které si ale s sebou nesou problémy úzkých hrdel. Rychlost v počı́tačové sı́ti se řı́dı́ rychlostı́ jejı́ho nejužšı́ho mı́sta, přestože v globálnı́ měřı́tku můžeme o sı́ti uvažovat jako o předimenzované. Jako přı́klad mohou posloužit různé proxy servery, jenž zprostředkovávajı́ komunikaci mimo lokálnı́ sı́t’ nebo protokoly pro sdı́lenı́ souborů typu P2P, které dokáži otevřı́t velké množstvı́ spojenı́. Návaznostı́ na zmı́něné problémy je dobré problémům porozumět a analýza sı́t’ového provozu může být dobrým pomocnı́kem pro zı́skávánı́ důležitých informacı́. 1.3 Motivace Cı́lem bakalářské práce nenı́ zneužitı́ slabin sı́t’ového modelu, nýbrž právě naopak vytvořenı́ programu, který bude schopen nashromážděná sı́t’ová data načı́tat, analyzovat a poskytovat specifické informace, v podobě člověku co možná nejvı́ce přı́větivé. Přenášená data pomocı́ rodiny protokolů TCP/IP jsou přenášena ve formě rámců (paketů), jenž v sobě nesou pouze dı́lčı́ část mozaiky a skladba kompletnı́ mozaiky, chápané napřı́klad ve smyslu přenesených emailů či HTML stránek potřebuje většı́ úsilı́ při syntéze. Již od rané fáze návrhu programového 6 řešenı́ je kladen důraz na modularitu a možná dalšı́ rozšı́řenı́ libovolného druhu. Software lze chápat jako kmen stromu, který poskytuje základnı́ funkčnost a na který lze naroubovat různá rozšı́řenı́ a vylepšenı́. Ambicı́ programu nemůže být v žádném přı́pade podpora pro všechny známé protokoly, ale cı́lem je poskytnout framework, jenž nabı́dne jednoduché rozšı́řenı́ v podobě modulu v Pythonu či modulu v jazyce C, který bude optimalizovaný na rychlost. Program bude implementovat podporu základnı́ch protokolů vrstevnatého modelu TCP/IP: Ethernetový protokol, sı́t’ový protokol verze 4 i 6, protokol TCP a UDP. Zmı́něné protokoly chápu jako nosnou kostru, na které probı́há přenos většiny dnešnı́ch aplikačnı́ch protokolů a ukázkové moduly budou právě pracovat na zmı́něném základu. 7 Rodina protokolů TCP/IP 2.1 Architektura protokolu TCP/IP Rodinou protokolů TCP/IP nazýváme množinu sı́t’ových protokolů užı́vaných v sı́ti Internet a v jiných počı́tačových sı́tı́. Název rodiny je odvozen z jména protokolu sı́t’ové vrstvy (Internet Protocol) a jména spojovaného protokolu transportnı́ vrstvy (Transmission Control Protocol). Rodina pokrývá 4 vrstvy sı́t’ového modelu: linková, sı́t’ová, transportnı́ a aplikačnı́. Vznik protokolu je pevně svázán s rozvojem a prvopočátkem celosvětové počı́tačové sı́tě Internet. Protokol vznikl v lůně Internetu a stal se jeho hlavnı́m nosným médiem. Myšlenka paketového přenosu je téměř 50 let stará a vznikla jako duálnı́ idea k sı́ti telefonnı́, kterou odstartoval Alexander Graham Bell v 80. letech 19. stoletı́. Ve svém návrhu počı́tá s umı́stěnı́m inteligence do koncových uzlů sı́tě, negarantuje přenosovou kapacitu, ale pracuje v režimu best effort“ (maximálnı́ možná ” snaha). Standardy a specifikace kolem protokolu vznikly ve formě dokumentů RFC (Request for Comments), kde se široké množstvı́ odbornı́ků shodlo na svobodných, nelicencovaných standardech a vložili tı́m tak do vı́nku velké množstvı́ potenciálu do budoucna. Drobným problémem dokumentů RFC je nemožnost jejich modifikace a nutnost vydávánı́ nového dokumentu při modifikaci. Pro tyto účely vznikly dokumenty STD (standard) dokumenty, které si lze představit jako pořadač, do kterého se ukládajı́ RFC dokumenty, týkajı́cı́ se stejného problému. 2.2 Historie protokolu TCP/IP Jak již bylo výše zmı́něno, myšlenka paketového přenosu se rozvinula na počátku 60. let 20. stoletı́ v USA v rámci armádnı́ grantové agentury ARPA. Spojené státy v době Studené války prohrály pomyslný souboj o dobytı́ vesmı́ru v roce 1957 vesmı́rnou lodı́ Sputnik a rozhodly se investovat do budoucı́ch technologiı́. Na ověřenı́ faktu, zda je myšlenka paketového přenosu uskutečnitelná vznikla na konci 70. let sı́t’ Arpanet. V sı́ti byl nasazen experimentálnı́ protokol NCP (Network Control Program), který kopı́roval z dnešnı́ho hlediska funkci transportnı́ vrstvy. Prvnı́ představa rodiny protokolů TCP/IP byla prezentována v roce 1972 a jejı́ jméno je spjato s osobou Vintona Gray Cerfa, který jako postgraduálnı́ student na Kalifornské univerzitě a Stanfordské univerzitě pořádá sı́t’ové semináře, jichž se účastnı́ např. Robert Metcalfe (3Com) nebo Jack Haverty. Původně měl být nástupce experimentálnı́ho protokolu také monolitický, ale posléze autoři změnili koncepci a došlo k rozpadu na protokol sı́t’ový (IP) a transportnı́ (TCP). Na přelomu let 70. a 80. se stává protokol TCP/IP preferovaným Ministerstvem obrany Spojených států a 1. 1. 1983 na něj přešlo všech zhruba 200 směrovačů předchůdce dnešnı́ sı́tě Internet. Za druhé datum narozenı́ některé autority považujı́ zářı́ 1981, kdy spatřily světlo světa RFC dokumenty 791 a 793, v nichž se specifikujı́ protokoly IP a TCP. V rámci přechodu vlastnictvı́ a plánovánı́ problematiky kolem Internetu a protokolů TCP/IP vznikla organizace ISOC (Internet Society), která převzala od vlády Spojených států odpovědnost za dalšı́ vývoj a vystupuje jako organizace k ostatnı́m subjektům na trhu. V rámci organizace je kladen důraz na kontinuitu a stromovou strukturu, kde jednotlivé divize zastřešujı́ na jedné straně vývoj do budoucna a řešenı́ aktuálnı́ch problému např. s nedostatkem IPv4 veřejných adres konče. 8 2.3 Porovnánı́ s modelem ISO/OSI Referenčnı́ model ISO/OSI vznikl jako model pro počı́tačové sı́tě z dı́lny Mezinárodnı́ organizace pro standardy (ISO) v roce 1984. Model pocházı́ ze světa spojů a v průběhu své geneze a vývoje se ubı́ral značně odlišně od rodiny protokolů TCP/IP, se kterými nakonec prohrál na plné čáře. Koncepce se zrodila od zeleného stolu, definovaly se obecně funkce jednotlivých vrstev bez korespondence s realitou a vyzkoušenou implementacı́. Pro porovnánı́ je nutné v 2. fázı́ přijetı́ dokumentu RFC pro protokoly souvisejı́cı́ s TCP/IP vytvořit alespoň dvě funkčnı́ implementace a v praxi je ověřit a důkladně otestovat. Autoři nakladli velkou množinu požadavků na sı́t’ovou architekturu a prosadili ji do standardu. Organizace ISO měla velký vliv na fungovánı́ státu a správa států tlačila na pořizovánı́ zařı́zenı́, jež by vyhovovalo standardům a bylo plně kompatibilnı́. V důsledku širokého rozpětı́ referenčnı́ho modelu museli ze svých požadavků tvůrci ustupovat a vyjasnili je až v podmnožině, známé pod jménem GOSIP (Government OSI Profile). Pro porovnánı́ ukažme paralelu s protokoly TCP/IP, které vznikaly od jednoduššı́ho ke složitějšı́mu. Jako přı́klad bych rád uvedl elektronickou poštu a SMTP protokol. Prvnı́ verze uměla pouze přenášet zprávy v prostém textu bez možnosti formátovánı́, vkládánı́ obrázků, přı́loh a to včetně možnosti užitı́ národnı́ch znaků abecedy. Na poptávku reagovalo rozšı́řenı́ MIME (Multipurpose Internet Mail Extensions – vı́ceúčelové rozšı́řenı́ internetové pošty), jež specifikovalo a zahrnovalo výše zmı́něné nedostatky. Na následujı́cı́m obrázku si můžete prohlédnout korespondenci sedmi vrstev modelu ISO/OSI s čtyřmi vrstvami v přı́padě modelu TCP/IP. Za nejvı́ce kritizované vrstvy modelu ISO/OSI považuji vrstvu relačnı́ a prezentačnı́, které majı́ velmi omezené penzum práce oproti ostatnı́m. Naopak velké portfolio služeb se soustředilo do vrstvy linkové, jež se následkem toho rozpadla na podvrstvy LLC a MAC. Dalšı́m důležitým rozdı́lem je přı́tomnost spojovaného charakteru přenosu a spolehlivého doručovánı́ v ISO/OSI. Autoři ze světa telefonnı́ch systémů považovali nespolehlivou službu za zbytečnou, neviděli důvod, proč by jı́ měl někdo koupit a v důsledku toho museli investovat do drahé vnitřnı́ infrastruktury sı́t’ových prvků. V prostředı́ TCP/IP je negarantovaný přenos hojně užı́ván např. v P2P sı́tı́ch (sı́tě, kde se informace přenášı́ mezi uzly bez centrálnı́ho serveru), kdy aplikace implementuje algoritmus pro potvrzovánı́ přenesených dat dle vlastnı́ logiky a potřeby. Spo9 jovaný charakter komunikace zase vycházel z fungovánı́ telefonnı́ sı́tě, avšak na přenos malého množstvı́ dat se nevyplatı́ navazovat spojenı́. V rámci propojovánı́ sı́tı́ se ukázal model ISO/OSI jako velmi slabý, od začátku předpokládal topologie sı́ti v dikci vlád, proto je podpora propojovánı́ sı́tı́ (internetworking) velmi slabá. Problematiky se týká i návrh linkové vrstvy pouze na dvoubodových spojı́ch, načež musel být dodatečně zakomponován mechanismus pracujı́cı́ se sdı́leným médiem, který vyústil v rozpad linkové vrstvy. Model počı́tal s podobou velmi rozsáhlé sı́tě oproti sı́ti lokálnı́ a dlouho dobu byl prosazován jako oficiálnı́ a certifikované řešenı́. Po třech fázı́ch přibližovánı́ a smiřovánı́ s potřebami počı́tačové sı́tě se stal ISO/OSI model prakticky mrtvým řešenı́m, na kterém se ukázaly prvotnı́ nedostatky v celkové koncepci a filosofii přı́stupu. 2.4 Linková vrstva a technologie Ethernet Sı́t’ový model TCP/IP nespecifikuje linkové vrstvy použité na přenosové sı́ti, pouze specifikuje vrstvu sı́t’ového rozhranı́, která je závislá na použitı́ konkrétnı́ho linkového protokolu. Nejpoužı́vanějšı́m linkovým protokolem je Ethernet, dále pak z historického hlediska Token ring, FDDI či X.25. Technologie Ethernetu se zrodila ve středisku PARC a nejznámějšı́ jména spjatá s jeho genezı́ jsou Robert Metcalfe a David Boggs. Firma Xerox si nechala po vývoji zaregistrovat jméno jako ochranou známku. Po předloženı́ návrhu na standardizaci společnosti IEEE se vývoj vydal dvěma hlavnı́mi vývojovými směry. IEEE standardizovalo Ethernet, původně navržený firmou Xerox, jako standard 802.3, který se odlišuje od původnı́ho návrhu. Autoři původnı́ho návrhu zakotvili koncepci Ethernetu do průmyslového standardu, známému jako Ethernet II (RFC 894). Oba zmı́něné formáty nevylučujı́ vzájemnou koexistenci a dle RFC 894 musı́ být ve světě TCP/IP každý počı́tač schopen komunikovat pomocı́ Ethernetu II. Atributy paketů dle obou specifikacı́ naleznete na dalšı́m obrázku. Při svém návrhu byl Ethernet koncipován jako technologie s přı́stupovou metodou CSMA/CD, kdy se předpokládá sdı́lené médium, zařı́zenı́ majı́ přı́poslech nosné a jsou schopny detekovat kolize. Filosofie nezaručuje každému, že bude hned schopen vysı́lat a proto technologie nenı́ vhodná automaticky do mı́st, kde potřebujeme nějaké záruky na maximálnı́ dobu do odvysı́lánı́. Od podpory na linkové vrstvě se odvı́jı́ i garance služeb QoS, na něž musı́ být myšleno již od nejnižšı́ch vrstev. Ethernet byl navržen jako 1-perzistentnı́, tedy čekajı́cı́ na konec jiného vysı́lánı́, ale v důsledku mikrosegmentace na úrovni přepı́načů je princip dnes zastaralý a použı́vaný hojně spı́še v sı́tı́ch typu 802.11 (bezdrátové lokálnı́ sı́tě). 10 Při programovánı́ modulu pro načı́tánı́ a zpracovánı́ Ethernetových rámců jsou nejdůležitějšı́mi atributy: zdrojová a cı́lová hardwarová adresa ve formátu EUI-48 a typ použitého sı́t’ového protokolu, zabaleného uvnitř paketu. Vzájemná koexistence schopnosti detekce rámců typu Ethernet II a 802.3 je možná za předpokladu, že všechny typy sı́t’ového nosiče majı́ konstantu většı́, než je maximálnı́ velikost linkového rámce (1 500B). Podmı́nka je zajištěna, ale nenı́ přesně dáno, že do budoucna nemůže IEEE, správce Ethernetu, přiřadit konstanty nižšı́ než maximálnı́ velikost. Adresy ve formátu EUI-48 se skládajı́ ze dvou částı́: prvnı́ čtyři bajty jednoznačně identifikujı́ výrobce zařı́zenı́, jenž lze nalézt ve veřejně dostupném zdroji na stránkách standardů IEEE[4] a zbytek adresy je již jednoznačným identifikátorem vyrobené sı́t’ové karty, avšak některé operačnı́ systémy umožňujı́ přesto jejich konfiguraci. 2.5 Sı́t’ová vrstva IP Prvnı́ vrstva, kterou plně pokrývá protokol TCP/IP je vrstva sı́t’ová, jedná se o jediný přenosový protokol, který se snažı́ být hardwarově nezávislý a univerzálnı́. Ve své podstatě funguje jako poklička, která umı́ fungovat nad všemi linkovými protokoly a na druhé straně jsou všechny transportnı́ protokoly implementovány právě nad nı́. Ve verzi 4, která se pomalu stává nedostačujı́cı́ hlavně z hlediska množiny možných unikátnı́ch veřejných adres, se užı́vajı́ virtuálnı́ adresy, zcela bez korespondence k hardwaru (v modelu TCP/IP). Hlavnı́m úkolem sı́t’ové vrstvy je volba směrů odesı́lánı́ paketů (směrovánı́) a přenos datagramů. Pro ochranu proti zacyklenı́ během přenosu, je do hlavičky zanesena informace o počtech hopů, které ještě může paket překonat před svých zánikem, problémem je ale fakt, že při každém průchodu směrovačem musı́me přepočı́távat kontrolnı́ součet. Implementace vrstvy je nutná jak v hostitelských počı́tačı́ch, tak v uzlech přenosové infrastruktury. Oproti tomu ale samotný protokol poskytuje pouze nespolehlivou a nespojovanou službu, je nositelem pouze nutného minima. V důsledků této vlastnosti nemáme žádné záruky o doručenı́, nemáme garanci nepoškozenı́ dat, doba doručenı́ se může značně lišit a i proto nenı́ podporovaná garance kvality služeb (QoS – kvalita služby). Volba variabilnı́ velikosti přenášeného paketu je závislá na užı́vané přenosové linkové vrstvě a v protokolu je implementován mechanizmus fragmentace, kdy se při přenosu velkého rámce rozdělı́ na segmenty, které již co do velikosti vyhovujı́ technologie přenosu. Nejrozšı́řenějšı́ verzı́ protokolu IP je verze 4, která v sobě nese 32-bitové sı́t’ové adresy, jejichž kapacita, co do velikosti přidělených veřejných adres, dosahuje svého limitu. Dnes se zvolna přecházı́ na verzi IPv6. Atributy sı́t’ové vrstvy ve verzi 4 najdete na následujı́cı́m obrázku. K podstatným atributům sı́t’ových paketů musı́m zařadit identifikaci spolu s offsetem, které sloužı́ pro účely fragmentace. Atribut TTL (Time to live – životnost paketu) zamezuje zacyklenı́ paketu v sı́ti donekonečna a udává, kolik maximálně může paket navštı́vit přepı́načů před tı́m, než bude zamı́tnut. Protokolem odlišujeme typ transportnı́ho protokolu, jenž je uložen v datech. Nejčastěji vyskytujı́cı́mi konstantami jsou konstanty pro TCP a UDP. Identifikace sı́t’ových karet (rozhranı́) je zajištěná dı́ky sı́t’ovým adresám délky 4B, které nejčastěji zapisujeme ve formátu např. 192.168.0.1. Adresy v protokolu TCP/IP nemajı́ žádnou korespondenci s hardwarem sı́t’ové karty a jedno rozhranı́ (karta) může obsahovat vı́ce adres zároveň. Délka hlavičky vymezı́ volitelná rozšı́řenı́ hlavičky a určı́ počátek dat vyššı́ vrstvy. V důsledku velké rychlosti přidělovánı́ veřejných IPv4 adres vznikl problém s jejich nedostatkem, který se částečně podařilo zbrzdit přidělovánı́m menšı́ch bloků IP adresa (za použitı́ 11 sı́t’ových masek). Dále vznikl NAT a PAT, které majı́ za úkol maskovat navenek uzly, připojené v lokálnı́ch sı́tı́ch LAN. Přes to bylo nevyhnutelné přejı́t na novou verzi, která pracuje se sı́t’ovými adresami velikosti 16B, které jsou bohatě nadimenzovány co do spektra veřejných adres. Kromě většı́ho adresnı́ho prostoru přibyla bezstavová autokonfigurace, plná podpora multicastu (vysı́lánı́ k vı́ce uzlům současně), možnost odesı́lánı́ jumbogramů (velké pakety). Kontrolnı́ součet součástı́ hlavičky a jako novinka přibyla možnost přı́davných hlaviček, které podporujı́ napřı́klad zabezpečenı́ či mobilnı́ adresovánı́. Detail hlavičky paketu je prezentován na následujı́cı́m obrázku. Atributy nejsou nepodobné staršı́ verzi, novinkou ale je možnost připojenı́ rozšiřujı́cı́ch hlaviček, které na jednu stranu šetřı́ mı́sto, pokud nechceme nést navı́c informace, a na druhou stranu lze rozšı́řenı́ navzájem kombinovat a můžeme jich mezi základnı́ hlavičku a data připojit vı́ce. Oproti staršı́ verzi IPv4 odpadl kontrolnı́ součet, protože transportnı́ vrstvy počı́tajı́ kontrolnı́ součet také z metahlavičky sı́t’ové vrstvy a nenı́ nutná jeho modifikace. Základnı́ i rozšiřujı́cı́ hlavička obsahujı́ ukazatel, identifikujı́cı́ dalšı́ hlavičku a vzniká tak jakýsi spojový seznam připojených hlaviček. Nejpoužı́vanějšı́ hlavičky jsou tyto: fragmentačnı́, za12 bezpečenı́ či směrovacı́. Sı́t’ové adresy narostly co do velikosti čtyřnásobně a nejčastěji se zapisujı́ po 2-bajtových blocı́ch oddělených dvojtečkou s vynechánı́m nulových segmentů, např. 2001:db8::1428:57ab. 2.6 Transportnı́ vrstva V rodině TCP/IP rozlišujeme dva základnı́ typy transportnı́ch protokolů: TCP a UDP, oba protokoly budou představeny v následujı́cı́ch kapitolách. Z pohledu sı́t’ové vrstvy nerozlišujeme jednotlivé entity (programy, démony, atd.) sı́t’ového rozhranı́, ale pouze doručujeme mezi uzly sı́tě. Entity v systému se připojujı́ k portům, které nejsou ničı́m jiným než čı́sly v rámci systému a konkrétnı́ implementace jejich použitı́ závisı́ na operačnı́m systému, kdy např. u BSD či Unixu se hojně užı́vajı́ sockety, což je jakási abstrakce nad soubory. Ve světě Internetu se postupem času zabydlely tzv. well-known (dobře známé) porty, jejichž seznam byl udržován v RFC dokumentech (poslednı́ RFC 1700), dnes došlo k přechodu k online databázi na stránkách organizace IANA. TCP (Transmission Control Protocol) přinášı́ možnost spolehlivého a spojovaného kanálu, jenž se dı́ky udržovánı́ stavů dokáže vypořádat se ztrátou či modifikacı́ dat. Při přenosech dat vzniká režie s tı́mto mechanismem spojená, kdy základnı́ ideou, která zajišt’uje spolehlivost je kontinuálnı́ zası́lánı́ potvrzenı́ o přijatých datech. 2.6.1 Protokol UDP Datagramová služba poskytuje základnı́ nadstavbu nad sı́t’ovými protokoly, stala se hojně využı́vanou pro aplikace požadujı́cı́ rychlost a malou režii. Funguje nespolehlivě a nespojovaně, vytvářı́ uživateli iluzi blokového přenosu a funguje bezstavově. Zajı́mavostı́ je kontrolnı́ součet, který kromě samotné hlavičky a dat UDP paketu použı́vá i pseudohlavičku ze sı́t’ové vrstvy. Atributy UDP paketu jsou znázorněny na obrázku. Pakety obsahujı́ pouze dvoubajtová čı́sla zdrojového a cı́lového portu, dále délku hlavičky protokolu UDP a již zmiňovaný kontrolnı́ součet. Pro ještě většı́ urychlenı́ existuje i modifikace UDP protokolu tzv. protokol UDP Lite, který neobsahuje kontrolnı́ součet hlavičky a použı́vá se např. při přenosu hlasu či videa, kde požadujeme pravidelné a rychlé doručovanı́. 2.6.2 Protokol TCP Protokol TCP (Transmision Control Protocol) se stal úspěšným transportnı́m protokolem, který se dokáže efektivně vypořádat s nespolehlivým a nespojovaným charakterem sı́t’ové vrstvy a na13 stolı́ uživateli systém, jenž garantuje plnou spolehlivost. Služba je poskytována na spojovaném charakteru, tj. nejprve je navázáno spojenı́ mezi uzly, poté se přenášı́ data (obousměrně) a nakonec se strany domluvı́ na ukončenı́ spojenı́ (i jednostranně). Garance spolehlivosti zahrnuje oblasti jako je výpadek paketu, duplicitnı́ doručenı́ a také špatné pořadı́ doručených dat. Jak již bylo zmı́něno, spojenı́ se navazujı́ pouze dvoubodově, přı́jemce i odesı́latel je unikátnı́. K atributům protokolu lze zmı́nit řı́zenı́ toku, kontinuálnı́ potvrzovánı́ přišedšı́ch dat, schopnost vypořádat se s zahlcenı́m (prostřednictvı́m publikovánı́ velikosti okna) a tvorba iluze bajtové roury, jež distribuuje informace po bajtech (nikoli po blocı́ch). Čtenáři se může vybavit lehká paralela s přepojovánı́m okruhů, ale ve skutečnosti se jedná o softwarovou emulaci virtuálnı́ho okruhu, o kterém vnitřnı́ uzly sı́t’ové infrastruktury nic nevědı́ a nebo ani nepodporujı́ tak vysokou vrstvu rodiny protokolů TCP/IP. Na samotnou strukturu paketů protokolu TCP můžete nahlédnout na obrázku. Úvod hlavičky je identický s bratrským protokolem UDP, obsahuje tedy zdrojový a cı́lový port. Následuje pořadové čı́slo, udávajı́cı́ pozici v bajtové rouře, dalšı́m 4-bajtovým identifikátorem je potvrzovacı́ čı́slo, jenž dává najevo protistraně, které poslednı́ pořadové čı́slo bylo úspěšně přijato. Určenı́ vlastnostı́ paketu, které lze považovat za platné se uplatňuje dı́ky přepı́načům, např. ACK (potvrzovacı́ čı́slo je platné), PSH (okamžité odeslánı́ dat), RST (resetovánı́ spojenı́), SYN (žádost o sestavenı́ spojenı́) a FIN (žádost o ukončenı́ relace). Pro účely řı́zenı́ toku obsahuje paket velikost okna, kterým si obě strany předávajı́ informaci o volném mı́stu v zásobnı́cı́ch. Na následujı́cı́m obrázku můžeme vidět průběh navazovánı́ spojenı́, přenos dat a ukončenı́ spojenı́. Navazovánı́ spojenı́ se realizuje pomocı́ tzv. třı́stavového handshaku“ (podánı́ ruky), ” kdy žadatel o založenı́ spojenı́ (klient) sestavı́ paket se zapnutým přı́znakem SYN, náhodně vygeneruje sekvenčnı́ čı́slo a odešle paket cı́lovému počı́tači (server). Server po korektnı́m doručenı́ paketu sestavı́ obdobný paket, ale navı́c uvede přı́znak ACK, kterým potvrdı́ inicializačnı́ sekvenčnı́ čı́slo. Pokud je rámec správně doručen, je na klientovi, aby odeslal paket pouze s potvrzenı́m a spojenı́ dále považujeme za ustavené, na druhé straně je opakováno odeslánı́ paketu a obě strany se řı́dı́ algoritmem pro délky vypršenı́ časového limitu. Při následném odesı́lánı́ dat 14 je vždy paket opatřen sekvenčnı́m čı́slem, které koresponduje s pozicı́ v bajtovém proudu, bráno od inicializačnı́ho sekvenčnı́ho čı́sla. Druhá strana přenosového kanálu má za úkol odesı́lat potvrzenı́ o přišedčı́ch datech a to průběžně. Na závěr spojenı́ dojde k vyžádánı́ ukončenı́ z jedné ze stran, zmı́něná strana odešle rámec se zapnutým přı́znakem FIN a korektnı́m sekvenčnı́m čı́slem. Po doručenı́ potvrzenı́ od druhé strany se kanál stává pouze jednosměrným a po opakovánı́ stejného kroku stranou druhou spojenı́ definitivně zaniká jako ukončené. Během celého přenosu je potvrzovacı́ čı́slo vždy o jedna většı́ než je přišı́dšı́ sekvenčnı́ čı́slo. 15 Pasivnı́ sı́t’ové analyzátory 3.1 Definice Pasivnı́m sı́t’ovým analyzátorem rozumı́me software, jenž je zaměřený na rozbor sı́t’ové komunikace na základě odchycených záznamů paketů ze sı́t’ové karty bez jakékoliv modifikace přenášených dat. Data jsou ukládána do binárnı́ch souborů různých formátů, mezi nejznámějšı́ formáty patřı́: pcap, pcapng či cap (Sun Microsystems, Microsoft Network Monitor). Úkolem analyzátoru je načı́st odchycená data a dle vrstvy sı́t’ového protokolu vyhodnotit hlavičku a odeslat vrstvě vyššı́, pokud je v datech zachycena. Takto mohou z odchycených rámců na úrovni linkové vrstvy vznikat např. TCP spojenı́, na nichž je kupřı́kladu provozován hojně užı́vaných protokol HTTP. Schopnosti analyzátoru lze klasifikovat dle několika metrik: přı́tomnost grafického rozhranı́ (GUI), množina podporovaných protokolů na vrstvách sı́t’ového modelu TCP/IP či přı́tomnost statistických výstupů. Při komunikaci se sı́t’ová karta chová tı́m způsobem, že na základě své hardwarové adresy přijı́má pouze data pro ni určená a předává je jádru operačnı́ho systému. V promiskuitnı́m módu jsou ale přijı́mána všechna data, bez ohledu na adresu skutečného adresáta. Typicky jsou pro zapnutı́ promiskuitnı́ho módu nutná práva superuživatele v přı́padě operačnı́ho systému UNIX a metoda je základem pro zı́skávánı́ dat pro všechny druhy sı́t’ových analyzátorů. Na základě definice a deklarovaných kritériı́ jsem zvolil následujı́cı́ analyzátory pro bližšı́ popis: Tcpdump, Tcpflow, Wireshark a Netgrind. 3.2 Tcpdump Nejstaršı́m analyzátorem z vybrané trojice je Tcpdump, jenž spatřil světlo světa na počátku 90. let 20. stoletı́. Tcpdump je typicky součástı́ každé mutace systému UNIX a funguje pouze v konzolovém režimu. Program umı́ pracovat s uloženými daty v souboru, umı́ sám ukládat data do takového souboru (formát pcap) a výhodou pro uživatele je i promiskuitnı́ mód, fungujı́cı́ s daty v reálném čase. Ve volbách je nabı́zena široká paleta přepı́načů pro volbu úrovně výpisů zobrazených dat, možnosti konverze IP adres na DNS záznamy či rychlosti užitı́ protokolových modulů. Data se dajı́ lehce filtrovat dle třech základnı́ch kategoriı́: typ, směr a protokol. Pro ilustraci bude lepšı́ ukázat možnosti filtrovánı́ na přı́kladech. ip host ace and not helios tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 ether[0] & 1 = 0 and ip[16] >= 224 Program Tcpdump podporuje nativně solidnı́ množinu protokolů, jejichž data dokáže v textové formě prezentovat. K vı́ce specifickým protokolům lze zařadit: protokoly pro sdı́lenı́ souborů jako NFS či SMB, Kip AppleTalk, IP fragmentace nebo přenosový protokol ATP. 16 21:41:11.005508 arp who-has 192.168.2.104 tell 192.168.2.1 21:41:11.005527 arp reply 192.168.2.104 is-at 00:13:e8:0a:61:93 (oui Unknown) 21:41:11.126551 IP 167.col.prg.mynet.cz.http > 192.168.2.104.50485: S 1862118129:1862118129(0) ack 1764776068 win 65535 Na vloženém přı́kladu je ukázána funkce prezentovánı́ vypsaných dat, prvnı́ 2 řádky se týkajı́ protokolu ARP, který převádı́ virtuálnı́ adresy sı́t’ové vrstvy na adresy fyzické (MAC). Nejprve se prvek sı́tě s adresou 192.168.2.1 ptá pomocı́ broadcastu na fyzickou adresu 192.168.2.1 a následně dostává také odpověd’. Třetı́ řádek ukazuje segment TCP spojenı́, které je HTTP požadavkem, jedná se o druhý paket ze třı́stavového navázánı́ spojenı́. 3.3 Tcpflow Jako o druhém analyzátoru se zmı́nı́m o programu Tcpflow, který vznikl na přelomu tisı́ciletı́. Program za pomoci promiskuitnı́ho módu načı́tá pakety a rekonstruuje jednotlivá TCP spojenı́. Spojenı́ jsou ukládána ve výchozı́m nastavenı́ do souborů ve formátu, kde figurujı́ zdrojová a cı́lová IP adresa a také porty. Obsahem souborů jsou přenášená data po spojenı́ch, program bohužel nepodporuje IP fragmentaci a poslednı́ uvolněná stabilnı́ verze se datuje do roku 2003. Podobně jako v přı́padě předchozı́ho představeného programu umožňuje Tcpflow filtrovat data za pomoci výrazů. Z filtrovacı́ škály bych zmı́nil možnost filtrovat na základe doménového jména uzlu, IP adresy uzlu, velikosti datové rámce či ethernetového typu paketu. Program je co do velikosti minimalistický a jeho funkčnost je zahrnuta v programu Wireshark, kde má uživatel možnost zobrazit data přenášená po TCP spojenı́. Program nenı́ postavený čistě na spojenı́ TCP, ale poradı́ si i s daty přenášenými po protokolu UDP či ICMP. Výstupnı́ formát si můžete prohlédnout na přiložené ukázce. 209.085.135.139.00080-192.168.002.104.44056: HTTP/1.1 200 OK Date: Tue, 13 Jul 2010 20:26:23 GMT Expires: Tue, 13 Jul 2010 21:26:23 GMT Cache-Control: public, max-age=3600 Content-Type: text/javascript; charset=utf-8 Content-Encoding: gzip Server: gws Content-Length: 170 X-XSS-Protection: 1; mode=block 3.4 Wireshark Wireshark je dnes považovaný za nejlepšı́ open-source sı́t’ový analyzátor s grafickou nadstavbou. Nabı́zı́ širokou podporu sı́t’ových protokolů, funguje na široké množině operačnı́ch systémů počı́naje UNIX, přes BSD, Solaris a konče operačnı́m systémem Windows. Základem je konzolový analyzátor TShark, jenž se svými výpisy do konzole podobá programu tcpdump, ale nabı́zı́ širšı́ portfolio protokolů. Wireshark dokáže přinutit fungovat sı́tovou kartu počı́tače v promiskuitnı́m módu a tı́m zı́skává pakety ze sı́tě. Zı́skaná data je možno filtrovat, přeskupovat a ukládat do formátu pcap či dalšı́ch podporovaných. Grafická nadstavba napsaná v GTK+ nabı́zı́ přehledný seznam paketů, přinášı́ možnost zabarvovánı́, filtrovánı́ dle atributů paketů a v ne17 poslednı́ řadě přinášı́ možnost zapojenı́ vlastnı́ho zásuvného modulu či zapojenı́ modulu jiného, než je ve výchozı́m nastavenı́ vybrán. Za největšı́ přednost programu považuji bohatou paletu statistických výstupů, zobrazenı́ dat přenesených v rámci TCP spojenı́ a přehledné zobrazenı́ vrstev sı́t’ového modelu u jednotlivých rámců. Ukázku programu lze nalézt na obrázku. 3.4.1 Historie Historie programu se datuje do roku 1997, kdy Gerald Combs začal vyvı́jet předka dnešnı́ho programu pod jménem Ethereal. Po několika přerušenı́ch vývoje v roce 1998 spojil Gerard Combs své sı́ly s Richardem Sharpem a odstartovali vývoj dekódovacı́ch modulů, specifických pro jednotlivé protokoly vrstevnatého modelu architektury TCP/IP. V roce 2006 došlo k přejmenovánı́ na nynějšı́ jméno a po deseti letech vývoje byla v roce 2008 uvolněna verze 1.0, která je považována za prvnı́ kompletnı́ verzi, pokrývajı́cı́ základnı́ množinu protokolů a autoři ji představili téhož roku na konferenci SharkFest. 3.4.2 Filtrovánı́ Filtrovánı́ dat nabı́zı́ uživateli jednak přednastavené filtrovacı́ profily typu: TCP only“, no ARP ” ” and no DNS“. V zásadě lze vytvořit libovolnou logickou klauzuli pomocı́ předdefinovaných atributů a základnı́ch operandů, jako je porovnánı́, přı́slušnost do množiny, atd. Kritéria lze skládat z primitivnı́ch atributů, jako je IP adresa zdrojového počı́tače, ale zabrousit lze i do mnohem detailnějšı́ch atributů. Jako zajı́mavé atributy, které lze použı́t při specifikaci podmı́nky, mohu uvést jméno přı́kazu protokolu SMTP, velikost přenášeného obrázku formátu PNG pomocı́ HTTP či přezdı́vku adresáta přenosového protokolu Yahoo Messanger. 18 3.4.3 Analýza rámců Analýza přenesených rámců je řı́zena stromem dekodérů, které dle atributů vrstevnatého modelu rozlišujı́ dekodér, který bude užit. Základnı́mi atributy pro detekci jsou ethertype“ na linkové ” vrstvě, IP protokol na vrstvě sı́t’ové a zdrojový a cı́lový port na vrstvě transportnı́ jak u TCP, tak i UDP. Dekodéry užité na rozklad lze měnit a Wireshark nabı́zı́ i možnost naprogramovánı́ takového modulu. Pro úspěch takto velkého programu je zmı́něná část programu klı́čová, kdy v dnešnı́ době vı́ce jako 500 vývojářů přispı́vá a programuje rozšı́řenı́, která jsou nezávislá na ostatnı́ch a komunita udržuje bohatou dokumentaci návodů, jak postupovat při vývoji. 3.4.4 Statistické komponenty Statistickou komponentu Wiresharku považuji za nejvı́ce přı́nosnou část programu. K základnı́m jednotkám patřı́ sumář obsahujı́cı́ informace o odchycených datech a informace o hierarchii použitých protokolů během komunikace. Dalšı́m užitečným nástrojem je přehled komunikacı́, kde na základě protokolů nalezneme informace mezi kterými uzly se přenášela data. Mezi grafické výstupy musı́m zmı́nit histogram velikosti paketů a velmi názorný Graf toků, jenž v průběhu času vizualizuje toky dat v obou směrech komunikace. Pro protokol TCP jsou v nabı́dce grafy střednı́ doby obrátky, velikosti přenášených dat v průběhu času či seznamu požadavků na zobrazené webové stránky. 3.5 Netgrind Netgrind vznikl jako jednoduchý, srozumitelný a pomocný program při analýze zejména protokolu HTTP a vrstev, které ležı́ pod nı́m. Autorem je vedoucı́ mé práce Mgr. Martin Mareš, Ph.D. a stal se inspiracı́ pro téma mojı́ práce. Konzolový program nabı́zı́ statistiky o správně zpracovaných, špatných a neplatných paketech na vrstvách sı́t’ového modelu a jako hlavnı́ produkt prezentuje v přehledném výpisu HTTP spojenı́, detailnı́ informace o adresách, portech, počtech přenesených dat, URL a typy dokumentu dle standardu rozšı́řenı́ MIME. Po nastavenı́ můžeme nechat zapsat statické informace o jednotlivých přenosech do adresáře pro budoucı́ zobrazenı́ pomocı́ grafového kreslı́cı́ho nástroje gnuplot. K programu je přibalena množina skriptů v jazyce Perl, které transformujı́ nashromážděné statistiky a vykreslujı́ výstupnı́ grafy. Grafy se týkajı́ počtu aktuálnı́ch spojenı́ v čase, velikosti přenášených dat v čase či délce čekánı́ HTTP požadavku. source 192.168.2.104:46414 192.168.2.104:46415 192.168.2.104:46417 192.168.2.104:46414 destination 89.250.246.4:80 89.250.246.4:80 89.250.246.4:80 89.250.246.4:80 - res 200 200 200 200 cac ... ... ... ... q len ttime wtime ctype 0 4883 0.075 0.050 text/html 0 2430 0.040 0.040 text/css 0 188 0.054 0.054 image/png 1 1190 0.013 0.012 image/png met GET GET GET GET Výstup z programu Netgrind poskytne přehledné informace o jednotlivých HTTP požadavcı́ch, kdy byly uskutečněny v čase, z jakých IP adres a portů došlo k přenosu, dále zı́skáme cenné informace o velikosti přenesených datech, době vyřı́zenı́ požadavku, MIME typu a v neposlednı́ řadě také požadovaný soubor, jenž byl vyžádat po HTTP démonovi. 19 Sı́t’ový analyzátor NEPAL 4.1 Představenı́ Vlastnı́ sı́t’ový pasivnı́ analyzátor Network Passive Analyser (zkratka NEPAL) byl vyvinut pro účel bakalářské práce. Program na svém vstupu akceptuje záznamy paketů uložených v souboru ve formátu PCAP. Program je navržený jako modulárnı́ systém, kdy mezi jednotlivými moduly putujı́ datové objekty různých třı́d. Každý modul má definovanou množinu typů vstupnı́ch a výstupnı́ch objektů, kdy po průchodu dat modulem nastane jedna z událostı́, jež modul definuje. Dı́ky zmı́něnému aparátu je možné pomocı́ skriptů, napsaných v jazyce Python[6], napojit výstup na libovolné moduly a tı́m sestavit celou škálu funkčnı́ch programů, týkajı́cı́ch se různé oblasti zpracovánı́ dat ze sı́tě. Moduly jsou napsané v jazycı́ch C a Python, mohou se mezi sebou libovolně kombinovat a jako pojı́tko mezi oběma světy je užit nástroj SWIG[7], který obaluje kód psaný v jazyce C do jazyků vyššı́ch, mimo jiné i do Pythonu. Software implementuje načı́tánı́ základnı́ch protokolů TCP/IP a jako ukázkové specifické moduly obsahuje modul pro zobrazenı́ požadavků protokolu HTTP, modul ARP/RARP včetně zobrazovánı́ výrobců sı́t’ových karet, statistický modul (napsaný v Pythonu) a modul pro zobrazovánı́ DNS požadavků a odpovědı́. 4.2 Zapojenı́ programu Zapojenı́ práce jednotlivých modulů může čtenář nahlédnout na následujı́cı́m obrázku. 20 Pomocı́ obdélnı́ků různých barev jsou vyznačeny moduly, atributy u modulů symbolizujı́ vybrané události, které může modul vyvolat a na které se následně může dalšı́ modul zavěsit. Každý modul disponuje zásobnı́kem událostı́, kde se registrujı́ dalšı́ vstupnı́ moduly. Popsaným způsobem je dosažena modularita, schopnost zapojit vlastnı́ modul na sestavu předešlých a systém poskytuje základnı́ transparentnı́ programátorské rozhranı́ pro napojovánı́ modulů. V obrázku jsou zmı́něná napojenı́ vyjádřena šipkami a kruh symbolizuje putujı́cı́ datový objekt. Na zapojenı́ stačı́ pouze zaregistrovat vstupnı́ metodu do zásobnı́ku událostı́ vybraného modulu a program se již postará o předánı́ dat. 4.3 Datový objekt Datový objekt je základnı́ jednotkou informacı́ přenášenou mezi moduly. Při svém návrhu byl kladen důraz na co největšı́ univerzálnost na straně jedné a na co nejúspornějšı́ a nejrychlejšı́ řešenı́ na straně druhé. Datový objekt se stal univerzálnı́ strukturou, do které lze ukládat data různých typů (viz následujı́cı́ tabulka). Typ atributu INT TIME IPV4 IPV6 STRING ARRAY MAC48 DOBJ VOIDPTR Délka 4B 8B 4B 16 B — — 6B 4B 4B Popis typu atributu celé nezáporné čı́slo v rozsahu [0,4 294 967 295] uloženı́ času s přesnostı́ na nanosekundy IPv4 sı́t’ová adresa IPv6 sı́t’ová adresa řetězec ASCII znaků pole bajtů MAC adresa ukazatel na jiný datový objekt všeobecný ukazatel Součástı́ datového objektu je také zásobnı́k událostı́, do kterého je možné registrovat metody, které se zavolajı́, když nastane událost. Zmı́něná vlastnost je napřı́klad použita u TCP spojenı́, u něhož nastane událost, signalizujı́cı́ přenesená data. U datových objektů rozlišujeme jejich třı́dy, na vstupu modulů si zpravidla moduly kontrolujı́ třı́dy vstupnı́ch dat a rozhodujı́ se, zda je zpracujı́. V průběhu průchodu je možné za běhu měnit třı́du datového objektu, mohou se přidávat atributy a často se tak při průchodu moduly rodiny TCP/IP i děje. V následujı́cı́ kapitole zı́skáte přehled, jaké třı́dy objektu vznikajı́ v jakých modulech, jaké třı́dy moduly podporujı́ na svém vstupu a také jaké vznikajı́ události. 4.4 Představenı́ modulů Program pracuje jako sı́t’ový analyzátor nad rodinou protokolů TCP/IP a implementuje moduly, které odpovı́dajı́ protokolům sı́t’ového modelu. Pro ukázku specifických aplikacı́ je přidána množina modulů, které se týkajı́ problematiky převodu fyzických a sı́t’ových adres, protokolu HTTP pro přenos dokumentů či protokolu DNS, který mimo jiné převádı́ doménová jména na sı́t’ové adresy (at’ už verze 4 či 6). Jako demonstrace kombinovánı́ modulů v obou jazycı́ch jsem naprogramoval grafový modul v jazyce Python, jenž užı́vá velmi dobře propracovanou knihovnu 21 pro výstupy grafů pod jménem Matplotlib[8]. V následujı́cı́ tabulce může čtenář nahlédnout do přehledu implementovaných modulů v programovacı́m jazyce C a v dalšı́ch sekcı́ch jsou moduly charakterizovány včetně atributů objektů, které při průchodu těmito moduly vznikajı́. Jméno modulu Modul PCAP Modul Ethernet Modul ARP Modul ARP view Modul IPv4 Modul IPv6 Zkratka PCAP ETH ARP ARPVIEW IPV4 IPV6 IPREASS Modul IP Reassembler Modul UDP Modul TCP Modul TCP Flow Modul HTTP Vstupnı́ objekty — PCAP packet Ethernet packet ARP packet Ethernet packet Ethernet packet IPv4 packet IPv6 packet UDP IPv4 IPv6 TCP IPv4 IPv6 TCPFLOW TCP packet packet packet packet packet HTTP packet data packet flow data DNS Modul DNS TCP TCP UDP TCP TCP Výstupnı́ objekty PCAP packet Ethernet packet ARP packet — IPv4 packet IPv6 packet IPv4 packet IPv6 packet IP reassembly UDP packet TCP packet TCP flow TCP data — — Tabulka 4.1: Tabulka modulů 4.4.1 Modul PCAP Vstupnı́ modul každého zapojenı́ načı́tá sekvenčně uložené a přenášené rámce, modul využı́vá služeb knihovny PCAP[9], jež ukládá do souboru s přı́ponou pcap celé rámce v binárnı́ podobě. V hlavičce takového souboru jsou deklarovány atributy o maximálnı́ délce zachycených rámců, časovém posunu oproti času nultému polednı́ku či typu linkové vrstvy. Po průchodu modulem vzniká datový objekt, jenž nese binárnı́ data po médiu přenášená, informace o původnı́ a odchycené velikosti a v poslednı́ řadě také čas průchodu paketu sı́t’ovou kartou. O detailech atributů vás seznámı́ následujı́cı́ tabulka, po nı́ž následuje tabulka s výpisem událostı́. Atribut pcap frame pcap time pcap origlen pcap packet Typ INT TIME INT ARRAY Popis atributu pořadové čı́slo paketu datum odchycenı́ paketu původnı́ velikost odchyceného rámce data odchyceného paketu 22 Událost Popis události Typ objektu packet vznik nového rámce PCAP packet 4.4.2 Modul Ethernet Ethernetový modul se stará o správné načtenı́ atributů pro datový objekt Ethernet packet. Ve své podstatě podporuje rodina protokolů TCP/IP velké portfolio linkových protokolů, ale v průběhu času se Ethernet stal nejpoužı́vanějšı́m a nejrozšı́řenějšı́m. Vı́ce informacı́ o modulu přinesou dvě bezprostředně následujı́cı́ tabulky. Atribut Typ eth smac MAC48 eth tmac MAC48 INT eth type Událost packet drop 4.4.3 Popis atributu zdrojová MAC adresa ve formátu MAC-48 cı́lová MAC adresa ve formátu MAC-48 typ protokolu vyššı́ vrstvy 0x0800 pro IPv4, 0x86DD pro IPv6, 0x0806 pro ARP Popis události Typ objektu vznik nového paketu Ethernet packet zahozenı́ nekompatibilnı́ho paketu PCAP packet (např. z důvodu nekompletnosti paketu při odchycenı́) Modul ARP Modul dekóduje hlavičky paketů protokolu ARP (Address resolution protocol – RFC 826[11]) a protokolu RARP (Reverse address resolution protocol – RFC 903[12]) a odesı́lá je spřátelenému modulu pro jejich vizualizaci. Tabulka specifikuje atributy objektu, modul nedisponuje žádnými událostmi, všechna data jsou automaticky posunuta následujı́cı́mu modulu ARP view. Atribut arp htype arp ptype Typ INT INT INT arp opcode ARRAY MAC48 IPV4 arp sendpaddr IPV6 ARRAY arp targhaddr MAC48 IPV4 arp targpaddr IPV6 arp sendhaddr Popis atributu typ hardwarové adresy (0x0001 pro Ethernet II) typ sı́t’ového protokolu 0x0800 pro IPv4, 0x86DD pro IPv6 typ požadavku 0x0001 pro ARP dotaz, 0x0002 pro ARP odpověd’ 0x0003 pro RARP dotaz, 0x0004 pro RARP odpověd’ fyzická adresa odesı́latele (typ na základě délky, pro délku 6 typ MAC48, ARRAY jinak) sı́t’ová adresa odesı́latele (typ na základě atributu arp ptype) fyzická adresa přı́jemce (typ na základě délky, pro délku 6 typ MAC48, ARRAY jinak) sı́t’ová adresa přı́jemce (typ na základě atributu arp ptype) 23 4.4.4 Modul ARP view Úkolem modulu ARP view nenı́ nic jiného než prezentovat odchycené datové objekty typu ARP packet. Modul má zabudované rozšı́řenı́ pro prezentovánı́ výrobce sı́t’ové karty, ke které se váže odchycená MAC adresa, a to v podobě tzv. OUI-48 (Organizationally unique identifier). Seznam výrobců je uveden na stránkách IEEE[4] a součástı́ bakalářské práce je i program pro staženı́ a transformaci dat pod jménem: oui.py, který stahuje z webových stránek organizace IEEE aktuálnı́ databázi přidělených rozsahů MAC adres jednotlivých výrobců a ukládá je do souboru pro modul. Výpis z modulu je přiložen v ukázkách programu. 4.4.5 Modul IPv4 Ze jména modulu vyplývá jeho funkce, modul pouze dekóduje datové objekty typu IPv4 packet a veškerá data jsou odesı́lána modulu IP reassembler, který rozhodne o tom, zda je nutné zakládat IP reassembly nebo zda jsou data nefragmentovaná a stačı́ je odeslat vyššı́ vrstvě. Odesı́lánı́ datových objektů pro jejich kontrolu je činěno automaticky, nenı́ nutné registrovat událost. Specifikace paketu byla poprvé představena v RFC 791[13]. Následujı́cı́ dvě tabulky přinášejı́ vı́ce informacı́ o vzniklých objektech a o událostech. Atribut ipv4 version ipv4 hdrlen ipv4 tos ipv4 length ipv4 ident ipv4 flags ipv4 ttl ipv4 proto Typ INT INT INT INT INT INT INT INT ipv4 hdrsum INT ipv4 saddr IPV4 ipv4 daddr IPV4 Událost drop 4.4.6 Popis atributu verze sı́t’ového protokolu délka hlavičky paketu v bajtech typ přenášené služby v datech celková délka paketu v bajtech identifikace pro účely fragmentace flagy spolu s fragmentačnı́m offsetem TTL – životnost paketu typ protokolu vyššı́ vrstvy 0x0006 pro TCP, 0x0011 pro UDP kontrolnı́ součet IP paketu zdrojová sı́t’ová adresa cı́lová sı́t’ová adresa Popis události Typ objektu zahozenı́ nekompatibilnı́ho paketu Ethernet packet Modul IPv6 Nová verze sı́t’ového protokolu se od svého sourozence co do formátu hlavičky značně odlišuje, vznikla úplně nová koncepce přı́davných hlaviček ve formě spojového seznamu, který rozšiřuje hlavičku základnı́, jež v sobě nese pouze nutné informace. Hlaviček najdeme ve specifikaci celkem mnoho a jsou podporované 4 základnı́: Hop-by-Hop, cı́lová, fragmentačnı́ a trasovacı́. K ostatnı́m hlavičkám můžeme přistupovat pomocı́ atributů, které jsou specifikované na konci následujı́cı́ tabulky, po nı́ž následuje přehled událostı́. Specifikace paketu a protokolu nalezneme v RFC 2460[14], podobně jako v přı́padě předchozı́ho modulu se modul stará o dekódovánı́ a data jsou postoupena automaticky modulu IP reassembler. 24 Atribut ipv6 version ipv6 tos ipv6 flabel ipv6 length Typ INT INT INT INT INT ipv6 nexthdr ipv6 ipv6 ipv6 ipv6 ipv6 ipv6 ipv6 ipv6 ipv6 ipv6 ipv6 ipv6 ipv6 ttl saddr daddr hophop options dest options route type route segleft route options fragm offset fragm flag fragm ident headers[t] headers type[i] Událost drop 4.4.7 INT IPV6 IPV6 ARRAY ARRAY INT INT ARRAY INT INT INT ARRAY INT Popis atributu verze sı́t’ového protokolu (6 pro IPv6) typ přenášené služby v datech identifikátor proudu dat (Flow label) celková délka paketu v bajtech identifikátor dalšı́ hlavičky (po přečtenı́ všech přı́davných) 44 pro fragmentaci, 17 pro UDP, 6 pro TCP (RFC[14]) TTL – životnost paketu zdrojová sı́t’ová adresa cı́lová sı́t’ová adresa volby rozšı́řenı́ Hop-by-Hop volby pro cı́lové rozšı́řenı́ typ trasovánı́ rozšiřujı́cı́ hlavičky zbývajı́cı́ počet segmentů trasovánı́ volby trasovacı́ rozšiřujı́cı́ hlavičky offset fragmentovaného paketu flag fragmentačnı́ rozš. hlavičky identifikace v rámci fragmentace rozšiřujı́cı́ hlavičky typu t typ i-té rozšiřujı́cı́ hlavičky Popis události Typ objektu zahozenı́ nekompatibilnı́ho paketu Ethernet packet Modul IP reassembler Úkolem modulu je načı́tat vstupnı́ pakety IPv4 packet a IPv6 packet a na základě atributů se rozhodovat, zda budou pakety fragmentované či nikoliv. V přı́padě nefragmentovaných dat okamžitě nastane událost, signalizujı́cı́ vznik nového paketu. V opačném přı́padě dojde k založenı́ objektu typu IP reassembly, který představuje datagram, který vzniká skládánı́m fragmentů (obou verzı́ sı́t’. protokolu). Pokud uživatele zajı́majı́ pouze kompletnı́ IP pakety, nenı́ nutné s IP reassembly pracovat. Na druhé straně pokud chceme programovat modul, který se jakýmkoliv způsobem dotýká IP fragmentace, máme možnost se k jednotlivým procházejı́cı́m fragmentům dostat. Skladba fragmentů probı́há spojovánı́m fragmentů do seznamu, který když se stane kompletnı́m, tak dojde k události vzniku nového datového objektu. Jako obrana před velkým počtem otevřených IP datagramů sloužı́ časový limit, který aktivuje událost conn timeout, pokud do IP datagramu nepřibyl po určitou dobu žádný paket. Atribut ipreass time ipreass ipreass ipreass ipreass Typ TIME IPV4 saddr IPV6 IPV4 daddr IPV6 ident INT version INT Popis atributu čas založenı́ IP reassembly zdrojová sı́t’ová adresa cı́lová sı́t’ová adresa identifikace IP reassembly rozlišenı́ mezi verzemi 4 a 6 25 Událost Popis události vznik nefragmentovaného IP paketu packet zahozenı́ nekompatibilnı́ho paketu drop conn create založenı́ nového IP datagramu conn close korektnı́ uzavřenı́ IP datagramu conn timeout vypršenı́ časového limitu pro IP reassembly 4.4.8 Typ objektu IPv4 packet IPv6 packet IPv4 packet IPv6 packet IP reassembly IP reassembly IP reassembly Modul UDP Modul UDP tvořı́ jenom jakousi malou nadstavbu nad sı́t’ovým protokolem, proto nenı́ nutné dlouze vysvětlovat fungovánı́ a nahlédneme rovnou na popis atributů modulu a událostı́, jež mohou nastat. Vı́ce informacı́ můžete čerpat v RFC 768[15]. Atribut udp sport udp dport udp length udp checksum Událost packet drop 4.4.9 Typ INT INT INT INT Popis atributu zdrojový port cı́lový port délka nesených dat kontrolnı́ součet hlavičky Popis události Typ objektu vznik nového paketu UDP packet zahozenı́ nekompatibilnı́ho paketu IPv4 packet IPv6 packet Modul TCP Modul má za úkol dekódovat hlavičky datových objektů typu IPv4 packet a IPv6 packet, všechny atributy vzniklého datového objektu spolu s událostmi naleznete ve dvou tabulkách. Dalšı́ informace lze čerpat z RFC 793[16]. Atribut tcp sport tcp dport tcp seq tcp ack tcp hdrlen tcp flags tcp winsize tcp checksum tcp urgptr tcp options Typ INT INT INT INT INT INT INT INT INT ARRAY Popis atributu zdrojový port cı́lový port pořadové čı́slo v bajtovém proudu potvrzovacı́ čı́slo délka hlavičky v bajtech flagy pro jednotlivé volby velikost okna kontrolnı́ součet hlavičky urgentnı́ ukazatel dalšı́ volby 26 Událost packet drop 4.4.10 Popis události Typ objektu vznik nového paketu TCP packet zahozenı́ nekompatibilnı́ho paketu IPv4 packet IPv6 packet Modul TCP flow Nejsložitějšı́ modul, implementovaný v program, je bezpochyby modul pro rekonstrukci spojenı́, pracujı́cı́ s oběma verzemi sı́t’ového protokolu. Na vstupu je TCP packet a při korektnı́m navázánı́ spojenı́ vzniká datový objekt typu TCP flow. Objekt v sobě uchovává informace o zdrojovém a cı́lovém portu a také o adresách, mezi kterým se přenos uskutečňuje. Zmı́něný objekt disponuje zásobnı́kem událostı́, ve kterém nastává událost, signalizujı́cı́ přenášená data po spojenı́ typu TCP data. Stejně jako v přı́padě modulu IP reassembler je činnost spojenı́ monitorována a nečinná spojenı́ jsou po uplynutı́ časového limitu uzavı́rána. Přehled obou typů datových objektů následuje na přiložených tabulkách. Atribut Typ IPV4 tcpflow saddr IPV6 IPV4 tcpflow daddr IPV6 tcpflow sport INT tcpflow dport INT 4.4.11 Popis atributu zdrojová adresa cı́lová adresa zdrojový port cı́lový port Atribut tcpdata time tcpdata direct tcpdata data tcpdata conn Typ TIME INT ARRAY DOBJ Popis atributu čas vzniku přenesených dat směr přenesených dat po spojenı́ data přenesená po spojenı́ ukazatel na datový objekt se spojenı́m Událost conn create conn reset conn close conn timeout data Popis události vznik nového spojenı́ resetovánı́ spojenı́ korektnı́ uzavřenı́ spojenı́ vypršenı́ časového limitu spojenı́ vznik dat po spojenı́ Typ objektu TCP flow TCP flow TCP flow TCP flow TCP data Modul HTTP Protokol HTTP (Hypertext transfer protocol) se v dnešnı́ době těšı́ obrovské oblibě, spousta doposavad desktopových aplikacı́ se zabydlela ve formě webových stránek (kancelářský balı́k, webmail, atd.), vznikly masivně se rozvı́jejı́cı́ sociálnı́ sı́tě a přibývá na dynamičnosti webových stránek. Modul HTTP rekonstruuje transfery, zaznamenává dokumenty, které si uživatel vybere a dopočı́tává délku vyřı́zenı́ požadavků. S přı́kladem výstupu modulu se můžeme seznámit 27 v dalšı́ části práce a jedna sekce kapitoly je věnovaná popisu, jak se takový modul musı́ správně napojit, aby poskytoval vytoužené výsledky. Specifikace protokolu je definována v RFC 2616[17]. 4.4.12 Modul DNS Modul DNS opět prezentuje nashromážděné informace, do práce byl modul zahrnut hlavně z hlediska demonstrace univerzálnosti návrhu programu, kdy modul pracuje s vı́ce typy vstupnı́ch datových objektů, v přı́padě DNS se jedná o UDP datagram a TCP flow. Modul se vypořádá s hlavnı́ množinou typů požadavků a odpovědı́: CNAME (kanonické jméno), NS (name server), A (IPv4 adresa), AAAA (IPv6 adresa), SOA (záznam autority), TXT (textový řetězec), RRSIG (elektronický podpis). Podobně jako v přı́padě výstupu modulu HTTP i tento modul dopočı́tává dobu, za jakou došlo v vyřı́zenı́ požadavku. Ukázku práce modulu naleznete v dalšı́ch kapitolách. 28 Ovládánı́ programu NEPAL 5.1 Překlad programu Program je napsaný v jazycı́ch C a Python a je určený primárně pro operačnı́ systém Unix, pro který je vytvořený Makefile. Program spolupracuje s knihovnou LibUCW[5] (aktuálnı́ verze 4.0) a s programem SWIG[7] (aktuálnı́ verze 1.3.40-r1). V jazyce Python nejsou užı́vány žádné složité konstrukce a otestována je funkčnost ve verzi 2.6 a vyššı́. Jako nutná prerekvizita pro překlad programu pomocı́ GCC[10] je umı́stěnı́ knihovny LibUCW, které se detekuje pomocı́ známého programu pkg-config (v souboru Makefile naleznete cestu ke knihovně, kterou je nutné pro překlad správně vyplnit). Po překladu vznikne dynamická knihovna, kterou lze již importovat z prostředı́ jazyka Python, jenž spouštı́ připravené ukázkové skripty. 5.2 Ukázka programu #!/usr/bin/env python2.6 from nepal import * import sys def entrypoint(file): bind module("PCAP", "ETH", "packet") # registrace module Ethernet na vznik nového paketu bind func("ETH", meth dispatcher, "packet") # registrace funkce pro filtrovánı́ paketů bind module("ARP", "ARPVIEW", "packet") # registrace vizualizačnı́ho modulu pro ARP setinfo("module.arpview ouifile", "STRING", "../utils/oui.txt") # nastavenı́ OUI souboru mpcap(file) def meth dispatcher(obj): if obj.eth type == 0x0806: # ARP obj.send("ARP") # Main if len(sys.argv) != 2: print "usage: ./scriptname <filename>" else: entrypoint(sys.argv[1]) Po představenı́ modulů, datových objektů a událostı́ nastal konečně čas na představenı́ jednoduchého zapojenı́ našeho analyzátoru. Jako prvnı́ najdete registrovánı́ funkcı́ do zásobnı́ků událostı́ pro moduly, které budou řı́dit celý běh programu. Jak si můžete všimnout, docházı́ i k registrovánı́ našı́ metody, psané v Pythonu, která nastane pokud vznikne Ethernet packet. Po vzniku paketu dojde k rozhodnutı́, zda se jedná o ARP paket a použije se metoda pro odeslánı́ datového objektu do dalšı́ho modulu. V demonstračnı́m skriptu jsou představeny všechny potřebné 29 metody pro naprogramovánı́ zapojenı́ a v následujı́cı́ kapitole bude specifikováno veškeré programátorské rozhranı́. 5.3 Ovládánı́ a programátorské rozhranı́ Jak bylo možno vidět z předchozı́ ukázky, skripty jsou řı́zeny množinou funkcı́, které pracujı́ s datovými objekty a zásobnı́ky událostı́. Čtenáři jistě neuniklo, že jádro programu je napsané v jazyce C a pro jeho zpřı́stupněnı́ je k dispozici množina metod, představených v tabulce. Metoda bind func(module, func, event) bind module(module, dest module, event) set info(attr name, attr type, value) obj.attr name obj.attr name = value obj.set int(attr name, value) obj.set time(attr name, value) obj.set ipv4(attr name, value) obj.set ipv6(attr name, value) obj.set string(attr name, value) obj.set array(attr name, value) obj.set mac48(attr name, value) obj.set voidptr(attr name, value) obj.bind func(func, event) obj.bind module(module, event) obj.incref() obj.decref() mpcap(file) obj.send(module) Popis metody registrovánı́ události, vzniklé z modulu, prvnı́m argumentem je zkratka modulu (viz. tabulka 4.1), následuje ukazatel na funkci, jež má být zavolána a poslednı́m argumentem je jméno události, na kterou se má funkce zavěsit registrovánı́ události, vzniklé z modulu, prvnı́m argumentem je zkratka modulu (viz. 4.1), následuje zkratka cı́lového modulu (dest module), jenž má být zavolán a poslednı́m argumentem je jméno události, na kterou se má funkce zavěsit nastavenı́ informacı́ modulů, jejich specifikace je v následujı́cı́ tabulce, prvnı́m argumentem je jméno atributu, druhým je typ atributu dle definice v kapitole 4.3 a poslednı́ je hodnota, která odpovı́dá attr type a bude představena zı́skánı́ atributu jménem attr name z objektu modifikace atributu attr name hodnotou value metoda pro vloženı́ nové hodnoty typu INT metoda pro vloženı́ nové hodnoty času metoda pro vloženı́ nové IPv4 adresy metoda pro vloženı́ nové IPv6 adresy metoda pro vloženı́ nového řetězce metoda pro vloženı́ nového pole metoda pro vloženı́ nové hodnoty MAC adresy metoda pro vloženı́ nového obecného ukazatele registrovánı́ funkce func, pokud nastane na datovém objektu událost event registrace modulu, jenž se použije pro událost event přidánı́ reference na datový objekt odebránı́ reference na datový objekt zavolánı́ hlavnı́ho modulu s jménem vstupnı́ho souboru jako argumentem odeslánı́ datového objektu na zpracovánı́ modulem jménem module (např. TCP nebo ARP) 30 Pro spojenı́ světů obou programovacı́ch jazyků je důležité specifikovat korespondenci jednotlivých typů atributů. Jejich vztah naleznete v následujı́cı́ tabulce. U přiřazenı́ a metody setnew ukládáme do datového objektu hodnotu ve formě Python objektu, který musı́ odpovı́dat typem atributu, který je v tabulce v prvnı́m sloupci. Typ atributu INT TIME IPV4 IPV6 STRING ARRAY MAC48 VOIDPTR Odpovı́dajı́cı́ typ v Pythonu Python Long dvouprvkové pole ve formátu [sekundy, milisekundy] (obojı́ typu Long) Python String ve standardnı́m formátu a.b.c.d (RFC 791[13]) Python String ve standardnı́m formátu dle RFC 2460[14] Python String Python ByteArray (novinka ve verzi Pythonu 2.6) Python String ve formátu aa:bb:cc:dd:ee:ff Python Long, umožňuje zapouzdřit void ukazatel Pro ilustraci přidávám pár ukázek užitı́ přiřazenı́ hodnot a jejich zı́skávánı́: obj.pcap frame ... zı́skánı́ pořadového čı́sla paketu typu Python Long obj.smac = "00:0e:2e:aa:aa:aa"... nastavenı́ nové zdrojové MAC adresy objektu obj.set string("pcap popis", "DUPL") ... uloženı́ nového atributu obj.pcap popis = 123 ... chyba, špatný typ objektu obj.set int("pcap popis", 12345 ... úspěšné přepsánı́ atributu objektu data = obj.pcap packet ... zı́skánı́ dat paketu typu Python ByteArray Pro úplnost specifikace rozhranı́ je nutné ještě dodat seznam atributů modulů, které lze nastavovat pomocı́ již představené metody set info. Přiložená tabulka ukazuje všechny možné volby pro moduly. Atribut module pcap n module eth valid module eth invalid module arp invalid module arpview ouifile module arpview valid module ipv4 valid module ipv4 invalid module ipv4 checksum module ipv6 valid module ipv6 invalid module iptcp timeout module udp checksum module tcp valid module tcp invalid Popis atributu Počet paketů prošlých modulem PCAP Počet správně zpracovaných paketů modulem Ethernet Počet zahozených paketů modulem Ethernet Počet zahozených paketů modulem ARP Cesta k souboru s OUI jmény výrobců Počet správně zpracovaných paketů modulem ARP view Počet správně zpracovaných paketů modulem IPv4 Počet zahozených paketů modulem IPv4 Zapnutı́ kontrolnı́ho součtu u IPv4 packet Počet správně zpracovaných paketů modulem IPv6 Počet zahozených paketů modulem IPv6 Časový limit pro vypršenı́ IP datagramu a TCP spojenı́ Zapnutı́ kontrolnı́ho součtu u UDP packet Počet správně zpracovaných paketů modulem TCP Počet zahozených paketů modulem TCP 31 module tcp dupl Počet duplicitnı́ch paketů prošlých modulem TCP module tcp checksum Zapnutı́ (1) či vypnutı́ (0) kont. součtu paketů v modulu TCP module tcpflow treshold Počet paketů v zásobnı́ku spojenı́, při kterém rušeno spojenı́ 5.4 Spouštěnı́ programu Ukázková zapojenı́ jsou představena ve čtyřech připravených skriptech, každý se nacházı́ v samostatném souboru. Pro spuštěnı́ programu stačı́ spustit soubor s jediným argumentem, kterým je jméno vstupnı́ho souboru. Přı́klad spuštěnı́ programu: ./script http.py ../../nepal-data/www pages.pcap Dojde ke spuštěnı́ skriptu script http.py, který rekonstruuje HTTP spojenı́. Přehled všech přiložených skriptů je znázorněn v následujı́cı́ tabulce. Jméno souboru script http.py script graph.py script arp.py script dns.py Popis skriptu HTTP modul, rekonstuuje a vizualizuje HTTP spojenı́ Grafový modul, vytvářı́ grafy základnı́ch informacı́ ARP/RARP modul, zobrazuje (R)ARP požadavky a odpovědi DNS modul, načı́tá a zobrazuje DNS dotazy a odpovědi 32 Ukázky z programu NEPAL 6.1 6.1.1 Modul pro HTTP Prvnı́ přı́klad Jako úvodnı́ ukázku vůbec jsem si vybral odchycená data, která jsou použita pro zobrazenı́ třech webových stránek, v prvnı́m sloupci výstupu můžete nalézt pravděpodobně nejzajı́mavějšı́ atribut, jedná se o dobu (v sekundách), za jakou byl požadavek na webovou stránku vyřı́zen. Následuje návratový kód webového serveru, ve většině přı́padů je navrácen kód 200, jenž značı́ úspěšný požadavek. Kódem 304 označujeme stav, kdy již stránka byla v minulosti přenesena a na serveru se dokument nezměnil, v tomto přı́padě nenı́ nutná data znovu přenášet, a proto je i celkové délka přeneseného těla nastavena na nulovou hodnotu. Za zmı́nku stojı́ ještě návratový kód 301, který nesignalizuje nic jiného než fakt, že stránka byla trvale přemı́stěna. Po atributu kódu následujı́ zdrojová a cı́lová adresa a také zdrojový a cı́lový port. Do poslednı́ trojice atributů spadajı́: URL dorazu, typ obsahu (content-type) a celková velikost přenášených informacı́ v těle protokolu. RTT1 code saddr:sport daddr:dport URL, content-type, length 0.066457 200 192.168.2.104:48439 77.75.72.10:80 http://mapy.cz/ text/html, 6846 B 0.039601 304 192.168.2.104:58049 77.75.72.22:80 http://style.seznam.cz/... application/x-javascript, 0 B 0.047120 200 192.168.2.104:51744 77.75.73.27:80 http://api.mapy.cz/... application/x-javascript 1271 B 0.015909 200 192.168.2.104:48439 77.75.72.10:80 http://mapy.cz/firmpoi/... text/xml, 467 B 0.027949 200 192.168.2.104:48442 77.75.72.10:80 http://mapy.cz/basepoi/... text/xml, 701 B 0.035656 200 192.168.2.104:48443 77.75.72.10:80 http://mapy.cz/fotopoi/... text/xml, 2579 B 0.058675 200 192.168.2.104:48444 77.75.72.10:80 http://mapy.cz/trafficpoi/... text/xml, 6451 B 0.061435 200 192.168.2.104:48439 77.75.72.10:80 http://mapy.cz/weatherpoi/... text/xml, 6322 B 0.018402 200 192.168.2.104:37050 77.75.73.15:80 http://mapi.mapy.cz/... image/png, 304 B 0.128821 200 192.168.2.104:55866 195.113.27.37:80 http://www.mff.cuni.cz/ text/html, 6408 B 0.099579 200 192.168.2.104:55866 195.113.27.37:80 http://www.mff.cuni.cz/.../default.css text/css, 24969 B 0.056736 200 192.168.2.104:55869 195.113.27.37:80 http://www.mff.cuni.cz/.../slideshow.css text/css, 1086 B 0.036781 200 192.168.2.104:55867 195.113.27.37:80 http://www.mff.cuni.cz... application/x-javascript, 7516 B 0.018826 301 192.168.2.104:38338 212.24.146.202:80 http://prace.cz/ text/html, 228 B 0.022571 304 192.168.2.104:38339 212.24.146.202:80 http://www.prace.cz/css/print.css, 0 B 6.1.2 Druhý přı́klad Druhý přı́klad zapojenı́ modulu se týká opět zobrazovánı́ webových stránek, protentokrát jsem nasimuloval velmi pomalou linku na úrovni modemu (28kb/s). Stránka obsahuje náhledy obrázků a stejná odchycená data jsou užita i v ukázce modulu následujı́cı́ho. U stránek, které jsou stále platné a uložené v cache, je doba odezvy menšı́ něž jedna sekunda, což ovšem nemůžeme tvrdit o přenášených obrázcı́ch, jejichž průměrná doba přenesenı́ tvořı́ dnes nepředstavitelných 1 Round-trip time – doba mezi odeslánı́m zprávy a jejı́m potvrzenı́m 33 30 sekund. I přes velikost v řádu desı́tek kilobajtů je přenos neskutečně pomalý a můžeme s povděkem kvitovat, že se jedná o odezvy z dob dávno minulých. RTT code saddr:sport daddr:dport URL, content-type, length 0.119196 200 192.168.2.104:34433 74.125.87.138:80 http://clients1.google.cz/... text/javascript, 94 B 0.086568 200 192.168.2.104:34433 74.125.87.138:80 http://clients1.google.cz/... text/javascript, 102 B 0.067575 200 192.168.2.104:34434 74.125.87.138:80 http://clients1.google.cz/... text/javascript, 115 B 0.023053 304 192.168.2.104:60469 82.208.6.4:80 http://www.bagr.cz/.../16.jpg , 0 B 0.023479 304 192.168.2.104:60468 82.208.6.4:80 http://www.bagr.cz/.../11.jpg , 0 B 0.128240 304 192.168.2.104:60472 82.208.6.4:80 http://www.bagr.cz/.../24.jpg , 0 B 0.267189 304 192.168.2.104:60473 82.208.6.4:80 http://www.bagr.cz/.../26.jpg , 0 B 0.896860 304 192.168.2.104:60479 82.208.6.4:80 http://www.bagr.cz/.../02.jpg , 0 B 0.974960 200 192.168.2.104:59078 195.122.208.167:80 http://www.devnull.cz/docs/index.html text/html, 4453 B 0.336974 301 192.168.2.104:59078 195.122.208.167:80 http://www.devnull.cz/greece text/html, 304 B 1.034904 200 192.168.2.104:59079 195.122.208.167:80 http://www.devnull.cz/greece/ text/html, 2848 B 6.748143 301 192.168.2.104:59085 195.122.208.167:80 http://www.devnull.cz/barcelona text/html, 307 B 4.804956 200 192.168.2.104:59088 195.122.208.167:80 http://www.devnull.cz/barcelona/ text/html, 12438 B 42.917346 200 192.168.2.104:59092 195.122.208.167:80 http://www.devnull.cz/.../P1000492.gif image/gif, 20966 B 44.352634 200 192.168.2.104:59091 195.122.208.167:80 http://www.devnull.cz/.../P1000491.gif image/gif, 17201 B 0.955253 204 192.168.2.104:46455 77.75.77.156:80 62.694313 200 192.168.2.104:59093 195.122.208.167:80 http://www.devnull.cz/.../P1000494.gif image/gif, 22074 B 23.477284 200 192.168.2.104:59095 195.122.208.167:80 http://www.devnull.cz/.../P1000503.gif image/gif, 19166 B 72.921036 200 192.168.2.104:59094 195.122.208.167:80 http://www.devnull.cz/.../P1000497.gif image/gif, 19922 B 6.1.3 http://d.seznam.cz/hit/... text/html, 0 B Třetı́ přı́klad Pro poslednı́ přı́klad v podkapitole jsem zvolil modul, který ukazuje využitı́ protokolu sı́t’ové vrstvy ve verzi 6 a záznam komunikace vznikl po lokálnı́ sı́ti. Adresy jsou dlouhé co do výpisu, proto jsem zvolil jejich menšı́ zkrácenı́ pro účely prezentovánı́ do bakalářské práce. RTT code saddr:sport daddr:dport URL, content-type, length 0.018620 200 fd0:...:6193:36603 fd0:...:e39:80 http://[fd0:...:e39]/Sport.cz.html text/html, 42833 B 0.017950 200 fd0:...:6193:36606 fd0:...:e39:80 http://[fd0:...:e39]/.../userwebprint.css text/css, 716 B 0.018716 200 fd0:...:6193:36608 fd0:...:e39:80 http://[fd0:...:fe30:e39]/.../javascript text/plain, 1339 B 0.045221 200 fd0:...:6193:36603 fd0:...:e39:80 http://[fd0:...:fe30:e39]/.../sportall.js ..., 80087 B 0.024495 200 fd0:...:6193:36604 fd0:...:e39:80 http://[fd0:...:fe30:e39]/.../winplayer.js ..., 5401 B 0.028471 200 fd0:...:6193:36607 fd0:...:e39:80 http://[fd0:...:fe30:e39]/.../sectionhp.css text/css, 4722 B 0.012110 200 fd0:...:6193:36603 fd0:...:e39:80 http://[fd0:...:fe30:e39]/.../gemius.js ..., 6234 B 0.039178 200 fd0:...:6193:36605 fd0:...:e39:80 http://[fd0:...:fe30:e39]/.../userweb.css text/css, 16106 B 0.012024 200 fd0:...:6193:36607 fd0:...:e39:80 http://[fd0:...:fe30:e39]/.../impress text/plain, 43 B 0.022939 200 fd0:...:6193:36608 fd0:...:e39:80 http://[fd0:...:fe30:e39]/.../javascript text/plain, 7891 B 34 6.2 Grafový modul Grafový modul nám dává základnı́ charakteristiku dat, která jsou v souboru odchyceném ze sı́tě. Modul disponuje histogramem velikosti rámce, přenášeného po sı́t’ové infrastruktuře, dále máme k dispozici koláčový graf, který udává poměr užitých transportnı́ch protokolů, a to jak co do počtu rámců, tak i co do celkové velikosti dat tı́mto způsobem přenesených. Jako poslednı́ pár grafových výstupů nabı́zı́ modul graf toků, tedy kolik paketů bylo přeneseno za jednotku času, resp. kolik bajtů bylo přeneseno. Následujı́cı́ obrázky demonstrujı́ použitı́ modulu s popisem dat, která byla vložena na vstupu. Přı́klad 1: Flow graf velikosti přenášených dat Přı́klad 1: Flow graf počtu přenášených dat 6.2.1 Prvnı́ přı́klad Jako prvnı́ sadu vstupnı́ch dat jsem si připravil data, které jsou odchycené při navštı́venı́ stránek www.devnull.cz, navštı́vil jsem stránku s ukázkovými fotografiemi a navı́c jsem nasimuloval omezenı́ rychlosti podobné modemu (28kbit/s) pomocı́ Simple Queue u operačnı́ho systému MikroTik RouterOS[18]. Prvnı́ dvojice grafů ukazuje průtok dat v čase, na prvnı́m obrázku je krásně vidět průměrná rychlost 3.5 kB/s, na kterou byla linka degradována a druhý obrázek fakticky koresponduje s prvnı́m, počı́tá však jenom počet paketů, které se v praxi velmi diametrálně lišı́ co do velikosti, počı́naje potvrzovacı́m paketem spojenı́ TCP a konče přenášenými 35 Přı́klad 1: Histogram velikosti přenášených rámců (a) (b) Přı́klad 1: Podı́l užitých transportnı́ch protokolů daty v takovém spojenı́. Následuje klasický histogram velikosti rámců, jenž dokazuje zmiňované rozloženı́ velikosti paketů a najdete ho na třetı́m obrázku. Jako poslednı́ v sadě ukázek grafů najdete koláčový graf, který reflektuje percentuálnı́ využitı́ transportnı́ch protokolů, at’ už co do počtu paketů přenesených nebo co do velikosti dat. Z analýzy dat vyplývá, že se většina přenosu odehrává po TCP, což reálně odpovı́dá přenosu webových stránek. Po protokolu UDP docházı́ k přenosu hlavně DNS dotazů a jejich odpovědı́ a nakonec po ICMP docházı́ k přenosu zpráv hlavně o nedostupném DNS serveru. 36 6.2.2 Druhý přı́klad Pro druhý přı́klad jsem si vybral DNS požadavky na všechny domény nejvyššı́ úrovně. Pro demonstraci jsem použil program dig, jenž dokáže formulovat požadavek na doménu, vybral jsem volbu na dotaz na všechny atributy domény. Záměrně jsem použil protokol UDP, který je ostatně výchozı́m protokolem pro DNS požadavky. Avšak v důsledku požadavku na všechny atributy domény docházı́ k tomu, že po UDP lze dle specifikace přenášet pouze DNS odpovědi do velikosti 512B. Pokud je překročena velikosti, je v odpovědi zapnutý přı́znak truncated“ a ” požadavek je opakován po spojovaném kanále TCP. Přı́klad 2: Histogram velikosti přenášených rámců Na grafu s histogramem názorně vidı́me, že se nám oproti prvnı́mu přı́kladu zmenšilo spektrum velikosti paketů, velikost odpovědı́ pro UDP je limitována velikostı́ 512B. Pro požadavky, které jsou většı́ docházı́ k navazovánı́ TCP spojenı́, avšak velikost DNS odpovědı́ nenı́ o mnoho většı́, než zmiňovaných 512B. Na druhou stranu ale rozloženı́ velikostı́ kopı́ruje minulý histogram, největšı́ hustota je na počátku a konci spektra. Jako druhý graf v přı́kladu nalezneme využitı́ transportnı́ch protokolů, který jasně dává do souvislosti zastoupenı́ UDP a TCP protokolů. Co do počtu paketů, přenesených po protokolu, má většinu protokol TCP, avšak jak vı́me, protokol vytvářı́ spojenı́, které spolyká jistou režii a na druhém grafu je zastoupenı́ opačné, což odpovı́dá realitě, kdy se většina odpovědı́ vracı́ ve formě UDP datagramu. 6.3 Modul ARP/RARP Modul ARP/RARP netřeba dlouze představovat, sloužı́ pro převod hardwarových adres a sı́t’ových (resp. naopak). Do modulu je zakomponován převod MAC adres na výrobce hardwaru a můžete se o fungovánı́ přesvědčit na následujı́cı́ch dvou ukázkách. Vstup pro prvnı́ ukázku pocházı́ z bezdrátové sı́tě, kde došlo na routeru k zakázánı́ sı́t’ové karty a posléze k jejı́mu zapnutı́. Klienti se proto znovu zaregistrovali a znovu je nutná registrace na úrovni MAC adres. 37 (a) (b) Přı́klad 2: Podı́l užitých transportnı́ch protokolů Druhou ukázku jsou stáhl na stránkách programu Wireshark[19], jedná se o tzv. ARP bouřku, kterou vyvolal jeden z prvků v sı́ti. time dev company source paddr target haddress 16:34:30.66 ARP REQ type 00:60:b3:2a:47:5e Z-COM, INC. source haddress 196.168.48.1 00:00:00:00:00:00 dev company target paddr 196.168.48.2 16:34:30.79 ARP REQ 00:60:b3:2a:47:5e Z-COM, INC. 192.168.183.1 00:00:00:00:00:00 192.168.183.2 16:34:31.65 ARP REQ 00:60:b3:2a:47:5e Z-COM, INC. 196.168.48.2 196.168.48.1 00:00:00:00:00:00 16:34:31.74 ARP RESP 00:4f:62:0c:54:e4 196.168.48.2 00:60:b3:2a:47:5e Z-COM, INC. 196.168.48.1 16:34:31.79 ARP REQ 00:60:b3:2a:47:5e Z-COM, INC. 192.168.183.1 00:00:00:00:00:00 192.168.183.2 16:34:32.79 ARP REQ 00:60:b3:2a:47:5e Z-COM, INC. 192.168.183.1 00:00:00:00:00:00 192.168.183.2 16:34:32.86 ARP RESP 00:0e:2e:34:33:8e Edimax Technol. 192.168.183.2 00:60:b3:2a:47:5e Z-COM, INC. 192.168.183.1 16:34:32.99 ARP REQ 00:60:b3:2a:47:5e Z-COM, INC. 192.168.157.1 00:00:00:00:00:00 192.168.157.2 16:34:33.11 ARP REQ 00:60:b3:2a:47:5e Z-COM, INC. 193.168.106.1 00:00:00:00:00:00 193.168.106.2 16:34:33.17 ARP RESP 00:12:0e:34:7c:4c AboCom 193.168.106.2 00:60:b3:2a:47:5e Z-COM, INC. 193.168.106.1 16:34:33.99 ARP REQ 00:60:b3:2a:47:5e Z-COM, INC. 192.168.157.1 00:00:00:00:00:00 192.168.157.2 16:34:34.96 ARP REQ 00:12:0e:34:7c:4c AboCom 193.168.106.2 00:00:00:00:00:00 193.168.106.1 16:34:34.96 ARP RESP 00:60:b3:2a:47:5e Z-COM, INC. 193.168.106.1 00:12:0e:34:7c:4c AboCom 193.168.106.2 16:34:34.99 ARP REQ 192.168.157.1 00:00:00:00:00:00 192.168.157.2 192.168.157.2 00:60:b3:2a:47:5e Z-COM, INC. 192.168.157.1 00:60:b3:2a:47:5e Z-COM, INC. 16:34:35.20 ARP RESP 00:4f:62:07:e4:df 38 time source haddress dev company source paddr target haddress 16:01:05.27 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.173.159 16:01:05.37 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.172.141 16:01:05.38 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.173.161 16:01:05.48 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 65.28.78.1 00:00:00:00:00:00 65.28.78.76 16:01:05.49 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.173.163 16:01:05.58 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.175.123 16:01:05.60 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.173.165 16:01:05.68 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.175.82 16:01:05.73 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 69.76.216.1 00:00:00:00:00:00 69.76.220.131 16:01:05.76 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.173.168 16:01:05.78 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 69.76.216.1 00:00:00:00:00:00 69.76.221.27 16:01:05.78 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.174.184 16:01:05.81 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.173.169 16:01:05.86 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.174.181 16:01:05.93 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 69.76.216.1 00:00:00:00:00:00 69.76.223.216 16:01:05.96 ARP REQ 00:07:0d:af:f4:54 Cisco Systems 24.166.172.1 00:00:00:00:00:00 24.166.173.172 6.4 type company target paddr Modul DNS Závěrečná ukázka demonstruje práci při dotazovanı́ a odpovı́dánı́ server DNS, který má na starost překlad čı́selných adres na doménová jména, dále udržuje informace o poštovnı́m serveru domény, atd. U každé navrácené odpovědi naleznete informaci o čase, za jaký došlo k vyřı́zenı́, dále protokol, přes který odpověd’ a identifikace dotazu proběhla. Následuje vyčı́slenı́ počtu otázek (resp. odpovědı́) a na dalšı́ch řádcı́ch výpisu již figurujı́ otázky a odpovědi. U většiny známých typů odpovědı́ jsou znázorněny detailnı́ informace. Prvnı́ ukázka pocházı́ z programu Tcpdump a ukazuje běžné dotazy, uskutečňované při brouzdánı́ po webových stránkách. DNS UDP query: 0.128958 41305 1 1 1 0 (- - RD RA) Q: www.bonusweb.cz AAAA IN R: answer www.bonusweb.cz CNAME IN 837 (bonusweb.cz) R: authority bonusweb.cz SOA IN 1800 (ns1.mobil.cz, hostmaster.mobil.cz, 2009011601, 1800, 900, 604800, 1800) DNS UDP query: 0.091388 56210 1 2 2 0 (- - RD RA) Q: www.hobby.cz A IN R: answer www.hobby.cz CNAME IN 69290 (c2.idnes.cz) R: answer c2.idnes.cz A IN 878 (194.79.52.193) R: authority idnes.cz NS IN 2351 (ns2.mafra.cz) R: authority idnes.cz NS IN 2351 (ns.mafra.cz) DNS UDP query: 0.091730 28638 1 1 1 0 (- - RD RA) Q: www.hobby.cz AAAA IN R: answer www.hobby.cz CNAME IN 69290 (c2.idnes.cz) R: authority idnes.cz SOA IN 1800 (ns.mafra.cz, hostmaster.mafra.cz, 2010041501, 1800, 900, 604800, 1800) 39 DNS UDP query: 0.089450 63402 1 2 2 0 (- - RD RA) Q: www.mobil.cz A IN R: answer www.mobil.cz CNAME IN 1250 (c2.idnes.cz) R: answer c2.idnes.cz A IN 877 (194.79.52.193) R: authority idnes.cz NS IN 2350 (ns.mafra.cz) R: authority idnes.cz NS IN 2350 (ns2.mafra.cz) DNS UDP query: 0.089598 19899 1 1 1 0 (- - RD RA) Q: www.mobil.cz AAAA IN R: answer www.mobil.cz CNAME IN 1250 (c2.idnes.cz) R: authority idnes.cz SOA IN 1799 (ns.mafra.cz, hostmaster.mafra.cz, 2010041501, 1800, 900, 604800, 1800) DNS UDP query: 0.057208 8179 1 2 2 0 (- - RD RA) Q: www.technet.cz A IN R: answer www.technet.cz CNAME IN 69289 (technet.cz) R: answer technet.cz A IN 69289 (194.79.52.193) R: authority technet.cz NS IN 4030 (ns.mafra.cz) R: authority technet.cz NS IN 4030 (ns2.mafra.cz) DNS UDP query: 0.057378 12552 1 1 1 0 (- - RD RA) Q: www.technet.cz AAAA IN R: answer www.technet.cz CNAME IN 69289 (technet.cz) R: authority technet.cz SOA IN 10800 (ns.mafra.cz, hostmaster.mafra.cz, 2009072001, 28800, 7200, 604800, 86400) DNS UDP query: 0.057656 62360 1 2 2 0 (- - RD RA) Q: www.xman.cz A IN R: answer www.xman.cz CNAME IN 69289 (c2.idnes.cz) R: answer c2.idnes.cz A IN 877 (194.79.52.193) R: authority idnes.cz NS IN 2350 (ns2.mafra.cz) R: authority idnes.cz NS IN 2350 (ns.mafra.cz) DNS UDP query: 0.057778 41968 1 1 1 0 (- - RD RA) Q: www.xman.cz AAAA IN R: answer www.xman.cz CNAME IN 69289 (c2.idnes.cz) R: authority idnes.cz SOA IN 1799 (ns.mafra.cz, hostmaster.mafra.cz, 2010041501, 1800, 900, 604800, 1800) DNS UDP query: 0.062469 19219 1 2 2 0 (- - RD RA) Q: zdravi.idnes.cz A IN R: answer zdravi.idnes.cz CNAME IN 1250 (c3.idnes.cz) R: answer c3.idnes.cz A IN 828 (194.79.52.194) R: authority idnes.cz NS IN 2350 (ns2.mafra.cz) R: authority idnes.cz NS IN 2350 (ns.mafra.cz) Na závěr ukázek přidávám právě výstup z programu dig, konkrétně se jedná o DNS požadavek na doménu CZ, tedy na českou doménu nejvyššı́ úrovně. Výstup ukazuje např. záznamy o pod40 pisech a jejich klı́čı́ch, dále list DNS serverů domény a jejich IP adresy v obou verzı́ch. DNS TCP query: 0.054798 0 1 22 5 6 (- - RD RA) Q: CZ A IN R: answer CZ RRSIG IN 3600 (6 RSA/SHA-1 1 18000 64127 cz xjzl4fNQhkm6...uLnUQh4dd7mX7+Poz+QJLPQ=) R: answer cz SOA IN 3600 (a.ns.nic.cz, hostmaster.nic.cz, 1279157753, 900, 300, 604800, 900) R: answer cz RRSIG IN 3174 (2 RSA/SHA-1 1 18000 49499 cz dNOcoqK1Su22...gvoJxMRKxL6gV9m+TH0yZQo=) R: answer cz RRSIG IN 3174 (2 RSA/SHA-1 1 18000 64127 cz n0QNrrBa7sIa...DxljQchtoozQR4BOyc3UE58=) R: answer cz RRSIG IN 900 (47 RSA/SHA-1 1 900 49499 cz YKbIgqstlHYY...RbDLMZo6LhVcHYbdpt4zbvSQ=) R: answer cz RRSIG IN 900 (47 RSA/SHA-1 1 900 64127 cz WKgnUHTjaG1j...8LZ8t+DGacNndUhqXNrJsphY=) R: answer cz NSEC IN 900 R: answer cz DNSKEY IN 3600 R: answer cz DNSKEY IN 3600 R: answer cz DNSKEY IN 3600 R: answer cz DNSKEY IN 3600 R: answer cz NS IN 2200 (b.ns.nic.cz) R: answer cz NS IN 2200 (d.ns.nic.cz) R: answer cz NS IN 2200 (c.ns.nic.cz) R: answer cz NS IN 2200 (a.ns.nic.cz) R: answer cz NS IN 2200 (f.ns.nic.cz) R: answer cz RRSIG IN 3600 (48 RSA/SHA-1 1 3600 7978 cz 044/071EUNbXYqr...Xb3LhMU2gz6qB9GjCA==) R: answer cz RRSIG IN 3600 (48 RSA/SHA-1 1 3600 49499 cz GMrIkQ9mB3M0eze...FiIcPlSzmEBQeOY9Xn8=) R: answer cz RRSIG IN 3600 (48 RSA/SHA-1 1 3600 64127 cz kMUY7VCdVazESur...PrtHrxrzWH2sbTc2VUk=) R: answer cz RRSIG IN 172799 (43 Unknown algorithm 1 172800 41248 <root> YLEVIwUeei...pCfLkLGMjL1/E=) R: answer cz DS IN 172791 (9988 RSA/SHA-1 1 Ghjsr7hXl66hAxcD/Jpuc8kVACs=) R: answer cz DS IN 172791 (7978 RSA/SHA-1 1 RwkUzdqY0MwAFojLMsF6CckVAAI=) R: authority cz NS IN 2200 (d.ns.nic.cz) R: authority cz NS IN 2200 (b.ns.nic.cz) R: authority cz NS IN 2200 (a.ns.nic.cz) R: authority cz NS IN 2200 (f.ns.nic.cz) R: authority cz NS IN 2200 (c.ns.nic.cz) R: additional a.ns.nic.cz A IN 148648 (194.0.12.1) R: additional a.ns.nic.cz AAAA IN 148648 (2001:678:f::1) R: additional b.ns.nic.cz A IN 148649 (194.0.13.1) R: additional b.ns.nic.cz AAAA IN 148649 (2001:678:10::1) R: additional d.ns.nic.cz A IN 148648 (193.29.206.1) R: additional d.ns.nic.cz AAAA IN 148648 (2001:678:1::1) 41 Vnitřnı́ řešenı́ analyzátoru 7.1 Soubory programu Na úvod závěrečné kapitole začnu s představenı́m všech zdrojových souborů, které v programu naleznete. Jejich seznam spolu s vysvětlenı́m naleznete v následujı́cı́ tabulce. Jméno souboru config.h data obj.c (data obj.h) event calc (event cal.h) logger.c (logger.h) Makefile modules.c (modules.h) nepal.i utils.c (utils.h) 7.2 Popis definice konstant spolu s datovými typy implementace datového objektu, zejména velká množina funkcı́ pro ukládánı́ hodnot zásobnı́k události, funkce pro registrace a vyřı́zenı́ událostı́ logovacı́ systém, převzatý z knihovny LibUCW soubor s definicı́ kompilace a linkovánı́ programu deklarace a implementace všech modulů, které jsou použity v programu soubor pro definovánı́ obalu pro program SWIG soubor s pomocnými funkcemi Implementace datového objektu Datový objekt je univerzálnı́ struktura pro ukládánı́ informacı́ o datagramech, paketech, spojenı́ch atd. Pro ukládánı́ dat do datového objektu sloužı́ hešovacı́ tabulka z dı́lny knihovny LibUCW[5], která zahešuje atribut nějakého typu do tabulky. Atributy zpravidla rozdělujeme do dvou základnı́ch kategoriı́: hodnotové a referenčnı́. Hodnotové atributy sedı́ přı́mo ve struktuře pro atribut a jsou jimi např. INT, IPV4, DOBJ. Na druhé straně stojı́ atributy o kterých předem nevı́me, jak budou dlouhé. Přı́kladem budiž STRING či ARRAY, pro takové atributy je nutné alokovat mı́sto mimo strukturu a uložit si jejich referenci. Pro veškerou alokaci paměti pro datový objekt je použit memory pool, pro uvolněnı́ paměti objektu. Nenı́ nutné dealokovat po jednom všechny atributy, ale stačı́ zavolat metodu poolu, jež uvolnı́ celý blok paměti. Popsaná technika urychluje práci s pamětı́ a zapouzdřuje data společná pro jeden objekt. Každý datový objekt jasně definuje, jaké je třı́dy, a disponuje také zásobnı́kem událostı́. 7.3 Zásobnı́k událostı́ Dı́ky zásobnı́ku událostı́ můžeme o programu hovořit jako o událostmi řı́zeném. Nedocházı́ k přı́mému volánı́ metod, nýbrž nastane událost, která posléze zavolá všechny metody, které jsou v zásobnı́ku událostı́ zaregistrované. O zásobnı́ku mluvı́me z toho důvodu, že pokud nastane událost, nenı́ nikam uložena do kalendáře pro vyřı́zenı́, ale jsou sekvenčně procházeny události 42 a zavolány jejich metody pro obslouženı́. Hlavnı́ smyčka je prováděna v modulu PCAP, jenž načı́tá data ze souboru a volá pro každý paket obsluhu události packet. Zásobnı́kem disponujı́ téměř všechny naprogramované moduly a i některé typy datových objektů, které zpravidla představujı́ nějaký IP datagram, spojenı́, atd. Z hlediska vlastnı́ implementace je nejprve nutné registrovat jméno události do hešovacı́ tabulky. Pro registrovánı́ metody do zásobnı́ku je nutné uložit identifikátor události do hešovacı́ tabulky. Po vypuknutı́ události nejprve naleznu událost v zásobnı́ku a začnu sekvenčně procházet všechny zaregistrované funkce. Volánı́ funkcı́ je vytvořeno pomocı́ Python C API, kde jako jediný argument vyplnı́m datový objekt a obalený objekt v Pythonu posléze může vstoupit jednak do funkce v jazyce C, tak do funkce v Pythonu. Řešenı́ je celkem jednoduché a pro správné volánı́ funkcı́ si vystačı́me s klasickým zásobnı́kem volánı́, nenı́ nutné realizovat centrálnı́ kalendář nebo jinou, podobně orientovanou, datovou strukturu. 7.4 Programovánı́ modulů Při programovánı́ modulů musel být brát zřetel na několik věcı́. Každý modul dostává na svém vstupu datový objekt a je nutné filtrovat jejich typ. Pro tyto účely sloužı́ datové třı́dy a jejich otestovánı́ je velmi rychlé. Dalšı́ nepřı́jemnostı́ se stává skutečnost, že paket nebyl odchycen ze sı́tě v celé své velikosti. Proto je během načı́tánı́ informacı́ vždy nutné kontrolovat velikost dat a celý program je kontrolami protkán. Pro programovánı́ komplikovanějšı́ch modulů si nelze vystačit pouze s datovými objekty a je nutné vytvářet i dalšı́ pomocné datové struktury. Jako velmi šikovný se ukázat void ukazatel, dı́ky němuž nenı́ složité uložit do datového objektu ukazatel na nějakou pomocnou strukturu a při resetovánı́ či vypršenı́ časového limitu se nejen smaže spojenı́, ale dojde i k uvolněnı́ paměti, takto vzniklých struktur. 7.5 Představa fungovánı́ modulu TCP Modul TCP považuji za nejsložitějšı́ v rámci programu a proto bych se rád zmı́nil o jeho fungovánı́. Jako vstup se načtou pakety sı́t’ové vrstvy, následně dojde k dekódovánı́ atributů hlavičky a nalezenı́ spojenı́, do něhož paket zapadá. Pro ukládánı́ spojenı́ je použita hešovacı́ tabulka, kde za pomoci adres a portů vzniká jednoznačná identifikace spojenı́. Prvnı́m omezenı́m, které je nutné brát na zřetel, je potvrzovánı́: data prošlá po sı́t’ové infrastruktuře jsou předávána aplikačnı́ vrstvě až v okamžiku, kdy dorazı́ potvrzenı́ od druhé strany. Proto je nutné vstupnı́ data ukládat do zásobnı́ků a uvolňovat je až po doručenı́ potvrzenı́. Za druhý problém považuji ztrátu přenesených paketů během odchytávánı́, které je povětšinou způsobeno tı́m, že pakety přicházı́ ve špičkách rychleji, než je disk stačı́ ukládat. Jak již bylo zmı́něno, modul vytvářı́ datový objekt TCP flow, které disponuje vlastnı́m kalendářem událostı́, uchovává si stav spojenı́ a na obou směrech kanálu držı́ data prošlá po sı́ti, která ještě nejsou potvrzena. Pro ilustraci fungovánı́ sloužı́ přiložený obrázek. Na hornı́ části obrázku můžeme nahlédnout dva moduly, které již byly ukázány v schématu zapojenı́ programu. Z modulu TCP flow vidı́me, že nastala událost conn create, jež symbolizuje vznik nového spojenı́. Na obrázku jsou znázorněny jak vlastnı́ zásobnı́k událostı́, tak zásobnı́ky paketu, které čekajı́ na potvrzenı́. Kromě ještě nepotvrzených paketů můžeme vidět i TCP data, jenž vznikajı́ při události data. Data v sobě nesou pouze základnı́ informace a na 43 zmı́něnou událost se typicky navěšujı́ dalšı́ moduly (např. Modul HTTP), data zpracovávajı́ a také uvolňujı́ (uvolněná data symbolizuje proškrtlý obdélnı́k). Z hlediska konečného množstvı́ paměti, jenž máme k dispozici nenı́ možné vše držet v paměti a systém datových objektů nám sloužı́ jako dobrý mechanizmus. Jako obrana proti velkému množstvı́ alokované paměti jsou implementovány dva mechanizmy pro uvolňovánı́ užité paměti. Prvnı́m mechanizmem je limit na hornı́ počet paketů v zásobnı́ku spojenı́, limit lze v modulu TCP flow nastavit a při dosaženı́ hranice je celé spojenı́ prohlášeno za neplatné a nastane událost conn timeout. Druhým mechanizmem je kontrola poslednı́ho došlého paketu do spojenı́, kdy se kontrolujı́ neaktivnı́ spojenı́ a jsou následně prohlašována za neplatná (nastane událost conn timeout a dojde k ukončenı́ spojenı́). 44 Závěr 8.1 Zhodnocenı́ práce Ve vytvořeném programu nenı́ množina pokrytých protokolů modelu TCP/IP kompletně pokryta a ani být nemůže. Nenı́ v možnostech bakalářské práce zahrnou stovky dnešnı́ch protokolů do jednoho programu. Za mnohem důležitějšı́ považuji fakt, že funkčnı́ program je dostatečně obecný a otevřený, a proto při přidávánı́ nového protokolu nenarazı́ autor na žádné překážky. Při vytvářenı́ specifikace programu byla dlouho otevřená otázka propojenı́ jádra programu, napsaném v jazyce C, se skriptovacı́m jazykem. Nakonec jsem zvolil jazyk Python, se kterým jsem doposud neměl žádnou zkušenost. Python se osvědčil po všech stránkách: poskytl prostředky pro tvorbu skriptů, lze jı́m lehce obalit kód v jazyce C a doplnit jej o metody třı́d a nakonec byl jazyk také zvolen pro jeho nezávislost na operačnı́m systému. Jak zkušenosti s programem ukazujı́, rychlost programu na stroji s procesorem Intel Core2 Duo 2GHz, s pevným diskem s 5 400 otáčkami za minutu dosahuje při spuštěnı́ skriptu HTTP rychlost asi 13 MB/s, což odpovı́dá 100 Mb/s. Při této rychlosti zpracovánı́ dat je možné program nasadit v reálném čase na poloduplexnı́ 100Base-TX linku. Jak testy hlavně jednoduššı́ch skriptů ukázaly, největšı́ hardwarovou slabinou se stává pevný disk, který v přı́padě notebooku pracuje téměř na plný výkon. V rané fázi návrhu jsem přemýšlel nad myšlenkou vı́cevláknové aplikace, ale protože se našı́m největšı́m omezenı́m stává právě pevný disk, byl by přı́nos vı́ce výpočetnı́ch jader zanedbatelný a vznikala by nemalá režie spojená se synchronizacı́. Co se vlastnı́ho programovánı́ týče, tak se od počátku počı́talo s programovacı́m jazykem C. Dı́ky knihovně LibUCW se ale programovánı́ stalo pohodlnějšı́, pro alokaci paměti se osvědčil mempool a celý program je protkán hešovacı́mi tabulkami, počı́naje těmi jednoduchými s atomickým typem a konče složitějšı́mi s vı́cesložkovým klı́čem. Trendem dnešnı́ doby se stává programovánı́ ve stále vyššı́ch programovacı́ch jazycı́ch za pomoci silné knihovny funkcı́. Musı́m ale přiznat, že práce v jazyce C má stále své kouzlo a již jednou zmı́něná knihovna dodá programátorovi potřebný komfort při práci. 8.2 Možnosti budoucı́ho vývoje Program umı́ pracovat zhruba s jednou desı́tkou protokolů rodiny TCP/IP, což v porovnánı́ s celkovým počtem protokolů představuje pouze malou podmnožinu. Jistě by bylo velmi zajı́mavé zpracovánı́ protokolů jako jsou napřı́klad: SIP (Session Initiation Protocol), SMTP (Simple Mail Transfer Protocol) či FTP (File Transfer Protocol). Jako dalšı́ vylepšenı́ vidı́m možnost např. v on-line analyzátoru, kdy by vznikla webová stránka s množinou podporovaných analýz. Na uživateli by poté bylo si vybrat analýzy, které chce provést a program by mu následně odeslal jejich výsledky. Podobně by mohl být analyzátor nasazen za běhu sı́tě v režimu on-line, kdy by se data neukládala do souboru, ale přı́mo by se zası́lala analyzátoru. Nasazenı́ za běhu sı́tě by jistě vyžadovalo drobné změny, ale výsledky by mohly být zajı́mavé a stály by za to. 45 Literatura [1] W. Richard Stevens: TCP/IP Illustrated, Volume 1, The Protocols 1. vydanı́, Reading: Addison-Wesley, 1994, ISBN 0-201-63346-9 [2] Lamping U. a kol. (2010): Wireshark User’s Guide [online] http://www.wireshark.org/docs/wsug_html/ (5.6.2010) [3] Peterka J. (2010): E-archiv, přednáška Rodina protokolů TCP/IP [online] http://www.earchiv.cz/l221/index.php3 (6.6.2010) [4] IEEE OUI list [online] http://standards.ieee.org/regauth/oui/oui.txt (29.6.2010) [5] Mareš M. a kol. (2010): Knihovna UCW [online] http://www.ucw.cz/libucw/ (30.6.2010) [6] Python Software Foundation: Programovacı́ jazyk Python [online] http://python.org/ (18.7.2010) [7] Software Freedom Conservancy: SWIG, Simplified Wrapper and Interface Generator [online] http://swig.org/ (18.7.2010) [8] Hunter J. a kol. (2010): Matplotlib, vykreslovacı́ matematická knihovna pro Python [online] http://matplotlib.sourceforge.net/ (18.7.2010) [9] Carstens T.: PCAP, Packet capture library [online] http://tcpdump.org/ (18.7.2010) [10] GCC team: GCC, The GNU Compiler Collection [online] http://gcc.gnu.org/ (20.7.2010) [11] Plummer D.C. (1982): Request For Comments: 826, An Ethernet Address Resolution Protocol [online] http://www.ietf.org/rfc/rfc826.txt (26.7.2010) [12] Finlayson a kol. (1984): Request For Comments: 903, A Reverse Address Resolution Protocol [online] http://www.ietf.org/rfc/rfc903.txt (26.7.2010) [13] Information Sciences Institute (1981): Request For Comments: 791, Internet Protocol [online] http://www.ietf.org/rfc/rfc791.txt (26.7.2010) [14] Deering S. a kol. (1998): Request For Comments: 2460, Internet Protocol, Version 6 (IPv6) [online] http://www.ietf.org/rfc/rfc2460.txt (26.7.2010) [15] Postel J. a kol. (1980): Request For Comments: 768, User Datagram Protocol [online] http://www.ietf.org/rfc/rfc768.txt (26.7.2010) [16] Information Sciences Institute (1981): Request For Comments: 793, Transmission Control Protocol [online] http://www.ietf.org/rfc/rfc793.txt (26.7.2010) 46 [17] Feeling R. a kol. (1999): Request For Comments: 2616, Hypertext Transfer Protocol [online] http://www.ietf.org/rfc/rfc2616.txt (26.7.2010) [18] SIA ”Mikrotikls”(2010): RouterOS, operating system of RouterBOARD [online] http://www.mikrotik.com/ (26.7.2010) [19] Wireshark sample files, arp-storm.pcap [online] http://wiki.wireshark.org/SampleCaptures (26.7.2010) 47