przejście do zawartości
Jan Kończak
Narzędzia użytkownika
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Ostatnie zmiany
Menadżer multimediów
Indeks
Jesteś tutaj:
start
»
bio-psiec
»
netcat_netstat
bio-psiec:netcat_netstat
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
===== Klient-serwer ===== Programy sieciowe mogą pełnić rolę serwera lub klienta. Serwer to program który czeka (nasłuchuje) na nowe połączenia (lub żądania/wiadomości) od klientów. Klient to program który łączy się do serwera (lub wysyła do niego żądania/wiadomości). Program może jednocześnie pełnić rolę serwera i klienta. \\ <small>Program używający połączeń może naraz czekać na połączenia od klientów i samemu nawiązywać połączenia do innych serwerów, jednak w każdym z połączeń program pełni rolę albo serwera, albo klienta.</small> ===== Warstwa transportowa ===== Warstwa **sieci** zapewnia komunikację między dowolnymi **urządzeniami**. Warstwa **transportowa** zapewnia komunikację między **procesami** działającymi na wskazanych urządzeniach. Protokoły warstwy transportowej mogą: * tworzyć połączenia albo przesyłać datagramy <small>(porównaj z połączeniami telefonicznymi i wiadomościami SMS)</small> * przesyłać dane jako strumień bajtów albo jako wiadomości * gwarantować (lub nie) odebranie danych w tej samej kolejności w jakiej były nadane * zapewniać że dane dotrą, a w razie gdyby jakiś pakiet nie dotarł, automatycznie wysłać go ponownie * dostosowywać prędkość wysyłania do możliwości łącza Odpowiednie pole pakietu IP wskazuje jaki protokół warstwy transportowej jest używany. W internecie używa się głównie protokołów TCP i UDP. \\ <small>Poza TCP i UDP jest w użyciu jeszcze kilka protokołów warstwy transportu, np. SCTP, UDP-Lite, DCCP, MPTCP. <html><span title="Jakkolwiek głupie może się to wydawać, tak działają niektóre firmy."> Są one jednak sporadycznie używane, co wynika z braku wsparcia ich przez system MS Windows, wynikającego z ich sporadycznego użycia.</span></html></small> ==== Adresacja na warstwie transportowej ==== Protokoły warstwy transportowej spójnie używają 16-bitowej liczby jako adres. \\ Adres warstwy transportowej nazywa się **numerem portu**. System operacyjny po otrzymaniu wiadomości biorąc pod uwagę: * adresu warstwy sieci (np. IP) źródłowy (zdalny), * adresu warstwy sieci (np. IP) docelowy (lokalny), * użyty protokół warstwy transportowej, * adresu warstwy transportowej (np. port) źródłowy (zdalny), * adresu warstwy transportowej (np. port) docelowy (lokalny), <html><div style="margin-top:-1.4em"></div></html> sprawdza: * czy wiadomość należy do już istniejącego połączenia (i wtedy dostarcza dane do tego połączenia), a jeśli nie, to * czy jakiś program czeka na nowe połączenie / wiadomości pod docelowym adresem IP i docelowym portem użytego protokołu warstwy transportowej. Programy pełniące rolę serwera muszą wskazać użyty protokół warstwy transportu i poinformować system operacyjny na jakich adresach IP i numerach portów oczekują połączeń/wiadomości. Program który chce połączyć lub wysłać wiadomość musi podać jaki protokół warstwy transportu ma zostać użyty i podać docelowy adres IP i docelowy numer portu dla połączenia/wiadomości. \\ <small>Program może też wskazać z jakiego źródłowego adresu IP i źródłowego numeru portu ma zostać nawiązane połączenie lub wysłana wiadomość. Jeżeli tego nie zrobi, system operacyjny sam je wybierze.</small> ==== Znane numery portów ==== Konkretne numery portów są zwyczajowo używane do adresowania konkretnych programów. \\ <small> Np. port 80 i 443 jest używany przez serwery stron internetowych, a porty 25, 465 lub 587 przez serwery poczty internetowej (e-mail).</small> Lista takich numery portów, wraz z przypisanymi do nich słownymi nazwami i informacją do czego są (albo były w przeszłości) używane [[http://www.iana.org/assignments/service-names-port-numbers|jest utrzymywana]] przez organizację IANA. W Linuksie dodatkowo taka lista jest tradycyjnie dostępna w pliku ''/etc/services''. Zwyczajowo twórcy programów pozwalają użytkownikowi używać nazw portów zamiast ich numerów oraz często wyświetlając informacje o użytych portach wyświetlają nazwy zamiast numerów (o ile dany numer portu ma nazwę). ==== Zakresy numerów portów ==== Zakres numerów portów jest podzielony na porty [[https://tools.ietf.org/html/rfc6335#section-6|[RFC6335]]]: * uprzywilejowane (system / well-known / privileged) – 1÷1023 \\ jako lokalne porty mogą być używane tylko przez uprzywilejowanego użytkownika (root / administrator), * //zarejestrowane//((czy ktoś zna jakieś lepsze tłumaczenie na polski nazwy "user ports" lub "registered ports"?)) (user / registered) – 1024÷<html><small>49151</small></html> \\ mogą zostać zarejestrowane (tzn. przypisane do konkretnego zastosowania w rejestrze utrzymywanym przez IANA), * efemeryczne (dynamic / private / ephemeral) – <html><small>49152</small></html>÷65535 \\ używane kiedy program nie potrzebuje stałego numeru portu (czyli zwykle kiedy program nawiązuje połączenie). <html><div style="margin-top:-1.4em"></div></html> <small>W implementacjach systemów operacyjnych zwykle granica między user ports a ephemeral jest niższa, np. w Linuksie zakres portów efemerycznych można odczytać wykonując jedną z komend: ''sysctl net.ipv4.ip_local_port_range'' / ''cat /proc/sys/net/ipv4/ip_local_port_range''</small>. ===== Monitorowanie bieżących połączeń ===== Polecenia ''netstat'' i ''ss'' wyświetlają listę połączeń (nie tylko sieciowych) których stroną jest ten komputer oraz (po podaniu odpowiedniej opcji) informacje na jakich adresach IP i portach programy na tym komputerze czekają na połączenia bądź wiadomości. \\ Pliki ''/proc/net/(tcp|udp|…)'' zawierają informacje o połączeniach w formacie przystępnym dla maszynowego przetwarzania. <html><pre style="line-height:100%; margin-bottom:0"> Wybrane przełączniki dla netstat / ss: ┌ (domyślnie) tylko już nawiązane połączenia │ -l nasłuchujące porty (programy czekające aż ktoś do nich się połączy) └ -a nasłuchujące porty + nawiązane połączenia ┌ (domyślnie) wszystkie wspierane protokoły sieciowe │ -t połączenia protokołu TCP └ -u połączenia protokołu UDP ┌ -4 wybiera IPv4 └ -6 wybiera IPv6 -p nazwa i pid programu do którego należy połączenie -n pokazywanie wszystkich wartości numerycznie, np. '22' zamiast 'ssh' -W [tylko netstat] wyłącza przycinanie adresów IP / nazw domenowych do szerokości kolumny </pre></html> Dodatkowo ''ss'' pozwala filtrować wyniki między innymi po adresach ip (''src'' i ''dst'') oraz numerach portów (''sport'' i ''dport''), np: \\ ''ss -t dport 443'' ''ss -aut src 127.0.0.1 or src 150.254.0.0/24'' \\ Więcej opcji znajdziesz w pomocy wbudowanej (''netstat -h'' / ''ss -h'') i podręczniku systemowym (''man netstat'' / ''man ss''). Przykładowy wynik polecenia ''netstat'': <html><div style="margin-top:-1.4em"></div></html> <html><pre style="line-height:100%;"> # netstat -atunp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name <span title="Program nasłuchujący na porcie 22 (porcie serwera SSH) na nowe połączenia TCP" style="background-color:rgba(0,255,0,0.2)">tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 13830/sshd</span> tcp 0 0 <span title="Program nasłuchujący na IP 0.0.0.0 odbierze połączenia kierowane na dowolny adres IP tego komputera" style="background-color:rgba(255,0,255,0.2)">0.0.0.0</span>:25 0.0.0.0:* LISTEN <span title="PID i nazwa programu do którego należy połączenie" style="background-color:rgba(0,0,0,0.2)">28693/exim4</span> tcp 0 0 <span title="Program nasłuchujący na IP 127.0.0.1 odbierze połączenia kierowane **tylko** na adres 127.0.0.1" style="background-color:rgba(255,0,255,0.2)">127.0.0.1</span>:631 0.0.0.0:* LISTEN 26745/cupsd <span title="Nawiązane połączenie TCP" style="background-color:rgba(0,0,255,0.15)">tcp 0 780 10.0.1.1:22 150.254.33.66:38126 ESTABLISHED 19424/sshd: usernam</span> tcp 0 0 <span title="Adres lokalny: jedno z IP tego komutera i port 38596 (efemeryczny – najpewniej wylosowany przez system operacyjny przed nawiązywaniem połączenia)" style="background-color:rgba(255,0,255,0.2)">10.0.1.1:38596</span> <span title="Adres zdalny: IP 150.254.30.199 i port https" style="background-color:rgba(255,0,255,0.2)">150.254.30.199:443</span> ESTABLISHED 19481/weechat <span title="tcp6 oznacza IPv6 i TCP – program nasłuchuje na dowolnym adresie (czyli ::)" style="background-color:rgba(0,255,0,0.2)">tcp6 0 0 :::22 :::* LISTEN 13830/sshd</span> <span title="połączenie UDP – może być zarówno klientem jak i serwerem" style="background-color:rgba(255,255,0,0.3)">udp 0 0 0.0.0.0:68 0.0.0.0:* 14541/dhclient</span> udp 0 0 10.0.1.1:53 0.0.0.0:* 22173/named <span title="przykład programu który jest klientem UDP" style="background-color:rgba(0,255,255,0.3)">udp 768 0 0.0.0.0:35722 0.0.0.0:* 21533/snmpwalk</span> </pre></html> ==== Zadania ==== ~~Zadanie.#~~ Wyświetl wszystkie połączenia na swoim komputerze. ~~Zadanie.#~~ Wejdź w przeglądarce na stronę //%%put.poznan.pl%%// i jednocześnie wyświetl wszystkie połączenia na swoim komputerze. Jakie nowe połączenia się pojawiły? ~~Zadanie.#~~ Uruchom w terminalu polecenie ''ss -E'' (lub ''ss -nE''), a następnie wejdź w przeglądarce na wybraną wcześniej nie odwiedzaną stronę. Z jakich numerów portów korzysta wyświetlna przez ''ss'' aktywność sieciowa? ~~Zadanie.#~~ Jakie programy czekają na połączenia/wiadomości na twoim komputerze? Sprawdź czy wykonując polecenie ''netstat'' / ''ss'' z roota zamiast zwykłego użytkownika wyświetlane jest więcej informacji na ten temat. ===== Testowanie łączności ===== ==== netcat ==== ''[[https://en.wikipedia.org/wiki/Netcat|netcat]]'' (czasami dostępny jako ''nc'') to szeroko rozpowszechnione narzędzie potrafiące nawiązać proste połączenia sieciowe bądź stworzyć prosty serwer (używając protokołu TCP bądź UDP). \\ <small> Uwaga: netcat ma wiele wersji różniących się możliwościami, przełącznikami i zachowaniem! </small> ^ ^ Serwer ^ Klient ^ | TCP|''nc -l -p //12345//'' |''nc //10.0.0.1// //12345//'' | | UDP|''nc -u -l -p //12345//'' |''nc -u //10.0.0.1// //12345//'' | ==== socat ==== ''[[http://www.dest-unreach.org/socat/|socat]]'' to rozbudowany i wciąż rozwijany program pozwalający testować rozmaite "połączenia" sieciowe. **''socat'' zawsze przyjmuje dwie opcje** – dwa "strumienie" które ze sobą połączy, np. standardowe wejście/wyjście z połączeniem sieciowym. \\ <small>Można też łączyć np. jedno połączenie sieciowe z drugim, czy połączenie sieciowe z programem.</small> ^ ^ Serwer ^ Klient ^ | TCP|''socat TCP-LISTEN:12345 STDIO'' |''socat STDIO TCP:10.0.0.1:12345'' | | UDP (pseudo-połączeniowe)|''socat UDP-LISTEN:12345 STDIO'' |''socat STDIO UDP:10.0.0.1:12345'' | | UDP (zorientowane na wiadomość)|''socat UDP-RECV:12345 STDIO'' |''socat STDIO UDP-SENDTO:10.0.0.1:12345'' | | ::: | <html><code>socat UDP-DATAGRAM:<span title="Adres na który będą wysłane wiadomości" style="background-color:rgba(255,255,0,0.3)">10.0.0.1:12345</span>,bind=<span title="Adres na którym program będzie czekać na wiadomości" style="background-color:rgba(0,255,0,0.2)">0.0.0.0:12345</span> STDIO</code></html> || ''STDIO'' (zamiennie ''**-**'') oznacza standardowe wejście/wyjście. Dodatkowo w większości dystrybucji można też skorzystać z ''readline'' opakowującej standardowe wejście/wyjście w wygodną bibliotekę [[https://en.wikipedia.org/wiki/GNU_Readline|readline]]. \\ <small>Socat nie rozróżnia wielkości liter, pozwala na skróty – np. ''udp-l'' jako ''udp-listen'' czy ''tcp'' jako ''tcp-connect'' \\ Adresy IPv6 podaje się w nawiasach kwadratowych, np. [::1] </small> ==== Zadania ==== ~~Zadanie.#~~ Uruchom serwer TCP używając programu ''nc'' lub ''socat'' i nie wyłączając go przejdź do kolejnych zadań. ~~Zadanie.#~~ Uruchom (w nowej konsoli) program ''netstat'' lub ''ss'' z opcjami które pozwolą tobie zobaczyć informację o serwerze z poprzedniego zadania. Wśród informacji ma pojawić się identyfikator procesu (//pid//) serwera. ~~Zadanie.#~~ Poproś osobę siedzącą obok o podłączenie się do twojego serwera, następnie wyślijcie do siebie nawzajem kilka linii tekstu. Nie zamykajcie jeszcze połączenia. ~~Zadanie.#~~ Ponownie uruchom program ''netstat'' lub ''ss'' tak żeby zobaczyć informację o nawiązanym połączeniu. Jakie numery portów są wykorzystywane? ~~Zadanie.#~~ Czy możesz podłączyć dwóch klientów do jednego serwera TCP uruchomionego poleceniami podanymi wcześniej w materiałach? \\ Uruchom na wybranym porcie serwer TCP komedną: <html><span style="user-select: all;"></html>''socat -dd tcp-listen:1500**,fork** shell:%%'stdbuf -o0 tr a-z A-Z'%%''<html></span></html> i poproś dwie osoby o podłączenie się do niego. Następnie wyświetl programem ''netstat'' lub ''ss'' informacje o tych połączeniach tak, żeby było widać //pid// procesu używającego połączenia. Co obserwujesz? ~~Zadanie.#~~ Uruchom serwer TCP na wybranym (innym niż w poprzednich zadaniach) porcie w jednym terminalu używając programu ''socat'', a następnie nie wyłączając go spróbuj uruchomić w drugim terminalu kolejny serwer TCP programem ''socat'' na tym samym porcie. Jaki komunikat dostajesz? ~~Zadanie.#~~ Spróbuj uruchomić jako zwykły użytkownik serwer TCP na porcie z zakresu portów systemowych. Jaki komunikat błędu jest wyświetlany? ~~Zadanie.#~~ Uruchom jako superużytkownik (''root'') serwer TCP używając programu ''nc'' lub ''socat'' na porcie 80 i podłącz się do niego z przeglądarki internetowej. Wyślij przeglądarce odpowiedź i zamknij połączenie. ~~Zadanie.#~~ Uruchom serwer UDP w wersji zorientowanej na wiadomość używając programu ''socat'', a następnie w nowej konsoli uruchom program ''netstat'' lub ''ss'' z opcjami które pozwolą tobie zobaczyć informację o tym serwerze. ~~Zadanie.#~~ Poproś dwie osoby siedzące obok o wysłanie wiadomości UDP do tego serwera. Czy widzisz na ekranie wiadomość od obu osób? ~~Zadanie.#~~ Ponownie uruchom program ''netstat'' lub ''ss'' tak żeby zobaczyć informacje o serwerze z poprzedniego zadania. ~~Zadanie.#~~ Uruchom serwer UDP w wersji pseudo-połączeniowej, a następnie wyświetl programem ''netstat'' lub ''ss'' informacje o nim. Czy teraz widać jakąś różnicę w porównaniu do serwera w wersji zorientowanej na wiadomość? ~~Zadanie.#~~ Poproś osobę siedzącą obok o uruchomienie klienta UDP w wersji pseudo-połączeniowej i o wyświetlenie, przed wysłaniem pierwszej wiadomości, informacji o tym kliencie programem ''netstat'' lub ''ss''. Sprawdź czy zmieniło się to jak po stronie serwera ''netstat'' / ''ss'' wyświetla informacje. \\ Następnie poproś osobę siedzącą obok o wysłanie tobie wiadomości i wykonajcie na swoich komputerach komendę ''netstat'' lub ''ss'' wyświetlającą wszystkie aktywności UDP. Czy serwer UDP jest prezentowany identycznie jak przed otrzymaniem pierwszej wiadomości? ~~Zadanie.#~~ Twój komputer ma kilka adresów IPv4. Wyświetl je. Używając komendy ''nc -l //<adres_ip>// //<numer_portu>//'' uruchom serwer TCP na wybranym porcie i jednym z adresów IP twojego komputera, a następnie w nowej konsoli uruchom kolejny serwer TCP używający tego samego numeru portu i innego z adresów IP twojego komputera. Czy udaje się tobie odpalić ten serwer? Dlaczego? Wyświetl programem ''netstat'' lub ''ss'' informacje o serwerach TCP. ~~Zadanie.#~~ Używając poniższych poleceń spróbuj uruchomić w czterech terminalach cztery serwery na tym samym porcie: \\ ''socat tcp-listen://1200// stdio'' ''socat dccp-listen://1200// stdio'' \\ ''socat udp-listen://1200// stdio'' ''socat sctp-listen://1200// stdio'' \\ Następnie używając polecenia ''ss -tudS -anp sport //1200//'' wyświetl informacje o tych serwerach. Dlaczego udaje się tobie uruchomić kilka programów używających tego samego portu? ===== Wybrane elementy protokołów L4 ===== ==== UDP ==== ~~Zadanie.#~~ Uruchom program wireshark i rozpocznij nasłuchiwanie na interfejsie ''br0''. W polu filtrów wpisz ''udp''. Następnie wyślij do osoby siedzącej obok dowolny tekst po UDP. Jakie pakiety widzisz w wiresharku? ~~Zadanie.#~~ Przygotuj w edytorze tekstu jedną linię zwierającą 4000 znaków i wklej ją do terminala w którym pracuje ''nc'' / ''socat'' i wyślij. Czy dane zostały wysłane jako jeden pakiet IP? Czy są pokazywane jako jeden datagram UDP? ==== TCP ==== Nawiązywanie i kończenie połączenia. Przesyłanie potwierdzeń. [[https://upload.wikimedia.org/wikipedia/commons/f/f6/Tcp_state_diagram_fixed_new.svg|Diagram stanów]] ~~Zadanie.#~~ Jaki stan był wskazywany przez ''netstat'' / ''ss'' dla serwerów TCP – programów czekających na przychodzące połączenia? Znajdź ten stan w diagramie stanów. ~~Zadanie.#~~ Uruchom program wireshark i rozpocznij nasłuchiwanie na interfejsie ''br0''. Następnie spróbuj nawiązać połączenie do adresu który nie odpowiada, np. komendą ''nc //198.51.100.2// //1333//''. Sprawdź programem ''netstat'' / ''ss'' w jakim stanie jest to połączenie. Znajdź ten stan w diagramie stanów. W wiresharku w polu filtrów wpisz ''ip.addr == //198.51.100.2//''. Jakie pakiety widzisz? ~~Zadanie.#~~ Poproś osobę siedzącą obok żeby podała tobie swój adres IPv4 z interfejsu ''br0'' i zmień w wiresharku pole filtrów tak żeby zostały wyświetlone pakiety z tym adresem IP. Następnie nawiążcie między sobą połączenie TCP używając programu ''nc'' lub ''socat''. Sprawdź jakie pakiety zostały przesłane. ~~Zadanie.#~~ Prześlij dane przez nawiązane połączenie. Jakie pakiety zostały przesłane? Przygotuj w edytorze tekstu jedną linię zwierającą 4000 znaków i wklej ją do terminala w którym pracuje ''nc'' / ''socat'' i wyślij. Czy dane zostały wysłane jako jeden pakiet IP? Czy są pokazywane jako jeden segment TCP? ~~Zadanie.#~~ Wypnij kabel sieciowy z interfejsu ''em1'' i spróbuj wysłać kolejną linię tekstu. Po kilku sekundach wepnij kabel z powrotem. Zobacz co dzieje się w wiresharku. Czy dane dotarły? ~~Zadanie.#~~ Zamknij połączenie (np. zamykając program przez //Ctrl// + //C//). Jakie pakiety zostały przesłane w wiresharku? Czy programy ''netstat'' / ''ss'' wyświetlają jeszcze informacje o tym połączeniu?
bio-psiec/netcat_netstat.txt
· ostatnio zmienione: 2025/10/30 16:24 przez
jkonczak
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Złóż / rozłóż wszystko
Do góry