Statystyka protokołów i połączeń sieciowych. Aplikacja netstat. dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska 48 50-204 Opole zlipinski@math.uni.opole.pl
Statystyka połączeń sieciowych. Narzędzie netstat podstawowe pojęcia. port - routing - jest to 16-bitowa liczba, z zakresu 1-65535, która służy do identyfikacji instancji aplikacji sieciowej na danym hoście. W sieciach TCP/IP są dwa rodzaje portów porty TCP, porty UDP. jest procesem wyznaczania najkrótszej trasy i najlepszej metody przesyłania danych między użytkownikami sieci. tablica routingu - tablice danych zawierające adresy sieci odbiorców danych, adresy IP routerów, są budowane przez routery w celu wyznaczania trasy przesyłanych datagramów IP. metryka trasy - parametr charakteryzujący koszt danej trasy. Routery przy określaniu najlepszej trasy posługują się zbiorem parametrów (metrykami), które służą do wyliczenia kosztu trasy (kosztu transmisji). Przykładowe parametry służące do wyliczania kosztu trasy: liczba skoków (liczba routerów do odbiorcy pakietu), pasmo przenoszenia (różnica między maks. i min. częstotliwością transmisji sygnałów w sieci), opóźnienie, czas przejścia pakietu od nadawcy do odbiorcy, obciążenie sieci, stopień wykorzystania urządzeń i łącz, niezawodność, liczba błędów występująca na danej trasie, takty, opóźnienie w warstwie łącza danych, 1 takt = 1/18s, parametry określane przez administratora, mogą być kombinacja różnych parametrów. 2
Statystyka połączeń sieciowych. Narzędzie netstat. Narzędzie netstat służy do uzyskiwania informacji o statystyce protokołu i połączenia sieciowego na danym hoście. Narzędzie netstat uruchomione z odpowiednimi parametrami pozwala uzyskać informację o: połączeniach sieciowych i otwartych portach, statystykę transmisji ramek ethernetowych, tabelę routingu, do obsługi tabeli routingu służy polecenie linii komend route, informacje o metryce trasy, stan bieżących połączeń. 3
Narzędzie netstat C:\Users\admin>netstat /? Wyświetla statystykę protokołu i bieżące połączenia sieciowe TCP/IP. NETSTAT [-a] [-e] [-f] [-n] [-o] [-p protokół] [-r] [-s] [-t] [interwał] -a Wyświetla wszystkie połączenia i porty nasłuchujące. -e Wyświetla statystykę sieci Ethernet. -f Wyświetla w pełni kwalifikowane nazwy domen (FQDN) adresów obcych. -n Wyświetla adresy i numery portów w postaci liczbowej. -o Wyświetla dla każdego połączenia skojarzony z nim identyfikator procesu będącego jego właścicielem. -p protokół Wyświetla połączenia dla określonego protokołu; może to być protokół TCP, UDP, TCPv6 lub UDPv6. Jeżeli ta opcja zostanie użyta razem z opcją -s do wyświetlenia statystyki wybranego protokołu, protokół może mieć dowolną wartość z następujących: IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP lub UDPv6. -r Wyświetla ś tabelę ę routingu. -s Wyświetla statystykę wybranego protokołu. Domyślnie jest to statystyka protokołów IP, IPv6, ICMP, ICMPv6, TCP, TCPv6, UDP i UDPv6; do określenia jej podzbioru można użyć opcji -p. -t Wyświetla bieżący stan odciążania połączenia. interwał Ponownie wyświetla wybraną statystykę, odczekując zadaną liczbę sekund pomiędzy każdym wyświetleniem. 4
Przykład: statystyka protokołu TCP. Narzędzie netstat 5
Narzędzie netstat Przykład: aktywne połączenia TCP. 6
Specyfikacja struktury MIB_TCPTABLE * Nazwa struktury: MIB_TCPTABLE Opis : Struktura MIB_TCPTABLE zawiera tablicę połączeń TCP. Atrybuty : dwnumentries - Określa liczbę elementów tabeli. table - Wskaźnik do tablicy połączeń TCP (atrybut table to tablica struktur MIB_TCPROW). Implementacja struktury MIB_TCPTABLE: typedef struct _MIB_TCPTABLE { dwnumentries; MIB_TCPROW table[any_size]; } MIB_TCPTABLE, *PMIB_TCPTABLE; * MIB - Management Information Base 7
Nazwa struktury: MIB_TCPROW Specyfikacja struktury MIB_TCPROW Opis : Struktura MIB_TCPROW zawiera informację o statusach połączeń TCP. Atrybuty : dwstate Struktura zadeklarowana w pliku Iprtrmib.h. Atrybut określa status połączenia TCP. Możliwe wartości atrybutu: MIB_TCP_STATE_CLOSED, MIB_TCP_STATE_LISTEN, MIB_TCP_STATE_SYN_SENT, MIB_TCP_STATE_SYN_RCVD, MIB_TCP_STATE_ESTAB, MIB_TCP_STATE_FIN_WAIT1, MIB_TCP_STATE_FIN_WAIT2, MIB_TCP_STATE_CLOSE_WAIT, MIB_TCP_STATE_CLOSING, MIB_TCP_STATE_LAST_ACK, MIB_TCP_STATE_TIME_WAIT, MIB_TCP_STATE_DELETE_TCB dwlocaladdr - Określa adres IP lokalnego hosta. Wartości zero wskazuje, że aplikacja nasłuchująca może zaakceptować połączenie na dowolnym interfejsie. dwlocalport - Atrybut określa numer portu lokalnego hosta. dwremoteaddr - Atrybut określa adres IP zdalnego hosta. dwremoteport - Atrybut określa numer portu zdalnego hosta. Implementacja struktury MIB_TCPROW: typedef struct _MIB_TCPROW { dwstate; dwlocaladdr; dwlocalport; dwremoteaddr; dwremoteport; } MIB_TCPROW, *PMIB_TCPROW; 8
Specyfikacja struktury MIB_TCPSTATS Nazwa struktury: MIB_TCPSTATS Opis : Atrybuty : Struktura MIB_TCPSTATS zawiera informacje statystyczne o protokole TCP na lokalnym hoście. dwrtoalgorithm - Określa używany algorytm RTO (Retransmission Time-Out), RFC 1122, algorytmy Jacobson a, Karn a. dwrtomin - dwrtomax - dwmaxconn - dwactiveopens - dwpassiveopens - dwattemptfails - dwestabresets - dwcurrestab - dwinsegs - dwoutsegs - dwretranssegs - dwinerrs - dwoutrsts - dwnumconns - V. Jacobson, Congestion Avoidance and Control, ACM SIGCOMM-88, August 1988. Określa minimalny czas retransmisji liczony w milisekundach. Określa maksymalny czas retransmisji liczony w milisekundach. Określa maksymalna liczbę połączeń. Wartość atrybutu = -1; oznacza zmienną liczbę połączeń. Określa liczbę aktywnych otwarć active opens. Aktywne otwarcie określa połączenie inicjujące klienta z serwerem. Określa liczbę pasywnych otwarć pasive opens. Pasywne otwarcie określa liczbę otwartych połączeń serwera nasłuchującego na zapytania klienta. Określa liczbę nieudanych prób połączeń. Określa liczbę zresetowanych połączeń. Określa liczbę bieżących połączeń. Określa liczbę otrzymanych segmentów. Określa liczbę wysłanych segmentów (liczba nie uwzględnia segmentów retransmitowanych). Określa liczbę retransmitowanych segmentów. Określa liczbę odebranych błędów. Określa liczbę wysłanych segmentów z flagą reset=1. Określa liczbę wszystkich połączeń (przyrostowo). 9
Implementacja struktury MIB_TCPSTATS typedef struct _MIB_TCPSTATS { } MIB_TCPSTATS, *PMIB_TCPSTATS; dwrtoalgorithm; dwrtomin; dwrtomax; dwmaxconn; dwactiveopens; dwpassiveopens; dwattemptfails; dwestabresets; dwcurrestab; dwinsegs; dwoutsegs; dwretranssegs; dwinerrs; dwoutrsts; dwnumconns; 10
Nazwa funkcji: GetTcpTable() Zwracana wartość: Specyfikacja funkcji GetTcpTable() Funkcja zwraca NO_ERROR gdy wywołanie funkcji zakończyło się sukcesem. W innym przypadku zwracane są kody błędów: ERROR_INVALID_PARAMETER, ERROR_INSUFFICIENT_BUFFER, ERROR_NOT_SUPPORTED, inne. Argumenty : PMIB_TCPTABLE ptcptable, P pdwsize, BOOL border ptcptable - [out] Wskaźnik do bufora który przechowuje tablicę połączeń TCP (struktura MIB_TCPTABLE). pdwsize - border - [in, out] Dla wejścia, określa wielkość bufora wskazywany przez wskaźnik ptcptable. Gdy bufor jest za mały dla odbioru danych połączenia, funkcja GetTcpTable() ustawia wartość tego parametru na wymaganą wielkość bufora. [in] Określa czy tablica połączeń powinna być uporządkowana (sortowana). Gdy parametr ma wartość TRUE, tablica jest uporządkowana w sposób: lokalny adres IP, lokalny numer portu, zdalny adres IP, zdalny numer portu. Opis : Funkcja GetTcpTable() służy do pobierania informacji o tablicy połączeń TCP. 11
Specyfikacja funkcji GetTcpStatistics() Nazwa funkcji : GetTcpStatistics() Zwracana wartość: Funkcja zwraca NO_ERROR gdy wywołanie funkcji zakończyło się sukcesem. W innym przypadku funkcja używa FormatMessage dla uzyskania wiadomości o zawracanym błędzie Argumenty : PMIB_TCPSTATS pstats pstats - [out] Wskaźnik do struktury MIB_TCPSTATS do której pobierane są dane o statystyce TCP lokalnego hosta. Opis : Funkcja GetTcpStatistics() służy do pobierania informacji o statystyce TCP lokalnego hosta. 12
Specyfikacja makra MAKEWORD() Nazwa makra : MAKEWORD() Zwracana wartość: WORD Argumenty : BYTE blow, BYTE bhigh blow drugi bajt nowej wartości typu WORD (the low-order byte of the new value). bhigh pierwszy bajt nowej wartość (the high-order byte of the new value). Makro służy do tworzenia zmiennej typu WORD (16-bitowy unsigned integer) z dwóch zmiennych typu BYTE (unsigned char, 8 bitów). Makro zadeklarowane w Windef.h, zawiera Windows.h Przykład: MAKEWORD(4,3) = 772 (dec) 4, (bin) 00000100 (dec) 3, (bin) 00000011 wartość (dec) 772, (bin) 00000011 00000100 Implementacja makra MAKEWORD: #define MAKEWORD(a, b) ((WORD)(((BYTE)(a)) ((WORD)((BYTE)(b))) << 8)) 13
Specyfikacja funkcji getconnstatistics() void getconnstatistics() { cout << "*** Statystyka polaczen ***" << endl; MIB_TCPSTATS * ptcpstats = NULL; ptcpstats = new MIB_TCPSTATS[sizeof(MIB_TCPSTATS)]; GetTcpStatistics(pTcpStats); cout << "\tdwrtoalgorithm. : " << ptcpstats->dwrtoalgorithm << endl; cout << "\tdwnumconns... : " << ptcpstats->dwnumconns << endl; } delete [] ptcpstats; 14
Specyfikacja funkcji getconntable() void getconntable() { MIB_TCPTABLE * ptcptable = NULL; status = NO_ERROR; dwactualsize = MAKEWORD(0,0); string strstate; struct in_addr inadlocal, inadremote; dwremoteport = MAKEWORD(0,0); string slocalip, sremoteip; cout << "*** Tablica polaczen ***" << endl; status = GetTcpTable(pTcpTable, &dwactualsize, TRUE); if (status == ERROR_INSUFFICIENT_BUFFER) { ptcptable = new MIB_TCPTABLE[dwActualSize]; status = GetTcpTable(pTcpTable, &dwactualsize, TRUE); } 15
Specyfikacja funkcji getconntable() if (ptcptable!= NULL) { cout << "\tlok. Adres" << ":" << "Port\t\t" ; cout << "Zdalny Adres" << ":" << "Port\t" ; cout << "Stan" << endl; for ( unsigned int i = 0; i < ptcptable->dwnumentries; i++) { switch (ptcptable->table[i].dwstate) { case MIB_TCP_STATE_TIME_WAIT: strstate= "TIME_WAIT"; break; case MIB_TCP_STATE_LAST_ACK: strstate= "LAST_ACK"; break; case MIB_TCP_STATE_CLOSING: strstate= "CLOSING"; break; case MIB_TCP_STATE_CLOSE_WAIT: strstate= "CLOSE_WAIT"; break; case MIB_TCP_STATE_FIN_WAIT1: strstate="fin_wait1"; break; case MIB_TCP_STATE_ESTAB: strstate ="ESTAB"; break; case MIB_TCP_STATE_SYN_RCVD: strstate="syn_rcvd"; break; case MIB_TCP_STATE_SYN_SENT: strstate="syn_sent" ; break; case MIB_TCP_STATE_LISTEN: strstate="listen" ; break; case MIB_TCP_STATE_DELETE_TCB: strstate="delete" ; break; default: cout << "Unknown" << endl; break; } 16
Specyfikacja funkcji getconntable() inadlocal.s_addr = ptcptable->table[i].dwlocaladdr; if (strstate!= "LISTEN") dwremoteport = ptcptable->table[i].dwremoteport; else dwremoteport = 0; inadremote.s_addr = ptcptable->table[i].dwremoteaddr; slocalip=inet_ntoa(inadlocal); sremoteip=inet_ntoa(inadremote); cout << "\t"; cout << slocalip << ":" << ntohs((unsigned short)(0x0000ffff & ptcptable->table[i].dwlocalport)) << "\t\t" ; cout << sremoteip << ":" << ntohs((unsigned short)(0x0000ffff & dwremoteport))<< "\t\t"; cout << strstate << endl; } } delete [] ptcptable; } 17
Specyfikacja projektu netstat1 Nazwa projektu: netstat1 Typ projektu: Win32 console application Lista plików: netstat1.cpp Metoda kompilacji: Microsoft Visual C++ 2008. Utworzyć projekt typu 'Win32 console application w menu (-)File-> New -> Project-> Other languages-> Visual C++ -> win32 -> Win32 console application -> wpisać nazwę: netstat1 -> przycisk (OK) -> Okno Win32 application wizard netstat1-> wybrać: Application settings -> wybrać: Empty project-> Przycisk (Finish). Konfiguracja projektu: (-)Project-> nazwa_projektu Properies... -> Configuration Properies-> Linker-> Input -> Additional Dependecies, wpisać: ws2_32.lib IPHlpApi.Lib Funkcjonalność: Aplikacja pozwala uzyskać informację i statystyce protokołu TCP i połączeniach TCP. Aby uruchomić aplikację należy w linii komend (Run-> cmd) wpisać: \> netstat1 18
Struktura programu netstat1 Pliki nagłówkowe: windows.h, winsock.h, iphlpapi.h, iptypes.h, iostream, string Funkcje programu: Funkcje WinSock: WSAStartup(); WSACleanup(); GetTcpTable(); GetTcpStatistics() Funkcje zdefiniowane: getconntable(), getconnstatistics() Zmienne programu: WSADATA wsadata; WORD wversionrequested = MAKEWORD(1,1); int nret; 19
Struktura programu Funkcja: main() Zwracana wartość: void Argumenty : brak (1) Sprawdzenie wersji WinSock a. nret = WSAStartup(wVersionRequested, &wsadata); (2) Wywołanie funkcji getconnstatistics(); (3) Wywołanie funkcji getconntable(); (4) Zamknięcie winsock a. Wywołanie funkcji WSACleanup(); 20
///////////////////////// // tcpstat, netstat //////////////////////// #include <windows.h> #include <winsock.h> #include <iphlpapi.h> #include <iptypes.h> #include <iostream> #include <string> using namespace std; void void getconntable(); getconnstatistics(); void main() { WORD wversionrequested = MAKEWORD(1,0); WSADATA wsadata; int nret; } nret = WSAStartup(wVersionRequested, &wsadata); getconnstatistics(); getconntable(); WSACleanup(); 21
Dodatek Management Information Base (MIB) Baza MIB, (ang.) Management Information Base jest numeryczną bazą służącą do przechowywania danych o zarządzanym systemie. Struktura bazy MIB określa standard SMI, (ang.) Structure of Management Information, RFC 1155. Baza MIB ma strukturę drzewa w której liściami są MIB'y służące do zarządzania poszczególnymi obiektami. Struktura MIB (MIB-II): { iso org(3) dod(6) internet(1) mgmt(2) mib-2 (1) 1 } { 1 3 6 1 2 1 1 } { iso org dod internet mgmt mib-2 system sysservices Instance} {1.3.6.1.2.1.1.7.0}. Przykład. Główny MIB: 1.3.6.1.4.1.42.1.1 może reprezentować obiekt w zarządzanym systemie (host, router). MIB'y zbudowane z głównego MIB'a (root MIB) służą do zarządzania określonymi obiektami. 22
Dodatek Management Information Base (MIB) Przykład cd. MIB y identyfikujące różne typy obiektów: systemowe {1.3.6.1.2.1.1} interfejsy {1.3.6.1.2.1.2} address translation {1.3.6.1.2.1.3} IP subtree {1.3.6.1.2.1.4} ICMP {1.3.6.1.2.1.5} TCP {1.3.6.1.2.1.6} UDP {1.3.6.1.2.1.7} Exterior Gateway Protocol (EGP) {1.3.6.1.2.1.8} transmisja {1.3.6.1.2.1.9} Informacje standardach i zastosowaniach MIB można znaleźć w następujących dokumentach RFC 1155, RFC 1157, RFC 1213, RFC 2578, RFC 4113. 23