
Nastal čas, kdy VPN už není nějakým exotickým nástrojem vousatých administrátorů. Úkoly uživatelů jsou různé, ale faktem je, že VPN je potřeba už opravdu všem.
Problém současných VPN řešení spočívá v tom, že je těžké je správně nastavit, jsou drahé na údržbu a navíc v nich je spousta legacy kódu pochybné kvality.
Před několika lety se kanadský odborník na informační bezpečnost Jason A. Donenfeld rozhodl, že je dost a začal pracovat na . V současnosti se WireGuard připravuje na zařazení do jádra Linuxu, dokonce obdržel pochvalu od a v .
Uvedené výhody WireGuard oproti jiným VPN řešením:
- Jednoduché použití.
- Používá moderní kryptografii: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF atd.
- Kompaktní a čitelný kód, snadnější na prozkoumání zranitelností.
- Vysoký výkon.
- Jasně a promyšleně .
Není to snad nalezená stříbrná kulka? Je čas pohřbít OpenVPN a IPSec? Rozhodl jsem se to prozkoumat a zároveň jsem vytvořil .
Principy fungování
Principy fungování lze popsat zhruba takto:
- Vytváří se rozhraní WireGuard, kterému je přiřazen soukromý klíč a IP adresa. Načítají se nastavení ostatních peerů: jejich veřejné klíče, IP adresy atd.
- Všechny IP pakety přicházející na rozhraní WireGuard jsou inkapsulovány do UDP a ostatním peerům.
- Klienti zadávají veřejnou IP adresu serveru v nastavení. Server automaticky zjistí externí adresy klientů, když od nich obdrží správně autentizovaná data.
- Server může změnit veřejnou IP adresu, aniž by došlo k přerušení provozu. Přitom odešle oznámení připojeným klientům a ti na místě aktualizují svou konfiguraci.
- Používá se koncept směrování . WireGuard přijímá a odesílá pakety na základě veřejného klíče peeru. Když server dešifruje správně autentizovaný paket, kontroluje jeho поле src. Pokud odpovídá konfiguraci
allowed-ipsautentizovaného peeru, paket je přijat rozhraním WireGuard. Při odesílání odchozího paketu probíhá odpovídající procedura: vezme se поле dst paketu a na základě něj se vybírá odpovídající peer, paket se podepisuje vlastním klíčem, šifruje klíčem peeru a odesílá se na vzdálený koncový bod.
Všechna hlavní logika WireGuard zabírá méně než 4 tisíce řádků kódu, zatímco OpenVPN a IPSec mají stovky tisíc řádků. Pro podporu moderních kryptografických algoritmů se navrhuje zařadit do jádra Linuxu novou kryptografickou API. V současné době se diskutuje, jak moc je to dobrý nápad.
Výkon
Maximální výkon (ve srovnání s OpenVPN a IPSec) bude nejvíce patrný na systémech Linux, protože tam je WireGuard implementován jako modul jádra. Kromě toho jsou podporovány macOS, Android, iOS, FreeBSD a OpenBSD, ale tam WireGuard běží v uživatelském prostoru, což má dopad na výkon. Podpora pro Windows by měla být přidána v nejbližší době.
Výsledky benchmarků s :

Má zkušenost s používáním
Nejsem expert na nastavení VPN. Jednou jsem nastavoval OpenVPN ručně a to bylo velmi zdlouhavé, a na IPSec jsem se ani nepokoušel. Je třeba učinit příliš mnoho rozhodnutí, je velmi snadné si ublížit. Takže jsem vždy používal hotové skripty pro nastavení serveru.
WireGuard je podle mého názoru ideální pro uživatele. Všechny nízkoúrovňové rozhodnutí jsou uvedena ve specifikaci, takže příprava typické VPN infrastruktury trvá jen několik minut. Je téměř nemožné udělat chybu v konfiguraci.
Proces instalace na oficiálních stránkách, je třeba zvlášť vyzdvihnout skvělou .
Klíče pro šifrování jsou generovány pomocí nástroje wg:
SERVER_PRIVKEY=$( wg genkey )
SERVER_PUBKEY=$( echo $SERVER_PRIVKEY | wg pubkey )
CLIENT_PRIVKEY=$( wg genkey )
CLIENT_PUBKEY=$( echo $CLIENT_PRIVKEY | wg pubkey )Dále je třeba vytvořit serverovou konfiguraci /etc/wireguard/wg0.conf s následujícím obsahem:
[Interface]
Address = 10.9.0.1/24
PrivateKey = $SERVER_PRIVKEY
[Peer]
PublicKey = $CLIENT_PUBKEY
AllowedIPs = 10.9.0.2/32a zprovoznit tunel skriptem wg-quick:
sudo wg-quick up /etc/wireguard/wg0.confV systémech se systemd můžete místo toho použít sudo systemctl start wg-quick@wg0.service.
Na klientském počítači vytvořte konfiguraci /etc/wireguard/wg0.conf:
[Interface]
PrivateKey = $CLIENT_PRIVKEY
Address = 10.9.0.2/24
[Peer]
PublicKey = $SERVER_PUBKEY
AllowedIPs = 0.0.0.0/0
Endpoint = 1.2.3.4:51820 # Vnější IP serveru
PersistentKeepalive = 25 A stejně tak zprovoznit tunel:
sudo wg-quick up /etc/wireguard/wg0.confZbývá nastavit NAT na serveru, aby se klienti mohli připojit k internetu, a je hotovo!
Takovou jednoduchost používání a kompaktnost kódu se podařilo dosáhnout díky zrušení funkce distribuce klíčů. Neexistuje zde složitý systém certifikátů a veškerého toho podnikatelského zmatku, krátké šifrovací klíče se distribuují podobně jako SSH klíče. S tím však vzniká problém: WireGuard nebude snadné implementovat v některých již existujících sítích.
Mezi nevýhody patří to, že WireGuard nefunguje přes HTTP proxy, protože jako transportní protokol je pouze UDP. Otázkou je, zda bude možné protokol obfuskovat? Samozřejmě, že to není přímý úkol VPN, ale pro OpenVPN například existují způsoby, jak maskovat se jako HTTPS, což pomáhá obyvatelům totalitních zemí plně využívat internet.
Závěry
Shrnuto, je to velmi zajímavý a perspektivní projekt, který lze již nyní použít na osobních serverech. Jaký je profit? Vysoký výkon na systémech Linux, jednoduchost nastavení a údržby, kompaktní a čitelná základna kódu. Nicméně, je ještě brzy se vrhnout na převod komplexní infrastruktury na WireGuard, je dobré počkat na zařazení do jádra Linux.
Abych ušetřil svůj (a váš) čas, vytvořil jsem . S jeho pomocí můžete vytvořit osobní VPN pro sebe a své známé i bez hlubších znalostí.
Zdroj: habr.com
