Skip to content

WireGuard

Martin Skalicky edited this page Aug 5, 2026 · 4 revisions

WireGuard

VPN, která se vejde na jednu obrazovku konfigurace a je rychlejší než všechno předchozí. Nahradila OpenVPN a IPsec všude, kde to šlo, a je jediné rozumné doporučení pro domácí použití.

Jak se liší

Je malý. Zhruba čtyři tisíce řádků kódu proti půl milionu u OpenVPN. Méně kódu znamená méně chyb a snadnější audit.

Nemá volby. Žádné vyjednávání šifer, žádné verze protokolu. Jedna sada moderní kryptografie a hotovo. Nedá se nastavit špatně.

Je bezstavový. Neexistuje připojování a odpojování. Buď paket projde, nebo neprojde. Proto se roaming mezi WiFi a mobilními daty děje bez povšimnutí.

Je tichý. Bez správného klíče neodpoví vůbec nic. Port skenovaný zvenku vypadá jako zavřený.

Ta pevná sada kryptografie je X25519 na výměnu klíčů, ChaCha20-Poly1305 na provoz a BLAKE2s na otisky. Handshake provede Diffie-Hellmana hned čtyřikrát, čímž naráz získá dopředné utajení i vzájemné ověření obou stran — a proto tu nejsou žádné certifikáty.

Model klíčů

Každý účastník má dvojici klíčů — soukromý a veřejný. Ten svůj soukromý si necháváš, veřejný dáváš protistraně. Je to úplně stejný princip jako u SSH klíčů, jen bez certifikátů a bez known_hosts — důvěra je celá v tom, co si napíšeš do konfigurace.

V konfiguraci pak platí prosté pravidlo: v sekci [Interface] je můj soukromý klíč, v sekci [Peer] je veřejný klíč toho druhého.

Vygenerování:

wg genkey | tee soukromy.key | wg pubkey > verejny.key

Server

Konfigurace na serveru doma, například /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = <soukromý klíč serveru>
Address = 10.10.0.1/24
ListenPort = 51820

[Peer]
# telefon
PublicKey = <veřejný klíč telefonu>
AllowedIPs = 10.10.0.2/32

[Peer]
# notebook
PublicKey = <veřejný klíč notebooku>
AllowedIPs = 10.10.0.3/32

Spuštění:

sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

Na routeru pak přesměruj UDP port 51820 na tenhle stroj. Pokud běží WireGuard přímo na routeru (UniFi to umí, Mikrotik taky), odpadá to.

Klient

[Interface]
PrivateKey = <soukromý klíč telefonu>
Address = 10.10.0.2/32
DNS = 192.168.1.1

[Peer]
PublicKey = <veřejný klíč serveru>
Endpoint = tvoje.domena.cz:51820
AllowedIPs = 192.168.1.0/24, 10.10.0.0/24
PersistentKeepalive = 25

Tři věci, které stojí za vysvětlení

AllowedIPs

Nejdůležitější a nejvíc matoucí volba. Znamená dvě věci naráz, podle směru.

Odchozí: které adresy se mají posílat tunelem. Funguje to jako směrovací pravidlo.

Příchozí: které zdrojové adresy od tohohle protějšku akceptuji. Funguje to jako filtr.

Prakticky:

AllowedIPs = 192.168.1.0/24, 10.10.0.0/24

Tunelem půjde jen provoz do domácí sítě. Zbytek (web, streamování) půjde normálně přímo. Tomu se říká split tunnel a je to obvykle to, co chceš — nezpomaluješ si běžné surfování a nevytěžuješ domácí linku.

AllowedIPs = 0.0.0.0/0, ::/0

Tunelem půjde úplně všechno. Užitečné ve veřejné WiFi, kde chceš mít šifrovaný veškerý provoz. Cenou je, že veškerý tvůj provoz teče přes domácí připojení, což je pomalejší a viditelné na tvé domácí lince.

Kdykoliv ti VPN „funguje, ale nedostanu se na nic", podívej se sem první.

PersistentKeepalive

Bez něj tunel po chvíli ticha zamrzne. NAT na cestě zapomene, že spojení existuje, a odpovědi už nemá kam doručit — souvisí to se stavem spojení.

Hodnota 25 vteřin je bezpečná pod většinu NAT timeoutů. Nastav ji na klientovi, který je za NATem, tedy prakticky vždy na telefonu a notebooku.

DNS

Když nastavíš DNS na svůj domácí resolver, budou ti fungovat lokální jména a blokování reklam i na cestách. Bez toho se dostaneš na adresy, ale ne na jména.

Pozor: pokud používáš split tunnel a domácí DNS server, musí být jeho adresa v AllowedIPs, jinak se na něj dotaz nedostane.

Telefon

Nainstaluj oficiální aplikaci WireGuard, dej „přidat ze QR kódu" a vygeneruj kód z konfigurace:

qrencode -t ansiutf8 < klient.conf

Zobrazí se přímo v terminálu, telefonem naskenuješ a je hotovo.

Diagnostika

sudo wg show

Ukáže, kdy naposledy proběhla komunikace s každým protějškem a kolik dat prošlo.

Co vidět a co to znamená:

Žádný latest handshake — komunikace nikdy neproběhla. Zkontroluj, jestli je port skutečně přesměrovaný, jestli je Endpoint správný a jestli klíče sedí. Nejčastější chyba je záměna soukromého a veřejného klíče.

Handshake proběhl, ale nic neteče — problém je v AllowedIPs nebo ve směrování. Zkontroluj taky, jestli má server zapnuté přeposílání paketů:

sysctl net.ipv4.ip_forward       # musí být 1

Funguje, ale zamrzá — chybí PersistentKeepalive.

Funguje, ale některé věci se nenačtou celé — MTU. Zkus na obou stranách nastavit MTU = 1420 do sekce [Interface]. Viz diagnostika.

Bezpečnostní poznámky

Soukromé klíče se nesdílí, ani „dočasně přes WhatsApp". Každé zařízení má vlastní pár.

Když ztratíš telefon, smaž jeho [Peer] blok na serveru a hotovo. Ostatní klienty to neovlivní.

WireGuard nemá uživatele ani hesla. Kdo má klíč, ten se dostane dovnitř. Pro domácnost je to v pořádku, pro firmu s padesáti lidmi chceš něco s centrální správou — třeba Tailscale nebo Netbird, které jsou postavené na WireGuardu a přidávají identitu.

Clone this wiki locally