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-sk
»
transportu
bio-sk:transportu
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== Warstwa transportowa ====== Warstwa **sieci** zapewnia komunikację między dowolnymi **urządzeniami**. \\ Odpowiednie pole pakietu IP wskazuje jaki protokół warstwy transportowej jest używany. 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 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, DCCP, MPTCP</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. === Klient-serwer === Programy sieciowe zwykle 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). \\ <small>Program może jednocześnie pełnić rolę serwera i klienta.</small> 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. === 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''. === Zakresy numerów portów === Zakres numerów portów jest podzielony na porty [[https://tools.ietf.org/html/rfc6335#section-8.1.2|[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. * ''netstat {|-a|-l} [-t] [-u] [-p] [-n]'' (np. ''netstat -atupn'') * ''ss {|-a|-l} [-t] [-u] [-p] [-n]'' (np. ''ss -atupn'')<html><span style="font-size:80%; line-height: 100%;"><pre style="margin-bottom:0"> 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 Więcej: netstat -h / ss -h </pre></span></html> * ''/proc/net/(tcp|udp|…)'' (np. ''cat /proc/net/tcp'') <html><pre> # 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> ====== Testowanie łączności na warstwie aplikacji ====== ===== 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'' | Zamiast ''STDIO'' można podać ''-'' (dodatkowo w większości dystrybucji można też skorzystać z ''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> ====== Powyżej warstwy transportowej ====== Rola systemu operacyjnego kończy się na zapewnieniu łączności między procesami na wskazanych urządzeniach – na warstwie transportowej. Cała reszta jest w rękach twórcy programu. ===== Połączenia szyfrowane ===== Powszechnie do zapewnienia poufności i integralności komunikacji używa się [[https://en.wikipedia.org/wiki/Transport_Layer_Security|protokołów (D)TLS]]. ==== Testowanie szyfrowanych połączeń z opessl ==== Narzędzie ''openssl'' dostarczane z biblioteką [[https://openssl.org/|OpenSSL]] pozwala testować połączenia szyfrowane. W najprostszej wersji nawiązanie połączenia TLS odbywa się komendą: \\ ''openssl s_client <host>:<port>'' <small> Do uruchomienia serwera potrzeby jest klucz prywatny i certyfikat (klucz publiczny z podpisem zaufanego urzędu certyfikacji). \\ Na podstawie certyfikatu otrzymanego od serwera klient sprawdza czy ufa serwerowi; jeżeli klient nie zna podpisującego certyfikat, serwer uzna za niezaufany. \\ Do wygenerowania dla ćwiczeń klucza prywatnego i certyfikatu możesz użyć komendy: \\ ''openssl req -x509 -newkey rsa:1024 -days 1 -nodes -keyout key.pem -out cert.pem'' \\ W najprostszej wersji stworzenie serwera odbywa się komendą: \\ ''openssl s_server -key key.pem -cert cert.pem -accept <port>'' </small> ==== Testowanie szyfrowanych połączeń z socat ==== Program ''socat'' również pozwala na nawiązanie połączeń z użyciem TLS. W najprostszej wersji nawiązanie połączenia TLS odbywa się komendą: \\ ''socat openssl:<host>:<port> STDIO'' \\ lub, bez sprawdzania poprawności certyfikatu: ''socat openssl:<host>:<port>,verify=0 STDIO'' <small> W najprostszej wersji stworzenie serwera odbywa się komendą: \\ ''socat openssl-listen:<port>,key=key.pem,cert=cert.pem,verify=0 -'' \\ (W serwerze ''verify=0'' wyłącza wymaganie i sprawdzanie certyfikatu klienta.) </small> ====== Przykładowe aplikacje ====== ===== Zapytania do serwerów stron internetowych ===== Protokół HTTP definiuje różne metody, z których przeglądarki używają głównie GET i POST. Wersje HTTP do 2.0 włącznie używają protokołu tekstowego. W protokole HTTP każde żądanie (i odpowiedź) składa się z linii żądania (statusu) i nagłówków (każdy w osobnej linii), po których następuje pusta linia (''"\r\n\r\n"'') i, jeżeli jest, treść żądania (bądź odpowiedzi). \\ Długość treści żądania/odpowiedzi (jeśli jest obecna) zwykle wskazuje nagłówek ''Content-Length''. === Ręcznie === Treść minimalnego zapytania HTTP w wersji 1.1: <html><div style="margin-top:-1.2em"></div></html> <code> GET / HTTP/1.1 Host: <docelowa nazwa domenowa> </code> <small> Np. żeby pobrać zasób ''%%https://bip.put.poznan.pl/artykuly/status-politechniki-poznanskiej-2020-2024%%'',\\ można połączyć się z szyfrowaniem TLS pod adres ''bip.put.poznan.pl'' i port ''443'' (domyślny dla ''%%https://%%'') i wysłać zapytanie: <html><div style="margin-top:-1.2em; line-height:100%"></div></html> <code> GET /artykuly/status-politechniki-poznanskiej-2020-2024 HTTP/1.0 Host: bip.put.poznan.pl </code> </small> === wget / curl === Narzędzia ''wget'' i ''curl'' pozwalają automatycznie wysłać żądanie HTTP. \\ ''wget'' domyślnie podąża za przekierowaniami i zapisuje odpowiedź do pliku. \\ ''curl'' domyślnie nie podąża za przekierowaniami i wypisuje odpowiedź na standardowe wyjście. \\ Odpowiednimi przełącznikami można zmieniać zachowanie programów, np. ''curl -v <url>'' wyświetli pełną treść wysłanego żądania z nagłówkami pełną odpowiedź (a nie tylko jej treść). ++++ Przykład żądania POST | Do testów, umieść poniższy plik w pustym katalogu i wykonaj z tego katalogu (z roota) komendę ''php -S 0:80'' <small> <html><div style="margin-top:-1.2em;line-height:100%"></div></html> <code php index.html> <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $requestBody = file_get_contents("php://input"); file_put_contents("data.txt", $requestBody . "\n", FILE_APPEND); header('Location: ' . $_SERVER['REQUEST_URI']); } else echo htmlspecialchars(file_get_contents("data.txt")); ?> </code> </small> Przykład minimalnego żądania <small>(bez wskazania przez nagłówek ''Content-Type'' jakiego typu dane są wysyłane)</small>: <code> POST / HTTP/1.1 Host: localhost Content-length: 12 Hello world! </code> Przykładowa komenda ''curl'' do wysłania żądania POST: \\ ''curl --verbose --data "Hello curl!" %%http://localhost%%'' Przykładowe komendy ''wget'' do wysłania żądania POST: \\ ''wget -SqO - --post-data "Hello wget!" %%http://localhost%%'' \\ ''wget -dqO - --post-data "Hello wget!" %%http://localhost%%'' ++++ ===== [ekstra] Rozmowa z serwerem pocztowym ===== Poglądowe minimalistyczne komendy i komunikaty potrzebne do wysłania i odebrania wiadomości e-mail. === SMTP – wysyłanie maili === Komendy do połączenia z serwerem SMTP (do wyboru): <html><div style="margin-top:-1.2em"></div></html> <code> socat tcp:<adres_serwera>:25,crlf stdio openssl s_client -crlf -starttls smtp <adres_serwera>:25 openssl s_client -crlf <adres_serwera>:465 </code> Kolejne linie potrzebne do wysłania maila: <html><div style="margin-top:-1.2em"></div></html> <code> helo <twoja nazwa domenowa> mail from: <nadawca> rcpt to: <odbiorca> data Date: <data we właściwym formacie - wykonaj komendę 'date --rfc-email'> From: <nadawca> To: <odbiorca> Subject: <temat> <tresc> . quit </code> <html><div style="margin-top:-1.2em"></div></html> Dodanie poniższych linii po ''helo'' (bądź ''ehlo'') uwierzytelni użytkownika: <html><div style="margin-top:-1.2em"></div></html> <code> auth plain <wynik komendy 'printf "\0<użytkownik>\0<hasło>" | base64'> </code> === IMAP – odbieranie maili === Komendy do szyfrowanego połączenia z serwerem IMAP (do wyboru): <html><div style="margin-top:-1.2em"></div></html> <code> openssl s_client -crlf -starttls imap <adres_serwera>:143 openssl s_client -crlf <adres_serwera>:993 </code> Kolejne linie do pobrania (kawałka) maila: <html><div style="margin-top:-1.2em"></div></html> <code> A login <użytkownik> <hasło> B select inbox C search unseen D fetch <id> BODY.PEEK[HEADER.FIELDS (SUBJECT DATE FROM)] QUIT </code>
bio-sk/transportu.txt
· ostatnio zmienione: 2024/11/05 10:24 przez
jkonczak
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Złóż / rozłóż wszystko
Do góry