„Internet od środka”
Adam Wysocki <gophi@apcoh.org>
17 października 2004
Kodowanie: ISO-8859-2

Cykl „Internet od środka” szczegółowo omawia zagadnienia związane z przesyłaniem danych w sieci Internet oraz z budową używanych w sieciach komputerowych struktur danych.

Internet od środka
Jakie mechanizmy tak naprawdę rządzą sieciami komputerowymi?

Internet już na dobre zadomowił się w Polsce. Z tego cyklu dowiesz się, co tak naprawdę się dzieje, kiedy jeden komputer chce wymienić informację z drugim. Pierwsza część omawia podstawy Internetu, czyli warstwową budowę pakietów w sieciach komputerowych, poszczególne warstwy oraz sposoby przechwytywania i wyświetlania ruchu w tych sieciach. Z następnych części dowiesz się więcej na temat protokołów używanych w Internecie. Dowiesz się także, jak działa ograniczanie pasma zajmowanego przez poszczególne usługi oraz w jaki sposób jest realizowana dokładna identyfikacja systemu operacyjnego na podstawie informacji wysyłanych przez ten system w ruchu sieciowym. Na końcu przeczytasz kilka słów na temat sposobów obrony przed niektórymi „niegrzecznymi” praktykami, destabilizującymi ruch w sieci i zagrażającymi utratą danych, jak przekierowania ICMP czy ARP spoofing.

Internet składa się z wielu sieci pakietowych, które wymieniają się informacjami. Sieć pakietowa charakteryzuje się tym, że porcje przesyłanych informacji dzielone są na pakiety, obsługiwane przez tzw. stos protokołów. Nazwa „stos” wzięła się od warstwowej budowy tego podsystemu - istnieje kilka warstw, na których działają różne protokoły, odpowiedzialne za różne aspekty przesyłu danych. Każda warstwa składa się z nagłówka protokołu i danych. W nagłówku zapisane są różne cechy danej warstwy pakietu i informacje sterujące, natomiast część danych najczęściej zawiera kolejną warstwę albo właściwe dane, przekazywane przez pakiet. Jeśli poprzednia (niższa) warstwa z jakiegoś powodu zawiedzie (np. kabel sieciowy zostanie przerwany albo adres sprzętowy - o tym niżej - nie będzie mógł być ustalony), protokoły na kolejnych warstwach nie będą mogły funkcjonować. Proces dodawania nagłówka do porcji danych nazywamy enkapsulacją, a proces tworzenia pakietu asemblacją.

Standardowym modelem, definiującym warstwy w sieciach komputerowych, jest model budowy sieci ISO/OSI (International Standard Organization's Open System Interconnect). Zgodnie z nim wyróżnia się siedem warstw, przedstawionych na rysunku 1.

Warstwa 7: Aplikacji
Warstwa 6: Prezentacji
Warstwa 5: Sesji
Warstwa 4: Transportowa
Warstwa 3: Sieciowa
Warstwa 2: Łącza danych
Warstwa 1: Fizyczna
Rys. 1. Warstwy sieciowe w modelu ISO/OSI.

Warstwa 1: Fizyczna (Physical Layer). Zapewnia połączenie sieci. Warstwą fizyczną są na przykład przewody sieciowe albo fale radiowe (w sieciach bezprzewodowych). Na tej warstwie określa się parametry sygnału, takie jak napięcia, tłumienie, kształty przebiegów itp. Istnieją różne sposoby łączenia ze sobą elementów sieci, ale w każdym z nich warstwa fizyczna odpowiada za to samo - zapewnia przesyłanie informacji warstwie łącza danych. Istnieją różne topologie (sposoby łączenia) sieci, mające swoje mocne i słabe strony. Najpopularniejszymi z nich są topologia szyny (bus topology), w której wszystkie maszyny podłączone są do jednej szyny komunikacyjnej oraz topologia gwiazdy (star topology), w której maszyny podłączone są do jednego centralnego punktu, rozdzielającego sieć. Stosowana jest także topologia drzewa, w której kilka grup komputerów, połączonych w gwiazdę, jest połączonych w topologii szyny.

Warstwa 2: Łącza danych (Data Link Layer). Ta warstwa odpowiada za prawidłowe kierowanie ramek (operujemy tutaj pojęciem ramki) w obrębie jednej sieci. Istnieją dwie grupy protokołów, pracujących na tej warstwie. Pierwszą grupę stanowią sieci broadcastowe, które współdzielą jedno medium komunikacyjne. Protokołem pracującym w takich sieciach jest np. protokół ethernetowy. Druga grupa to połączenia punkt-do-punktu (point-to-point), w których komunikacja na jednym kanale odbywa się między dwiema maszynami. Protokołem point-to-point jest np. PPP (Point-To-Point Protocol). Protokoły warstwy łącza danych nie są routowalne, tzn. ich nagłówki nie mogą być przesyłane między różnymi sieciami. Kiedy ramka musi być wysłana poza swoją sieć, trafia do maszyny nazywanej bramą, która usuwa nagłówek protokołu tej warstwy i dodaje nowy (niekoniecznie tego samego protokołu, np. po jednej stronie bramy może być sieć ethernetowa, a po drugiej połączenie DSL). W każdej broadcastowej sieci warstwa łącza danych dzieli się na dwie podwarstwy: niższą MAC (Medium Access Control), zapewniającą dostęp do współdzielonego medium wszystkim maszynom oraz wyższą LLC (Logical Link Control), kontrolującą przepływ danych, wykrywającą błędy transmisji itp. Podział warstwy łącza danych na podwarstwy przedstawia rysunek 2.

Podwarstwa 2: LLC
Podwarstwa 1: MAC
Rys. 2. Podział warstwy łącza danych w sieciach broadcastowych.

Przykładem protokołu łącza danych jest protokół ethernetowy, najczęściej stosowany w małych sieciach komputerowych. Inne protokoły pracujące na tej warstwie to np. Token Ring, FDDI (Fiber Distributed Data Interface), SNAP (SubNetwork Access Protocol), CIF (Cells In Frames), PPP (Point-To-Point Protocol), HDLC (High-Level Data Link) itp. Protokół ethernetowy operuje 48-bitowymi adresami MAC, najczęściej reprezentowanymi w postaci xx:xx:xx:xx:xx:xx. Ramki wysyłane na specjalny adres broadcastowy FF:FF:FF:FF:FF:FF kierowane są do wszystkich komputerów w obrębie jednej sieci. Warto także zazanczyć, że definiuje się największy rozmiar ramki, możliwej do przesłania tym protokołem (MTU, Maximum Transfer Unit) oraz największy rozmiar ramki możliwej do odebrania (MRU, Maximum Receive Unit). Wyższe warstwy muszą zapewnić, że rozmiar ramki nigdy nie przekroczy tego rozmiaru. Próby bezpośredniego wysyłania przez tą warstwę ramek o rozmiarze większym od MTU powodują zwrócenie błędu „Nieprawidłowy argument”.

Warstwa 3: Sieciowa (Network Layer). Protokoły na tej warstwie komunikują się używając adresów sieciowych, czyli adresów przyporządkowanych maszynom w całej sieci. Adresy sieciowe dzielą się na część identyfikującą sieć oraz część identyfikującą konkretną maszynę w tej sieci (hosta). W przeciwieństwie do protokołów warstwy łącza danych, nagłówki protokołów sieciowych są routowalne, czyli mogą być przesyłane między różnymi sieciami. Najpopularniejszym protokołem używanym na tej warstwie jest protokół internetowy, nazywany często IP (Internetwork Protocol). Obecnie stosowany jest protokół internetowy w wersji czwartej (IPv4). Adresy IP są 32-bitowymi liczbami, najczęściej zapisywanymi w postaci Dotted-Quad, czyli czterech ćwiartek, oddzielonych od siebie kropkami: x.x.x.x. Można wydzielić z nich część sieci i część hosta przez porównanie adresu z tzw. netmaską, czyli maską sieci. Maska sieci jest liczbą, zawierającą binarne jedynki w miejscach, w których adres IP zawiera część sieci i zera tam, gdzie znajduje się adres hosta. Czasami netmaska jest podawana jako liczba z zakresu 1-32 - określa wtedy liczbę jedynek, zaczynając od najbardziej znaczącego (najstarszego) bitu, które zawiera właściwa netmaska. Od kilku lat eksperymentalnie wprowadzana jest także najnowsza, szósta odmiana protokołu internetowego - IPv6 (nazywana czasami IPng, od IP New Generation), ale jej obecne zastosowanie najczęściej ogranicza się do zdobywania tysięcy hostów na IRCu :)

Protokoły warstwy sieciowej odpowiadają za kierowanie pakietów między komputerami, z których składa się sieć Internet oraz fragmentację (dzielenie) ich tak, żeby rozmiar trafiającej do warstwy łącza danych ramki nie przekraczał MTU. Nie odpowiadają natomiast za pewność przesyłu danych (nie próbują odzyskiwać utraconych pakietów) ani kolejność pakietów (pakiety mogą dochodzić do docelowej maszyny w innej kolejności, niż zostały wysłane). Pakiety sieciowe dzielą się na trzy kategorie: unicast, broadcast i multicast. Komunikację w poszczególnych kategoriach przedstawiają rysunki 3, 4 i 5.

Rys. 3. Komunikacja unicast (jeden do jednego).

Rys. 4. Komunikacja broadcast (jeden do wszystkich).

Rys. 5. Komunikacja multicast (jeden do niektórych).

Między pojedynczymi komputerami stosowana jest komunikacja unicastowa. W nagłówku protokołu sieciowego podawany jest adres docelowy konkretnej maszyny i pakiet trafia do miejsca przeznaczenia. Komunikacja broadcastowa stosowana jest wtedy, kiedy jeden komputer chce wysłać pakiet do wszystkich komputerów w obrębie sieci. Komunikacja multicastowa stosowana jest natomiast wtedy, kiedy pojedyncza maszyna chce skontaktować się tylko z niektórymi komputerami w sieci. Stosowanie tej ostatniej formy komunikacji wymaga obsługi innych protokołów (IGMP, Internet Group Management Protocol) oraz multicastowego routingu, czyli umiejętności radzenia sobie z takimi pakietami przez maszyny kierujące ruchem w sieci.

Warstwa 4: Transportowa (Transport Layer). Na tej warstwie operują protokoły TCP (Transmission Control Protocol) oraz UDP (User Datagram Protocol). Mówi się o protokole TCP/IP, ponieważ pod warstwą transportową zawsze znajduje się sieciowa. To na tej warstwie dodawane są porty, czyli 16-bitowe, najczęściej zapisywane w postaci dziesiętnej liczby, określające dokładne miejsce docelowe w komputerze o danym adresie sieciowym (zajmowane przez konkretną aplikację). Porty najczęściej są stałe dla poszczególnych usług, np. usługa WWW standardowo jest uruchomiona na porcie 80, co oznacza, że pakiety kierowane do serwera WWW muszą być kierowane do portu 80. Główną różnicą między TCP i UDP jest wydajność i pewność transmisji. TCP jest protokołem połączeniowym. Oznacza to, że zanim zostaną wysłane informacje protokołów wyższych warstw, musi zostać ustanowione połączenie. W zamian za to TCP zapewnia, że wysłane dane dojdą do celu dokładnie w takim stanie, w jakim zostały wysłane, bez powtórzeń, błędów ani zmiany kolejności a jeśli nie będą mogły być wysłane w niezmienionym stanie (bo zawiedzie któraś z niższych warstw), to nie dotrą wcale, a stos zwróci błąd. UDP z kolei jest protokołem bezpołączeniowym, nie zapewnia prawidłowego dotarcia informacji do celu, braku powtórzeń ani prawidłowej kolejności otrzymania pakietów. Dodaje natomiast dużo mniej informacji niż TCP, wymaga mniejszego pasma oraz umożliwia transmisję unicastową i multicastową, podczas gdy TCP umożliwia jedynie unicastową. UDP jest czasami uważane za rozszerzenie komunikacji komputer-do-komputera, udostępnianej przez protokoły warstwy sieciowej, o komunikację program-do-programu. Wybór protokołu transportowego zależy od konkretnych potrzeb.

Warstwa 5: Sesji (Session Layer). Określa format (postać) danych wysyłanych przez sieć i steruje sesją. Jeśli połączenie zostanie zerwane, to właśnie na tej warstwie odbywa się decyzja, czy wznowić połączenie, czy zasygnalizować błąd. W większości zastosowań ta warstwa nie jest wykorzystywana, ale ma kilka zastosowań, np. synchronizacja obrazu z dźwiękiem podczas transmisji multimedialnych.

Warstwa 6: Prezentacji (Presentation Layer). Protokoły na tej warstwie zamieniają reprezentację danych właściwą dla konkretnego komputera na reprezentację danych ogólnie przyjętą w sieci. Typowym przykładem jest zamiana kolejności bajtów podczas zapisywania wielobajtowych liczb. Różne architektury procesorów różnie zapisują takie liczby (standardy Big-Endian i Little-Endian) ale w sieci, która z założenia służy do łączenia wielu różnych maszyn, musi obowiązywać jeden, niezależny od architektury procesora standard. Innym przykładem jest transparentna (przezroczysta dla wyższej warstwy) kompresja i dekompresja danych lub ich szyfrowanie.

Warstwa 7: Aplikacji (Application Layer). Udostępnia określone usługi użytkownikom albo programom. Protokoły na tej warstwie bardzo silnie zależą od konkretnego zastosowania. Przykładami protokołów pracujących na warstwie aplikacji mogą być protokoły HTTP (Hypertext Transfer Protocol, odpowiadający za przesyłanie stron WWW), FTP (File Transfer Protocol, przesyłanie plików), SMTP (Simple Mail Transfer Protocol, transport poczty), NTP (Network Time Protocol, przesyłanie informacji o aktualnym czasie) itp.

W sieciach komputerowych najczęściej funkcjonuje uproszczony model ISO/OSI, zawierający tylko cztery warstwy, zgodnie z rysunkiem 6.

Warstwa 4: Aplikacji
Warstwa 3: Transportowa
Warstwa 2: Sieciowa
Warstwa 1: Łącza
Rys. 6. Warstwy sieciowe w uproszczonym modelu ISO/OSI.

Warstwa 1: Łącza (Link Layer). Odpowiada warstwie fizycznej i łącza danych modelu ISO/OSI.

Warstwa 2: Sieciowa (Network Layer). Odpowiada warstwie sieciowej modelu ISO/OSI.

Warstwa 3: Transportowa (Transport Layer). Odpowiada warstwie transportowej modelu ISO/OSI.

Warstwa 4: Aplikacji (Application Layer). Odpowiada warstwie aplikacji modelu ISO/OSI.

Tak to wygląda w teorii i najczęściej w praktyce, ale czasami pakiety internetowe zawierają inną kombinację nagłówków - przykładowo można tunelować ruch IP przez aplikację szyfrującą, opartą o TCP.

Co więc się dzieje, jeśli chcemy wysłać gdzieś pakiet, np. UDP? Maszyna wysyłająca pakiet asembluje (tworzy) go, dodając po kolei nagłówki protokołu ethernetowego, internetowego, UDP oraz właściwe dane od aplikacji, czyli programu, który wysyła ten pakiet. Następnie oblicza kilka rzeczy (sumy kontrolne) i umieszcza tak skonstruowaną ramkę w buforze (kolejce) urządzenia sieciowego (karty sieciowej), przez które ramka ma zostać wysłana. Stos TCP/IP korzysta z kilku tablic, w których zawarte są informacje potrzebne do podejmowania decyzji typu „co gdzie wysłać”. Te tablice to:

Skąd maszyna wie, pod jaki adres sprzętowy powinna wysłać pakiet? Służy do tego protokół ARP. ARP wiąże adresy sieciowe (IP) ze sprzętowymi (MAC). Zasada działania jest prosta - host, który chce poznać adres sprzętowy innego komputera, wysyła ARP request, czyli mały pakiet broadcastowy (kierowany do wszystkich) z pytaniem „kto ma ten adres IP?”. Odpowiednia maszyna wysyła odpowiedź, podając swój adres sprzętowy. Protokół ARP jest bezpołączeniowy i bezstanowy, co oznacza, że wysyłając odpowiedź na niezadane pytanie można zmienić zawartość tablicy ARP (ma to duże znaczenie z punktu widzenia bezpieczeństwa). Oprócz tego... No właśnie, jest małe „ale”. Adresy sprzętowe nie są routowalne, czyli istnieją tylko w obrębie jednej sieci. Gdyby maszyna chciała wysłać ramkę do komputera znajdującego się w innej sieci, nie będzie mogła tego zrobić. Dlatego wprowadzono pojęcie bramy. Brama jest komputerem, do którego inne komputery w obrębie sieci wysyłają wszystkie pakiety, kierowane do maszyn spoza sieci. Domyślna brama jest używana wtedy, kiedy na komputerze nie ma innej reguły routingu (kierowania pakietów). Standardowo systemy komputerowe kierują pakiety w obrębie własnej sieci (znając swój adres IP i maskę sieci) bezpośrednio do odpowiednich maszyn, a pakiety kierowane do komputerów spoza sieci do bramy. Tak to właśnie działa - pakiet wysyłany w świat ma ustawiony docelowy adres sprzętowy na adres bramy. Brama może robić z pakietem najróżniejsze rzeczy. Jej podstawową funkcją jest routing, czyli kierowanie pakietów między różnymi sieciami. Oprócz tego może odpowiednio modyfikować pakiety, filtrować je, dokonywać translacji adresów IP (dzieląc jeden lub więcej adresów widzianych spoza sieci lokalnej na wiele komputerów w tej sieci), kształtować pasmo (odpowiednio ograniczać ruch) itp. Konfiguracja bramy może zawierać się w jednym poleceniu iptables (Linux) czy natd (FreeBSD), ale równie dobrze może być bardzo rozbudowana.

Zanim przejdziemy do szerszego omówienia poszczególnych protokołów sieciowych (i zaśniemy od nadmiaru teorii w jednym miejscu), warto zdobyć trochę umiejętności praktycznych.

Do przechwytywania pakietów z interfejsów sieciowych służą tzw. surowe gniazda sieciowe (raw sockets). Odpowiednio je programując można uzyskać dostęp do pakietów wymienianych między maszynami w sieci... No właśnie, to sprawa dla programistów. Van Jacobson, Craig Leres oraz Steven McCanne, pracujący w laboratorium Lawrence Berkeley National Laboratory uniwersytetu University of California, opracowali bibliotekę libpcap oraz program tcpdump, umożliwiając przechwytywanie i wyświetlanie pakietów bez zagłębiania się w programowanie. tcpdump należy do grupy programów nazywanych snifferami.

Program tcpdump (oraz wersja dla Windows - Windump, do pobrania spod adresu http://windump.polito.it/) korzysta z surowych gniazd, do których otworzenia potrzebne są uprawnienia administratora, tak więc tcpdumpa nie uda się uruchomić z konta użytkownika. Sniffer ma bardzo prostą składnię. W większości przypadków wystarczy po prostu wpisać tcpdump, a program zacznie wypisywać nagłówki pakietów, znajdowanych w sieci. Opcje podawane są w linii komend. Najczęściej używane są następujące opcje tego programu.

Po opcjach może nastąpić tzw. wyrażenie filtrujące. Określa ono kryteria, na podstawie których pakiety są przetwarzane i wyświetlane lub odrzucane. Wyrażenia filtra można ze sobą łączyć operatorami and i or. Najczęściej stosowane wyrażenia to:

Spis wszystkich opcji programu tcpdump oraz wszystkich możliwych wyrażeń filtrujących znajduje się w manualu do tego programu, np. na stronie http://www.freebsd.org/cgi/man.cgi?query=tcpdump. Przykładowo, program tcpdump można wywołać w ten sposób:

tcpdump -X -s 1024 -i eth0 -n net 192.168.0.0/24 and port http

Spowoduje to rozpoczęcie wyświetlania wszystkich pakietów, znajdowanych na interfejsie eth0 i kierowanych od lub do sieci 192.168.0.0/24 (24 jest tutaj maską sieci) oraz od lub do portu 80 (nazwa portu http ma w pliku /etc/services przyporządkowany numer 80). tcpdump nie jest jednak wolny od wad - zanim wyrażenie filtra zostanie zastosowane, program będzie wypisywał wszystkie znajdowane pakiety, dlatego warto chwilę poczekać przed próbą rozpoznania właściwego ruchu. Jest to szczególnie uciążliwe, jeśli w wyrażeniu filtra zostanie podana nazwa hosta, którą trzeba rozwiązać na adres.

Przykładowy pakiet przedstawiony jest na rysunku 7.

Rys. 7. Przykładowy pakiet.

Kolorem czerwonym jest na nim zaznaczony nagłówek protokołu sieciowego (tutaj IP), zielonym nagłówek protokołu transportowego (TCP), a żółtym dane, przekazywane przez pakiet. Po kolei informacje oznaczają:

Bardzo dużo informacji, z których większość jest na razie niezrozumiała, ale nie martw się, w miarę czytania tego artykułu dojdziesz do tego, „co jest co”.

W tym artykule to już wszystko. Czytelnik zapoznał się z podstawami komunikacji w sieciach komputerowych oraz poznał podstawowe sposoby przechwytywania danych w tych sieciach. Zapraszam do następnej części tego cyklu, która ukaże się za miesiąc.

Adam Wysocki