Přejít k obsahu
Pošta Kabinet Vybrat tarif

IPv6 pro web: co přináší, co se rozbije a kontrolní seznam

IPv6 pro web: co přináší, co se rozbije a kontrolní seznam

Web funguje přes IPv6, když platí čtyři věci: v DNS je záznam AAAA, webový server naslouchá na adrese IPv6, firewall propouští porty 80 a 443 i pro IPv6 a certifikát se servíruje také přes IPv6. Polovina uživatelů Googlu už přichází přes IPv6 (50,10 % k 28. březnu 2026), takový web k nim tedy má přímou cestu. Záznam AAAA bez ostatních kroků ale škodí víc, než kdyby neexistoval: na našem testovacím stendu klienti s IPv6 web neotevřeli, prohlížeč ztrácel 0,3 s při každém připojení, skript v PHP to vzdal po 60 s a Let’s Encrypt odmítl vydat certifikát.

Jak jsme testovali

10. listopadu 2026. V jádře našeho testovacího kontejneru je IPv6 vypnuté, proto jsme sestavili samostatné jádro User-Mode Linux 6.17 s IPv6 a provozovali v něm dvě sítě. Server: nginx 1.24, PHP-FPM 8.3, Apache 2.4.58, dnsmasq jako DNS. Klient: curl 8.5, wget 1.21, Python 3.12, PHP 8.3, Chromium 153 v režimu headless přes Playwright a k tomu Pebble 2.4 (testovací certifikační autorita týmu Let’s Encrypt) s Certbotem 2.9. Adresy pocházejí z dokumentačních rozsahů 192.0.2.0/24 a 2001:db8::/32. Rozbíjeli jsme vždy jen jednu věc: listen, firewall, certifikát, kontroly IP v PHP a .htaccess, zpracování logů. Podíly IPv6 pocházejí od Googlu (přes Internet Society Pulse), z APNIC Labs a Common Crawl, ověřeno 10.11.2026. Jde o chování testovacího stendu, ne o měření na serverech RichHost.

Kolik návštěvníků už používá IPv6

Ukazatel Hodnota Zdroj
Uživatelé Googlu, kteří se ke Googlu připojují přes IPv6 (svět) 50,10 % k 28.03.2026, poprvé přes polovinu Internet Society Pulse, na základě statistik IPv6 Googlu
Ukrajina, podíl klientů schopných IPv6 15,3 % APNIC Labs, 30denní průměr, záznam z 31.10.2026
Polsko 19,7 %
Německo 72,8 %
Francie 86,0 %
Česko 37,9 % APNIC Labs, 30denní průměr, záznam z 31.10.2026 (staženo 10.11.2026)
Top 100 000 webových hostů 38,1 % má AAAA; 1,2 % má AAAA, ale přes IPv6 neodpovědělo Common Crawl, 16.03.2026

Google počítá uživatele vlastních služeb, kdežto APNIC měří vzorek prostřednictvím zobrazení reklam, proto se čísla liší: Pulse uvádí pro Francii 73 %, APNIC 86 %. Stránka Googlu ukazuje jen graf; hodnoty APNIC v tabulce jsou 30denní průměry ze záznamu z 31.10.2026 (staženo 10.11.2026). Závěr je stejný: v západní Evropě má IPv6 většinu, ve střední a východní Evropě je zatím v menšině, v Česku ho podle APNIC používá necelých 38 % klientů. Ještě jedno číslo z Common Crawl: přibližně každý třicátý web se záznamem AAAA přes IPv6 neodpovídal. Přesně tento případ jsme zopakovali.

Co IPv6 webu skutečně dává

  • Přímou cestu k uživatelům IPv6. Mobilní operátoři se sítěmi jen s IPv6 se k webům na IPv4 dostávají přes překladače NAT64. Web s funkčním záznamem AAAA na nich nezávisí.
  • Skutečnou adresu návštěvníka. Za NATem operátora (CGNAT) sdílejí stovky zákazníků jednu adresu IPv4, takže blokace pokusu o hádání hesla zasáhne všechny. S IPv6 má každý zákazník vlastní síť /64.
  • Co nečekat: znatelné zrychlení. Na stendu trvala spojení přes IPv4 i IPv6 stejných 3-15 ms. Zisk je možný jen tam, kde operátor vede IPv4 přes přetížený NAT.

Co se rozbije: sedm scénářů z testovacího stendu

1. Záznam AAAA existuje, ale nginx naslouchá jen na IPv4

Konfigurace s listen 80; a listen 443 ssl; otevře pouze sokety IPv4. Klient, který zná obě adresy, nejdřív zkusí IPv6, dostane odmítnutí a během milisekund přejde na IPv4:

$ curl -v https://site.lab/
*   Trying [2001:db8:20::10]:443...
* connect to 2001:db8:20::10 port 443 from 2001:db8:20::100 port 37444 failed: Connection refused
*   Trying 192.0.2.10:443...
* Connected to site.lab (192.0.2.10) port 443

Proto majitel webu s domácím připojením přes IPv4 nic nepozná. Chromium se chovalo stejně, ale IPv6 zkoušelo znovu při každém novém spojení. Klient jen s IPv6 web vůbec neotevřel: curl hlásil Couldn't connect to server, Chromium ERR_CONNECTION_REFUSED. Oprava v nginx:

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name example.com www.example.com;
}

Varianta s jediným soketem listen [::]:80 ipv6only=off; funguje také, ale má dva háčky. Obyčejné nginx -s reload nezmění už otevřené sokety: na stendu po něm IPv4 prostě přestalo odpovídat a pomohl až úplný restart. A PHP vidí návštěvníky z IPv4 jako ::ffff:192.0.2.100 (více níže).

2. Firewall se otevřel pro IPv4 a na IPv6 se zapomnělo

Pravidla iptables a ip6tables jsou oddělená. Na stendu mělo IPv4 politiku DROP s povolenými porty 22, 80 a 443, ip6tables mělo stejnou politiku, ale povolovalo jen SSH, DNS a ICMPv6. Pakety na port 443 přes IPv6 se tiše zahazovaly a každý klient reagoval po svém:

Klient Co dělá, když IPv6 mlčí Výsledek
curl 8.5, rozšíření curl v PHP po 200 ms souběžně spustí IPv4 (Happy Eyeballs) 0,20-0,22 s na spojení místo 0,003-0,015 s
Chromium 153 totéž se zpožděním 300 ms 0,30-0,31 s u každého nového spojení
wget 1.21 čeká na systémový timeout IPv6, pak IPv4 134 s
Python 3.12 urllib stejně 133,5 s
PHP file_get_contents() spotřebuje celý default_socket_timeout na IPv6 chyba po 60,1 s, k IPv4 se nedostal

Člověk v prohlížeči ztratí 0,3 s, zatímco úlohy cron, platební webhooky a pluginy, které volají váš web přes file_get_contents(), visí celé minuty nebo selžou. Porovnejte pravidla pro oba protokoly a otevřete stejné porty:

iptables -S
ip6tables -S
ip6tables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

Pokud je IPv6 zavřené záměrně, spojení odmítejte, místo abyste je zahazovali. Obyčejné -j REJECT (ICMPv6 port unreachable) bere jádro Linuxu jako měkkou chybu a curl to vzdal až po 1,02 s. S -j REJECT --reject-with tcp-reset přijde odmítnutí za 1 ms a prohlížeč okamžitě přejde na IPv4.

3. Opačná chyba: IPv6 dokořán

Stává se to i obráceně: někdo vyprázdnil ip6tables a politika se změnila na ACCEPT. Na stendu byla interní služba na portu 8080 pro IPv4 zavřená (curl čekal 5 s a vzdal to), přes IPv6 ale odpovídala kódem 200. Každá služba naslouchající na [::] je dostupná z internetu, jakmile má server veřejnou adresu IPv6. Kontrolujte proto ip6tables -S nebo nft list ruleset nejen po zapnutí IPv6, ale po každé změně pravidel.

4. IPv6 servíruje jiný web nebo jiný certifikát

Ovládací panely často vážou web na konkrétní adresu IPv4, zatímco soket IPv6 na portu 443 skončí u výchozího serveru. Na stendu bylo přes IPv4 vše v pořádku, přes IPv6 ale curl hlásil SSL: no alternative certificate subject name matches target host name. Uvidíte to jen při testu přes IPv6:

$ openssl s_client -connect 192.0.2.10:443 -servername site.lab
subject=CN = site.lab
$ openssl s_client -connect [2001:db8:20::10]:443 -servername site.lab
subject=CN = server.default.lab

Návštěvníci přes IPv6 dostanou varování „Vaše připojení není soukromé“, ostatní nevidí nic.

5. Let’s Encrypt kontroluje nejdřív IPv6

Při validaci HTTP-01 si certifikační autorita sama stáhne soubor z /.well-known/acme-challenge/, a pokud má doména AAAA, jde přes IPv6. Testovací server Pebble na stendu používal jen IPv6 a na IPv4 nikdy nepřešel:

AAAA, nginx only on IPv4:
  Detail: ... dial tcp [2001:db8:20::10]:80: connect: connection refused
ip6tables DROP tcp/80:
  Detail: ... context deadline exceeded (Client.Timeout exceeded while awaiting headers)
[::]:80 served by another site:
  Detail: Non-200 status code from HTTP: http://le3.example.com:80/.well-known/acme-challenge/... returned 404
dual stack:
  Successfully received certificate.

Skutečný Let’s Encrypt je shovívavější. Podle zdrojového kódu jeho serveru Boulder (va/http.go, ověřeno 10.11.2026) vezme první adresu IPv6 a na IPv4 přejde jen tehdy, když selže samotné spojení: odmítnutí nebo timeout při navazování spojení, pokud ještě nevypršel celkový čas validace. Když server přes IPv6 odpoví, třeba i jiným webem s chybou 404, je výsledek konečný. Dřívější běh na stendu ukázal totéž: se záznamem AAAA začínala validace přes IPv6. Všechny způsoby, jak certifikát získat, popisuje náš návod na SSL zdarma od Let’s Encrypt.

6. PHP, WordPress a .htaccess vidí adresu IPv6

Tohle dostal stejný skript v PHP od návštěvníka přes IPv4 a přes IPv6:

IPv4: REMOTE_ADDR=192.0.2.100        ip2long: 3221226084   v4-only allowlist: ALLOW
IPv6: REMOTE_ADDR=2001:db8:20::100   ip2long: false        v4-only allowlist: DENY
IPv4 via listen [::]:80 ipv6only=off: REMOTE_ADDR=::ffff:192.0.2.100   v4-only allowlist: DENY

Funkce jako ip2long(), regulární výrazy na čtyři čísla oddělená tečkami a filtr FILTER_FLAG_IPV4 se objevují v pluginech na ochranu administrace, v omezeních počtu požadavků a v geoblokaci. S IPv6 buď zamknou majitele venku, nebo pustí dovnitř každého. Spolehlivá kontrola používá inet_pton() a porovnání prefixu, aby seznam mohl obsahovat 192.0.2.0/24 i 2001:db8:20::/64. V samotném WordPressu 6.4.3 má sloupec comment_author_IP 100 znaků, ale v multisite ukládá tabulka wp_registration_log IP do sloupce o 30 znacích, přičemž plná adresa IPv6 zabere až 39.

Apache na tom není jinak. Pravidlo Require ip 192.0.2.0/24 v souboru .htaccess pustilo IPv4 s kódem 200 a klienta přes IPv6 zastavilo kódem 403 a řádkem AH01630: client denied by server configuration. Pomohlo doplnit naši síť IPv6 na stejný řádek:

Require ip 192.0.2.0/24 2001:db8:20::/64

Přidávejte síť /64 (nebo /56, kterou vám přidělí poskytovatel), ne jednu adresu: zařízení střídají dočasné adresy IPv6 a včerejší pravidlo zítra nesedí.

7. Logy: adresy s dvojtečkami

Log ze stendu obsahoval 16 požadavků: 8 od klienta přes IPv4 a 8 od jednoho návštěvníka přes IPv6, který střídal dočasné adresy v rámci jedné sítě /64. Obvyklé příkazy daly tento výsledek:

$ grep -oE '^[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log | sort | uniq -c
      7 192.0.2.100
$ awk '{print $1}' access.log | awk -F: '{print $1":"$2":"$3":"$4}' | sort | uniq -c
      7 192.0.2.100:::
      2 2001:db8:20:
      6 2001:db8:20:0
      1 ::ffff:192.0.2.100

První vzor ztratil 9 z 16 řádků, druhý rozdělil jednu síť na dvě, protože 2001:db8:20::100 se zapisuje ve zkráceném tvaru. V chybovém logu Apache je adresa uvedena i s portem ([client 2001:db8:20::100:34996]) a awk -F: vrátí jen 2001. Port odřízněte u poslední dvojtečky a adresy seskupte modulem ipaddress v Pythonu:

awk '{print $1}' access.log | python3 -c '
import sys, ipaddress, collections
c = collections.Counter()
for line in sys.stdin:
    ip = ipaddress.ip_address(line.strip())
    if ip.version == 6 and ip.ipv4_mapped: ip = ip.ipv4_mapped
    c[str(ipaddress.ip_network(f"{ip}/{64 if ip.version == 6 else 32}", strict=False))] += 1
for net, n in c.most_common(): print(n, net)'

Výsledek: 8 192.0.2.100/32 a 8 2001:db8:20::/64, tedy dva návštěvníci, přesně jak to bylo. Jak obecně číst přístupové a chybové logy, vysvětluje náš návod k logům serveru na hostingu.

Kontrolní seznam: co ověřit, příkaz, očekávaný výsledek

Kontroly spouštějte z počítače, který má IPv6. Bez trasy IPv6 se Chromium na stendu na AAAA ani nezeptalo a šlo přes IPv4, takže z notebooku bez IPv6 problém neuvidíte.

Co ověřit Příkaz Očekávaný výsledek
Záznam AAAA dig +short AAAA example.com adresa IPv6 vašeho serveru; prázdné, pokud jste IPv6 nezapnuli
Server naslouchá na IPv6 ss -ltn řádky [::]:80 a [::]:443 nebo vaše adresa IPv6
Konfigurace nginx nginx -T | grep listen listen [::]:443 ssl v bloku vaší vlastní domény
Firewall ip6tables -S nebo nft list ruleset tcp 80 a 443 povolené pro IPv6 stejně jako pro IPv4; žádné porty navíc
Web odpovídá přes IPv6 curl -6 -sI https://example.com/ stejný stav (200 nebo 301) a čas jako s curl -4
Certifikát přes IPv6 openssl s_client -connect [IPv6]:443 -servername example.com vaše doména v subject, Verify return code: 0 (ok)
Cesta pro validaci Let’s Encrypt curl -6 http://example.com/.well-known/acme-challenge/test testovací soubor z vašeho webu, stejně jako s curl -4
IP v PHP a ochrana administrace skript s echo $_SERVER['REMOTE_ADDR']; otevřený přes IPv6 adresa IPv6 bez ::ffff:; administrace vás přes IPv6 pustí
Logy a monitoring awk '{print $1}' access.log | grep -c : požadavky přes IPv6 v logu jsou a v reportech se neztrácejí; monitoring má samostatnou kontrolu IPv6

Když X, udělejte Y

Situace Co dělat
Hosting nedává adresu IPv6 AAAA nepřidávejte. Uživatelé s IPv6 se na web dostanou přes NAT64 svého operátora
AAAA existuje a curl -6 hned hlásí „Couldn’t connect“ Přidejte listen [::], nebo AAAA odstraňte, dokud server nebude připravený
curl -6 visí 10 s i déle Firewall tiše zahazuje IPv6: otevřete 80 a 443 v ip6tables nebo nftables
Let’s Encrypt zmiňuje [IPv6]:80 Opravte IPv6, nebo AAAA zatím odstraňte a počkejte, až vyprší TTL
Varování k certifikátu vidí jen část návštěvníků Vyzkoušejte openssl s_client přes IPv6 a navažte certifikát na soket IPv6
Administrace nebo API omezené seznamem IP Přidejte svou síť IPv6 /64 nebo /56 a ověřte, že plugin IPv6 rozumí
Limity, blokace a reporty počítají jednotlivé adresy Seskupujte IPv6 podle sítí /64

Záznam AAAA se přidává a maže ve stejné zóně DNS jako ostatní DNS záznamy a změna neplatí okamžitě: starý záznam zůstává v cache, dokud nevyprší jeho TTL. Jak dlouho to v praxi trvá, jsme změřili v článku o tom, jak dlouho trvá propagace DNS.

IPv6 na hostingu: na co se zeptat podpory

Na sdíleném hostingu spravuje adresy, listen a firewall poskytovatel, vám zůstává DNS a kód webu. Položte podpoře čtyři otázky: je ve vašem tarifu adresa IPv6 pro web, je v ovládacím panelu přiřazená k doméně, přidává panel záznam AAAA sám a funguje vydávání certifikátů Let’s Encrypt přes IPv6? Hostingové tarify RichHost zahrnují vlastní ovládací panel s asistentem AI a SSL zdarma od Let’s Encrypt; zda je pro váš web dostupná adresa IPv6, se zeptejte podpory (k dispozici od 10:00 do 20:00 kyjevského času, odpověď zhruba do 30 minut). Pak projděte kontrolní seznam výše.

Časté otázky

Potřebuji IPv6, když je moje publikum v zemi s nízkým rozšířením?

Ne nutně: APNIC měří zhruba 15 % klientů s IPv6 na Ukrajině a 20 % v Polsku, zbytek obslouží IPv4. V Česku je to přibližně 38 %, tedy už znatelná část návštěvníků. Pokud ale záznam AAAA už existuje, musí fungovat, jinak doplatí jako první právě tito návštěvníci. Pro publikum v Německu nebo Francii je IPv6 už hlavním protokolem.

Zrychlí IPv6 můj web?

Samo o sobě ne: na stendu trvala spojení přes oba protokoly 3-15 ms. Viditelný rozdíl vzniká jen při špatně nastaveném IPv6, a pak ve prospěch IPv4.

Proč prohlížeč web otevře, zatímco úloha cron nebo skript visí?

Prohlížeče a curl po 200-300 ms souběžně zkusí IPv4. Mnoho jiných klientů (wget, Python urllib, PHP file_get_contents()) čeká na timeout IPv6: 60-134 sekund na stendu.

Mohu záznam AAAA prostě smazat?

Ano, pokud server na IPv6 připravený není, je to nejjednodušší cesta zpět: klienti začnou používat IPv4, jakmile vyprší TTL starého záznamu. Pokud prohlížeč ukazuje DNS_PROBE_FINISHED_NXDOMAIN, problém není v IPv6, ale v samotné doméně: viz náš návod k chybě DNS_PROBE_FINISHED_NXDOMAIN.

Více k tématu

Všechny články
SSH klíče: jak je vytvořit, jaký typ zvolit a jak vypnout hesla
Návody a tutoriály k hostingu27.07.2026

SSH klíče: jak je vytvořit, jaký typ zvolit a jak vypnout hesla

Jak vytvořit SSH klíč, proč je Ed25519 pro nové klíče lepší než RSA, jak ho přidat na server, do panelu hostingu nebo…

Nastavení Fail2Ban a CSF: jaily pro SSH, nginx a WordPress v testu
Návody a tutoriály k hostingu01.07.2026

Nastavení Fail2Ban a CSF: jaily pro SSH, nginx a WordPress v testu

Jak nastavit Fail2Ban pro SSH, nginx a WordPress, co skutečně blokuje a šest pastí: zablokování sebe sama, IPv6, journald, Cloudflare a změněná…

Bezpečnostní audit webu: checklist na hodinu se skutečnými příkazy
Návody a tutoriály k hostingu11.06.2026

Bezpečnostní audit webu: checklist na hodinu se skutečnými příkazy

Jak za hodinu provést audit webu na sdíleném hostingu nebo vlastním VPS: odhalené .git, .env a výpisy databáze, verze WordPressu a pluginů,…