markdown
Porty-a-spojeni.md
markdown
# Porty a spojení IP adresa doručí data na správný stroj. Ale na tom stroji běží webserver, SSH, poštovní server a půlka dalších věcí naráz. Jak se pozná, komu ta data patří? Podle **portu**. Je to prosté číslo od 1 do 65535 v hlavičce TCP nebo UDP. ## Co je vlastně „otevřený port" Formulace svádí k představě dveří ve zdi, které se dají otevřít nebo zavřít. Realita je jiná a je užitečné ji znát. Port není nic fyzického ani konfigurovatelného. Je otevřený tehdy, když na něm nějaký program **poslouchá**. Když ten program vypneš, port se zavře sám. Když ho zapneš, otevře se. Firewall pak jen rozhoduje, kdo se na ten port smí dostat. Podívat se, co u tebe poslouchá: ```ss -tulpn # Linuxnetstat -ano # Windowslsof -i -P -n # macOS``` Ten výpis stojí za občasné prolistování. Málokdo tuší, kolik věcí na jeho stroji poslouchá na síti. ## Známé porty | Port | Služba ||---|---|| 22 | SSH || 53 | DNS || 80 | HTTP || 443 | HTTPS || 123 | NTP || 445 | SMB, sdílení souborů Windows || 3389 | RDP, vzdálená plocha || 51820 | WireGuard (zvykové, ne oficiální) | Porty pod 1024 jsou vyhrazené a na Linuxu je smí obsadit jen root. Proto webserver často běží na `8080` a před ním je [reverse proxy](Vzdaleny-pristup) na 443. ## Zdrojový port Když se připojuješ na web, tvůj počítač si vybere náhodné vysoké číslo, třeba `54321`, jako svůj zdrojový port. Spojení je pak jednoznačně určené čtveřicí: ```192.168.1.10:54321 → 77.75.79.222:443``` Tahle čtveřice je důvod, proč můžeš mít otevřených deset záložek na stejný server a odpovědi se nepomíchají. Každá má jiný zdrojový port. Je to taky mechanismus, na kterém stojí [NAT](NAT-a-port-forwarding). ## TCP versus UDP Dva způsoby, jak data doručit. Rozdíl je zásadní a projevuje se na chování aplikací. **TCP** naváže spojení, čísluje pakety, potvrzuje příjem a co se ztratí, pošle znovu. Data dorazí celá a ve správném pořadí, nebo nedorazí vůbec a ty se to dozvíš. Cenou je latence a režie. **UDP** prostě pošle paket a je mu jedno, co se s ním stane. Žádné potvrzování, žádné pořadí, žádné opakování. Cenou je nespolehlivost, výhodou je rychlost a nulová režie. | | TCP | UDP ||---|---|---|| Naváže spojení | ano | ne || Garantuje doručení | ano | ne || Garantuje pořadí | ano | ne || Režie | vyšší | minimální || Typické použití | web, mail, SSH, přenos souborů | DNS, hry, video hovory, VPN | Videohovor s UDP je lepší než s TCP, protože ztracený snímek chceš zapomenout, ne dostat o vteřinu později. U stažení souboru je to naopak. ## Trojcestné podání ruky Než TCP pošle jediný bajt dat, musí se strany dohodnout: ```mermaidsequenceDiagram participant K as Klient participant S as Server K->>S: SYN (chci se spojit) S->>K: SYN-ACK (souhlasím, taky chci) K->>S: ACK (potvrzuji) Note over K,S: spojení stojí, teče provoz``` Tři pakety, tedy jedna a půl cesty tam a zpět, než začne cokoliv užitečného. Proto je latence u TCP tak citelná — při 100 ms odezvě zaplatíš 150 ms jen za navázání, ještě než přijde první bajt. A u HTTPS se na to nabalí ještě TLS handshake. Tohle je taky mechanismus, který vysvětluje chování firewallu. Zablokovaný port se pozná podle toho, co udělá s tvým SYN paketem: - **odmítnutí** (RST) → dostaneš okamžitě „connection refused", port je zavřený a někdo ti to slušně řekl- **zahození** (DROP) → nedostaneš nic a čekáš do timeoutu Většina firewallů zahazuje, protože mlčení neprozrazuje, že tam vůbec něco je. ## Stav spojení Moderní firewall je **stavový**. Pamatuje si otevřená spojení a odpovědi na ně propouští automaticky, aniž bys pro ně musel psát pravidlo. Proto ti stačí povolit odchozí provoz a příchozí odpovědi projdou samy. A proto naopak nefunguje [asymetrické směrování](Smerovani) — odpověď, která přijde jinou cestou, do tabulky nesedí. Stav spojení má ale konečnou platnost. Když je spojení dlouho tiché, firewall nebo NAT ho z tabulky vyhodí. Tím se vysvětluje klasický jev, kdy SSH session po půl hodině nečinnosti zamrzne. Řeší se to keepalive paketem — u SSH `ServerAliveInterval 60`, u [WireGuardu](WireGuard) `PersistentKeepalive = 25`. ## Skenování portů Když chceš zjistit, co je na nějakém stroji otevřené, použij `nmap`: ```nmap -Pn 192.168.1.10 # rychlá kontrola běžných portůnmap -p- 192.168.1.10 # všech 65535 portů, trvá tonmap -sV -p 443 example.com # co konkrétně na tom portu běží``` Na vlastní síti je to legitimní a užitečné. Na cizí síti to bez svolení nedělej — v mnoha jurisdikcích je to přinejmenším sporné a rozhodně si toho někdo všimne. Užitečný zvyk: po každé změně na [firewallu](Firewall-a-zony) si zvenku ověř, co je vidět. Nejjednodušší je pustit nmap z mobilu na datech.