TakéSíťový port, Port number, Číslo portuZákladní

Definice

Port je šestnáctibitové číslo v hlavičce TCP nebo UDP, které na jednom počítači rozlišuje jednotlivé síťové služby a spojení. IP adresa doručí paket ke stroji, port určí, kterému procesu ho operační systém předá. Rozsah je 0 až 65535, přičemž známé služby mají čísla přidělená organizací IANA.

Kategorie: Sítě a protokolyAktualizováno

Nezaměňujte: Ve světě sítí je port číslo transportní vrstvy, v hardwaru fyzický konektor (USB, HDMI) a ve vývoji softwaru „portace“ přenos programu na jinou platformu.

Než se na to spolehnete: Ověřte prosím dostupnost odkazu na dokumentaci Docker networking (URL cesty se u docs.docker.com občas mění) a přesné znění interwiki odkazů na Wikipedii.

<h2>Proč samotná IP adresa nestačí</h2> <p>Jeden server běžně obsluhuje web, e-mail, databázi i SSH současně. <a href="/slovnik/ip-adresa">IP adresa</a> dokáže paket doručit jen k síťovému rozhraní stroje, ale neřekne nic o tom, který z běžících procesů má data zpracovat. Port doplňuje právě tuhle chybějící informaci: je to adresa uvnitř počítače, kterou transportní vrstva zapisuje do hlavičky každého segmentu.</p> <p>Operační systém proto spojení neidentifikuje jedním číslem, ale čtveřicí zdrojová IP, zdrojový port, cílová IP, cílový port. Díky ní může mít prohlížeč otevřených deset paralelních spojení na stejný web: cílový port je pokaždé 443, zdrojový se liší.</p> <h2>Jak se čísla portů dělí</h2> <p>Rozsah 0 až 65535 spravuje IANA a dělí ho do tří pásem.</p> <ul> <li><strong>0 až 1023, systémové (well-known)</strong>: 22 SSH, 25 SMTP, 53 DNS, 80 HTTP, 443 HTTPS. Na unixových systémech na ně smí naslouchat jen proces s odpovídajícím oprávněním, tradičně root.</li> <li><strong>1024 až 49151, registrované</strong>: přiděluje se konkrétním produktům, například 3306 MySQL, 5432 PostgreSQL, 6379 Redis.</li> <li><strong>49152 až 65535, dynamické (ephemeral)</strong>: z nich si jádro bere zdrojové porty pro odchozí spojení. Přesný rozsah se mezi systémy liší.</li> </ul> <p>Čísla TCP a UDP tvoří dvě nezávislé sady. Port 53/UDP a 53/TCP tak patří stejné službě DNS, ale technicky jde o dva různé záznamy.</p> <h3>Naslouchající port versus navázané spojení</h3> <p>Serverový proces si port zabere voláním <code>bind()</code> a <code>listen()</code>. Když dorazí klient, <a href="/slovnik/tcp">TCP</a> vytvoří nový socket pro dané spojení, zatímco naslouchající socket zůstává volný pro další příchozí požadavky. Proto může jeden port na 443 obsluhovat tisíce souběžných klientů.</p> <h3>Kdo porty ve skutečnosti překládá</h3> <p>Mezi klientem a serverem bývá NAT router, firewall, kontejnerový engine i <a href="/slovnik/load-balancer">load balancer</a>. Každý z nich může port přepsat. Docker mapuje <code>-p 8080:80</code>, takže aplikace uvnitř kontejneru vidí 80, ale zvenčí se na ni saháte přes 8080. Při ladění nedostupné služby je proto nutné vědět, na kterém článku řetězu se port mění.</p> <h2>Bezpečnostní rozměr otevřeného portu</h2> <p>Každý port dostupný z internetu je vstupní bod, který někdo dřív nebo později skenuje. Praktické minimum je naslouchat jen na potřebných portech, ostatní držet za firewallem a databáze i administrační rozhraní vázat na <code>127.0.0.1</code> místo <code>0.0.0.0</code>. Přesun služby na nestandardní číslo (SSH z 22 na 2222) sníží šum v logu z automatických skenů, ale sám o sobě není bezpečnostní opatření: cílený sken najde otevřený port bez ohledu na jeho číslo.</p>

Příklady z praxe

  1. Databáze vázaná na localhost místo na všechna rozhraní

    PostgreSQL po instalaci naslouchá na portu 5432. Pokud v konfiguraci zůstane naslouchání na všech rozhraních a port není zavřený firewallem, je databáze dostupná z internetu a během hodin ji najdou automatické skenery. Bezpečná výchozí volba je vázat službu jen na smyčkové rozhraní a ke vzdálenému přístupu použít SSH tunel.

    # nedostupné zvenčí
    listen_addresses = 'localhost'
    port = 5432
    
    # ověření, na čem služba skutečně visí
    ss -ltnp | grep 5432
  2. Kolize portů při lokálním vývoji

    Vývojář spustí Next.js na portu 3000 a v jiném terminálu druhý projekt. Druhý proces skončí chybou EADDRINUSE, protože port už drží první aplikace. Řešením je buď najít a ukončit původní proces, nebo druhé aplikaci předat jiné číslo portu.

    $ npm run dev
    Error: listen EADDRINUSE: address already in use :::3000
    
    $ lsof -i :3000        # kdo port drží
    $ PORT=3001 npm run dev # spuštění na jiném portu

Časté omyly

MýtusKdyž přesunu SSH z portu 22 na 2222, jsem v bezpečí před útoky.
Ve skutečnostiZměna portu odfiltruje jen hromadné skeny, které zkoušejí výhradně výchozí čísla. Kompletní sken všech 65535 portů trvá u jednoho hostitele minuty, takže službu odhalí. Skutečnou ochranu dává klíčová autentizace, firewall a omezení zdrojových adres.
MýtusPort 80 a port 8080 jsou totéž, jen se jinak píše.
Ve skutečnostiPort 8080 je běžná konvence pro vývojové a proxy servery, ale prohlížeč ho nikdy nepoužije automaticky. Bez explicitního zápisu v URL prohlížeč u HTTP zkouší 80 a u HTTPS 443.
MýtusServer zvládne nejvýš 65535 souběžných spojení, protože tolik je portů.
Ve skutečnostiLimit se týká zdrojových portů jednoho klienta vůči jedné cílové dvojici, ne serveru. Server rozlišuje spojení čtveřicí adres a portů, takže na jediném naslouchajícím portu obslouží řádově statisíce klientů; strop určuje paměť a nastavení jádra.

Časté dotazy

Jak zjistím, který proces mi drží obsazený port?
Obsazený port odhalí nástroje pracující se seznamem socketů. Na Linuxu poslouží ss -ltnp nebo lsof -i :3000, na macOS lsof -i :3000, na Windows netstat -ano | findstr :3000 a následné dohledání PID ve Správci úloh. Výstup ukáže jméno procesu i jeho identifikátor, takže ho lze cíleně ukončit. Pokud příkaz nevypíše jméno programu, chybí obvykle oprávnění a je potřeba ho spustit pod administrátorem nebo přes sudo.
Proč nemůže běžný uživatel naslouchat na portu 80?
Porty pod číslem 1024 označuje unixová konvence jako privilegované a jádro na ně pouští jen proces s příslušným oprávněním, historicky root. Důvodem je, aby si nikdo bez správcovských práv nemohl podvrhnout systémovou službu, například falešný webový nebo poštovní server. V praxi se to obchází třemi cestami: aplikace běží na vyšším portu za reverzní proxy, dostane capability CAP_NET_BIND_SERVICE, nebo se provoz přesměruje pravidlem ve firewallu.
Používá port i UDP, nebo jen TCP?
Porty používá TCP i UDP, obojí je má v hlavičce jako šestnáctibitové pole. Číselné prostory jsou přitom oddělené, takže port 5000/TCP a 5000/UDP mohou patřit dvěma nezávislým službám. IANA většinou přiděluje obě varianty jedné službě zároveň, i když ta reálně využívá jen jednu. Porty najdete také u novějších protokolů postavených nad UDP, například u QUIC, který standardně jezdí na portu 443.
Co znamená port forwarding na domácím routeru?
Port forwarding je pravidlo v NAT routeru, které říká, že příchozí spojení na určitý port veřejné adresy se má přeposlat na konkrétní privátní adresu a port v lokální síti. Bez něj router příchozí spojení zahodí, protože neví, komu patří. Typicky se používá pro zpřístupnění herního serveru nebo NAS zvenčí. Otevřením portu se ale daná služba vystavuje celému internetu, takže je vhodnější VPN nebo tunel.
Proč se v URL někdy píše dvojtečka a číslo, například https://example.com:8443?
Zápis s dvojtečkou určuje port explicitně a přebíjí výchozí hodnotu podle schématu. Prohlížeč použije u http port 80 a u https port 443, takže je při standardním nastavení zbytečné číslo uvádět. Jakmile služba běží jinde, například vývojový server na 3000 nebo administrace na 8443, musí být port v adrese uveden, jinak se spojení nenaváže. Ve výsledných odkazech se proto nestandardní port vždy objeví.

Zdroje

  1. Service Name and Transport Protocol Port Number Registry(otevře se v novém okně)IANA
  2. RFC 9293: Transmission Control Protocol (TCP)(otevře se v novém okně)RFC Editor, 2022
  3. RFC 768: User Datagram Protocol(otevře se v novém okně)RFC Editor, 1980
  4. Networking overview(otevře se v novém okně)Docker

Související pojmy

Potřebujete to vyřešit v praxi?

Poradíme, jak na to ve vašem projektu

Vysvětlit pojem je jedna věc, navrhnout kolem něj funkční řešení druhá. Ozvěte se a probereme, co dává smysl u vás.