# 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](Diffie-Hellman#kde-to-uvidíš) 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íčů](Verejny-a-soukromy-klic), 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`:

```ini
[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

```ini
[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](Smerovani).

**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í](Porty-a-spojeni).

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](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.
