VPN je zkratka pro soukromou virtuální síť. Jde o takovou síť, která je roztažena napříč veřejným internetem a přesto díky autentizaci a šifrování vytváří pro uživatele jednotný a transparentní celek. Lze tak vytvořit geograficky rozsáhlé sítě, které nemají vlastní fyzickou infrastrukturu, ale využívají jiných existujících sítí.
VPN si lze postavit na vlastní infrastruktuře nebo si vybrat z nepřeberného množství služeb, které nabízejí za úplatu své servery komukoliv. VPN ale není služba, ač je tak dnes často vnímána. VPN je především protokol a jeho softwarová implementace.
Protokolů pro VPN je celá řada, stejně jako jejich implementací. OpenVPN, IPsec, PPTP, L2TP, Tinc a spousta proprietárních řešení různých výrobců. Proč tedy chtít další protokol, který vlastně řeší stále dokola stejný problém? Odpovědí je několik zajímavých vlastností, které WireGuard má.
Vlastnosti WireGuardu
Má mnohem méně řádek kódu. OpenVPN společně s OpenSSL má asi 600 000 řádek, XFRM a StrongSwan (IPsec) mají dohromady 400 000 řádek. Celý WireGuard má jen 4000 řádků. To znamená, že je lépe auditovatelný, má méně problematických míst a je výkonnější. Takhle malý kód dokáže prohlédnout jednotlivec, nepotřebujete k tomu armádu lidí.
Nezanedbatelnou výhodou je, že je kód napsán velmi čistě. Dokonce tak dobře, že kvalitu v mailing listu pochválil i Linus Torvalds. Can I just once again state my love for it and hope it gets merged soon? Maybe the code isn't perfect, but I've skimmed it, and compared to the horrors that are OpenVPN and IPSec, it's a work of art.
Celý kód je také psán s ohledem na bezpečnost. Autor v něm záměrně nepoužívá spoustu vlastností, které by v budoucnu mohly vést k potenciální zranitelnosti. Paměť se například alokuje při startu podle konfigurace a pakety už nemají na přidělování pamětí vliv. To omezuje celou jednu skupinu bezpečnostních problémů. Podobně jsou hlavičky paketů statické, takže není třeba je složitě parsovat a vytvářet tím další prostor pro zranitelnosti.
WireGuard je také velmi nenáročný z hlediska sítě. Pokud se nepřenáší užitečná data, je na lince ticho. Zároveň nereaguje na neautorizované pakety, které tak nikdy nemění jeho stav. Tím se opět jedním šmahem odstranila celá skupina zranitelností. Příjemným bonusem je pak to, že je WireGuard neviditelný, pokud s ním nikdo nekomunikuje. Pokud jen tak zkusíte zaťukat na jeho port, nikdo vám neodpoví.
WireGuard používá nejmodernější kryptografii jako protokol Noise a algoritmy Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24 a HKDF. Architektura vznikla na základě akademické práce [PDF] a primárním hlediskem byla bezpečnost. Autor říká, že se pevnou volbou šifrovacích algoritmů rozhodl čelit problémům se zpětnou kompatibilitou a třeba i výběrem slabších šifer. Útoky typu POODLE tedy nejsou ve WireGuardu možné. Kdyby se v budoucnu některý z vybraných algoritmů ukázal jako slabý, jednoduše se vymění bez zachování zpětné kompatibility se starými verzemi.
Díky jednoduchosti a díky umístění v linuxovém jádře je WireGuard také velmi výkonný. Autor tvrdí, že je ještě spousta prostoru k dalším optimalizacím, přesto už dnes jeho řešení své konkurenty v této oblasti výrazně předčí. Daří se mu například saturovat gigabit tam, kde je OpenVPN na čtvrtině. Benchmarky jsou samozřejmě velmi problematická věc závisející na mnoha okolnostech, ale pro hrubou představu nám stačí.
Z hlediska uživatele je pak WireGuard velmi jednoduchý. Snaží se co nejlépe zapadnout do linuxového jádra a jeho procesů, takže například využívá běžného konceptu síťových rozhraní v linuxovém jádře. Základní princip je z uživatelského hlediska velmi snadný: vytvoříme síťové rozhraní, přidáme mu klíče a IP adresy protistran a máme VPN.
Užitečné principy
WireGuard provoz určený pro ostatní členy VPN šifruje a balí do UDP paketů. Uživatele tedy zajímá jen vlastní pár klíčů, veřejné klíče protistran a přidělení IP adres. WireGuard se nestará o distribuci klíčů nebo jejich ověřování, to nechává na starosti jiným nástrojům. Můžeme ho tak přirovnat třeba k SSH: obě komunikující strany znají své veřejné klíče a mohou si bezpečně vyměňovat data zabezpečeným kanálem.
Příjemnou vlastností WireGuardu je, že napevno svazuje IP adresy či rozsahy uvnitř VPN s konkrétními veřejnými klíči. Klient tedy ví, že daný veřejný klíč patří určité protistraně, která bude mít ve VPN pevně přidělenou adresu. Jen pokud se klíče a adresa přijatého paketu shodují, projde paket do systému.
Pokud by se některý klient pokoušel podvrhovat do VPN pakety s adresou jiného klienta, WireGuard to odhalí a nevalidní pakety zahodí. Znamená to, že pakety vycházející z rozhraní WireGuardu mají vždy ověřený původ a můžete k nim takto přistupovat. Adresu odpovídající klientovi nemůže použít nikdo jiný, takže pro ni můžete například zpřístupnit konkrétní službu. K tomuto principu se ještě vrátíme v příštím článku.
WireGuard má v sobě zabudovaný roaming. To znamená, že jednotliví klienti mohou měnit svou skutečnou IP adresu a stále mohou komunikovat se zbytkem sítě. V konfiguraci je totiž volitelně uvedena jen inicializační adresa, která slouží k prvnímu odeslání dat před přijetím první odpovědi. Poté se WireGuard řídí tím, ze které IP adresy obdržel nejnovější validní data a na tu pak posílá svou další komunikaci. Pokud protistrana změní v průběhu času svou reálnou IP adresu a ohlásí se z ní, partneři si změny všimnou a budou další komunikaci směřovat jinam. Úplně stejně to například dělá alternativní implementace SSH zvaná Mosh.
Praktická ukázka příště
Tolik k obecným vlastnostem a o tom, proč by vás vlastně měl WireGuard zajímat. Příště si ukážeme, jak WireGuard nainstalovat a jak si jednoduše vytvořit svou vlastní VPN mezi linuxovými stroji. Prakticky si tak ukážeme výše popsané vlastnosti a především zmíněnou jednoduchost celého konceptu.