# NAT a port forwarding

NAT je záplata na to, že IPv4 adresy došly. Funguje tak dobře, že si na ni všichni zvykli jako na samozřejmost, a pak jsou zmatení, když se s [IPv6](Jak-funguje-IPv6) najednou ztratí.

## Problém

IPv4 má 32 bitů, což je asi 4,3 miliardy adres. Došly někdy kolem roku 2011. Domácností s deseti připojenými zařízeními jsou přitom stovky milionů.

Řešení: vyhradily se rozsahy, které se na internetu nepoužívají a každý si je může doma nasadit, kolikrát chce.

| Rozsah | Velikost | Kde se potkáš |
|---|---|---|
| `10.0.0.0/8` | 16,7 mil. | firmy, VPN |
| `172.16.0.0/12` | 1 mil. | Docker, méně časté |
| `192.168.0.0/16` | 65 tisíc | domácnosti |

K tomu `169.254.0.0/16`, což je adresa, kterou si zařízení přidělí samo, když nedostane odpověď od DHCP. Když ji vidíš, znamená to „DHCP nefunguje".

## Jak NAT funguje

Router má jednu veřejnou adresu a za sebou třeba dvacet zařízení. Když jedno z nich pošle paket ven, router přepíše zdrojovou adresu na svoji vlastní a poznamená si to.

Klíčová finta je v tom, že si zároveň mění i **zdrojový port**. Bez toho by nevěděl, komu patří odpověď.

Tabulka v routeru pak vypadá takhle:

| Vnitřní | Vnější | Cíl |
|---|---|---|
| `192.168.1.10:54321` | `85.207.12.34:41001` | `77.75.79.222:443` |
| `192.168.1.20:33445` | `85.207.12.34:41002` | `77.75.79.222:443` |

Když přijde odpověď na port `41001`, router se podívá do tabulky, zjistí, komu patří, přepíše adresu zpátky a doručí. Přesně proto je NAT technicky vzato NAPT, tedy překlad adres *i portů*.

Podrobný průchod paketu je v [cestě paketu](Cesta-paketu).

## Proč tě zvenku nikdo nevidí

Ta tabulka se plní **jen odchozími** spojeními. Když někdo zvenku pošle paket na tvou veřejnou adresu, router se podívá do tabulky, nic nenajde a paket zahodí. Nemá komu ho dát.

To je celý důvod, proč tvoje zařízení nejsou z internetu dostupná. Není to bezpečnostní rozhodnutí, je to vedlejší efekt toho, že router nemá jak uhodnout, komu paket patří.

## Port forwarding

Port forwarding je ruční předvyplnění té tabulky. Řekneš routeru: cokoliv, co přijde na port 443, posílej na `192.168.1.10`, i když si to nikdo nevyžádal.

Nastavuje se to skoro všude stejně:

- vnější port (na kterém posloucháš z internetu)
- vnitřní IP adresa
- vnitřní port (může se lišit od vnějšího)
- protokol (TCP, UDP nebo obojí)

### Praktické poznámky

**Vnitřní zařízení musí mít stabilní adresu.** Udělej [DHCP rezervaci](DHCP-a-DNS). Bez ní ti to přestane fungovat, jakmile se něco restartuje ve špatném pořadí.

**Nevystavuj ven, co nemusíš.** Každý otevřený port je něco, co musíš aktualizovat a hlídat. SMB (445), RDP (3389) a databázové porty se ven nevystavují nikdy. Pro tyhle věci použij [VPN](WireGuard).

**Vnější port nemusí být stejný.** Přesun SSH z 22 na nějaké vysoké číslo neposkytuje skutečnou bezpečnost, ale radikálně zmenší množství pokusů v logu.

**Ověř si to zvenku.** Test z domácí sítě ti nic neřekne — mnoho routerů neumí správně obsloužit přístup na vlastní veřejnou adresu zevnitř (tomu se říká hairpin NAT nebo NAT loopback). Použij mobil na datech.

## UPnP

UPnP umožňuje aplikacím vytvářet si port forwarding samy, bez ptaní. Konzole a hry ho používají rády.

Bezpečnostně je to nešťastné: jakýkoliv software u tebe v síti, včetně malwaru, si může sám otevřít cestu z internetu dovnitř. Bez tvého vědomí a bez záznamu.

Doporučení je vypnout ho a v případě potřeby udělat pravidla ručně. Pokud ho necháš zapnuté kvůli hraní, minimálně ho omez jen na [VLANu](VLANy), kde jsou konzole.

## Dvojitý NAT

Když máš router poskytovatele a za ním svůj vlastní, provoz prochází NATem dvakrát. Port forwarding pak musíš nastavit na obou, jinak nefunguje.

Poznáš to snadno: veřejná adresa, kterou vidíš na `ifconfig.co`, se liší od té, kterou má tvůj router na WAN rozhraní.

Řešení je přepnout krabici poskytovatele do režimu **bridge**, čímž z ní uděláš hloupý modem a NAT dělá jen tvůj router.

## CGNAT

Horší varianta téhož. Poskytovatel ti nedá veřejnou adresu vůbec — dostaneš adresu z rozsahu `100.64.0.0/10` a NAT probíhá až u něj, sdílený s dalšími stovkami zákazníků.

Port forwarding v takové situaci nefunguje a fungovat nemůže. Nemáš vlastní veřejnou adresu, na které bys mohl poslouchat.

Co s tím, je v [poskytovatel, CGNAT a veřejná IP](Poskytovatel-CGNAT-a-verejna-IP).

## NAT není firewall

Tohle stojí za zdůraznění, protože je to nejrozšířenější omyl v domácích sítích.

NAT se chová ochranně jako vedlejší efekt, ale nikdo ho tak nenavrhoval a spoléhat se na něj je chyba. Nechrání tě proti ničemu, co vzniklo zevnitř — a to jsou dnes prakticky všechny útoky. Malware ve tvé síti si spojení ven naváže sám a NAT mu v tom ochotně pomůže.

Skutečnou ochranu dělá [firewall](Firewall-a-zony). V IPv4 je schovaný za NATem a nevidíš ho. V IPv6 NAT není a firewall je vidět. Není to tím, že by IPv6 bylo méně bezpečné — jen je poctivější.
