Domácí server za CGNAT: jak jsem weby zpřístupnil přes IPv6 a Cloudflare a zabezpečil MikroTik

Bez veřejné IPv4 adresy se server doma klasicky provozovat nedá. Moje weby přesto běží doma a jsou dostupné pro všechny návštěvníky. Popisuji, jak funguje kombinace IPv6 a Cloudflare a jakou bezpečnostní díru jsem cestou našel na routeru.

Co je CGNAT a proč vadí

Veřejných IPv4 adres je málo, proto je poskytovatelé šetří. Místo veřejné adresy dostane zákazník privátní a sítí se do internetu dostává přes společný překlad adres u poskytovatele (Carrier-Grade NAT). Ven se připojíte bez problému, ale zvenčí se k vám nikdo nedostane. Nastavit na routeru přesměrování portů nemá smysl, protože router sám veřejnou adresu nemá.

IPv6 jako cesta ven, Cloudflare jako most

S IPv6 je to jinak. Poskytovatel mi přiděluje veřejný rozsah adres a každé zařízení v síti může mít vlastní veřejnou adresu. Server proto dostal pevnou IPv6 adresu. Problém je na straně návštěvníků: velká část z nich IPv6 stále nemá a na server by se nedostala.

Tady pomáhá Cloudflare v bezplatném tarifu:

  1. V DNS má doména jen záznam AAAA (IPv6 adresu serveru) se zapnutou proxy (oranžový mráček).
  2. Návštěvníkům Cloudflare vrací své vlastní adresy, IPv4 i IPv6.
  3. Návštěvník se připojí ke Cloudflare, ten požadavek předá mému serveru přes IPv6.

IPv6 adresa serveru se navíc nikde neukazuje. Veřejné DNS vrací jen adresy Cloudflare.

Šifrování: Full (strict)

V Cloudflare je nastavený režim SSL/TLS Full (strict). Spojení je šifrované od návštěvníka ke Cloudflare i od Cloudflare k mému serveru a Cloudflare ověřuje platnost certifikátu serveru. Server používá certifikáty Let's Encrypt. Jejich automatická obnova funguje i za proxy, protože Cloudflare ověřovací požadavek přes HTTP předá serveru.

Bezpečnostní díra: IPv6 bez firewallu

NAT u IPv4 funguje jako vedlejší ochrana: zařízení doma nejsou zvenčí vidět. U IPv6 tahle ochrana není, každé zařízení má veřejnou adresu. Při přípravě serveru jsem zjistil, že router neměl pro IPv6 žádná pravidla pro provoz do sítě. Celá domácí síť byla přes IPv6 dostupná z internetu: počítače, tiskárny, správa serveru. Pokud máte doma IPv6, stojí za to to zkontrolovat.

Firewall na MikroTiku

Na routeru MikroTik s RouterOS 7 jsem nastavil pravidla pro provoz směrem do sítě (chain forward) v tomto pořadí:

  1. Povolit navázaná a související spojení.
  2. Zahodit neplatné pakety.
  3. Povolit ICMPv6 (IPv6 bez něj nefunguje správně).
  4. Povolit vše, co jde z domácí sítě ven.
  5. Povolit TCP 80 a 443 na webový server, jen z adres Cloudflare.
  6. Zahodit vše ostatní z internetu.

Adresy Cloudflare jsou veřejně zveřejněné na cloudflare.com/ips. Na routeru jsou v seznamu adres a pravidlo pro web server ho používá jako podmínku:

/ipv6 firewall address-list
add list=cloudflare address=2400:cb00::/32
add list=cloudflare address=2606:4700::/32
add list=cloudflare address=2803:f800::/32
add list=cloudflare address=2405:b500::/32
add list=cloudflare address=2405:8100::/32
add list=cloudflare address=2a06:98c0::/29
add list=cloudflare address=2c0f:f248::/32

Výsledek: server odpovídá jen Cloudflare. Přímý přístup na jeho IPv6 adresu, třeba skenery nebo útočníky obcházející ochranu Cloudflare, router zahodí. Odchozí spojení z domácí sítě, včetně VPN do práce, fungují beze změny.

Co si z toho odnést

  • CGNAT není konec. S IPv6 a Cloudflare jde provozovat veřejný web doma bez veřejné IPv4 a bez poplatků.
  • IPv6 vyžaduje vlastní firewall. Pravidla pro IPv4 ho nechrání.
  • Server za Cloudflare by měl přijímat provoz jen od Cloudflare, jinak jde ochrana obejít.

Zpět na přehled celého projektu: Migrace pěti webů z VPS na vlastní server.