WireGuard® je extrémně jednoduchá, ale rychlá a moderní VPN, která využívá nejmodernější kryptografii. Jeho cílem je být rychlejší, jednodušší, štíhlejší a užitečnější než IPsec a zároveň se přitom vyhnout masivní bolesti hlavy. Má v úmyslu být podstatně výkonnější než OpenVPN. WireGuard je navržen jako univerzální VPN pro běh na vestavěných rozhraních a superpočítačích, které jsou vhodné pro mnoho různých okolností. Původně byl vydán pro linuxové jádro, nyní je multiplatformní (Windows, macOS, BSD, iOS, Android) a široce nasaditelný. V současné době je intenzivně vyvíjen, ale již může být považován za nejbezpečnější, nejsnadněji použitelné a nejjednodušší řešení VPN v oboru.
Vlastnosti
Jednoduché používání
WireGuard si klade za cíl být stejně snadné na konfiguraci a nasazení jako SSH. Připojení VPN se provádí jednoduše výměnou velmi jednoduchých veřejných klíčů – přesně jako výměna klíčů SSH – a vše ostatní transparentně řeší WireGuard. Je dokonce schopen roamingu mezi IP adresami, stejně jako Mosh. Není třeba spravovat připojení, starat se o stav, spravovat démony nebo se starat o to, co je pod kapotou. WireGuard představuje extrémně základní, ale výkonné rozhraní.
Kryptografická odolnost
WireGuard využívá nejmodernější kryptografii, jako je protokol Noise, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF a bezpečné důvěryhodné konstrukce. Dělá konzervativní a rozumná rozhodnutí a byl zkontrolován kryptografy.
Minimální možnost útoku
WireGuard byl navržen s ohledem na snadnou implementaci a jednoduchost. Má být snadno implementován ve velmi malém počtu řádků kódu a snadno auditovatelný pro zranitelnosti zabezpečení. Ve srovnání s monstry jako Swan/IPsec nebo OpenVPN/OpenSSL, ve kterých je auditování gigantických kódových základen zdrcujícím úkolem i pro velké týmy bezpečnostních expertů, má být WireGuard komplexně kontrolovatelný jednotlivými jednotlivci.
Vysoký výkon
Kombinace extrémně vysokorychlostních kryptografických primitiv a faktu, že WireGuard žije uvnitř linuxového jádra, znamená, že zabezpečené sítě mohou být velmi rychlé. Je vhodný jak pro malá vestavěná zařízení, jako jsou smartphony, tak pro plně zatížené páteřní routery.
Dobrý a pečlivý návrh
WireGuard je výsledkem zdlouhavého a důkladně promyšleného akademického procesu, jehož výsledkem je technický whitepaper, akademický výzkumný dokument, který jasně definuje protokol a intenzivní úvahy, které byly součástí každého rozhodnutí.
Jak to funguje
Pokud byste chtěli obecný koncepční přehled o tom, o čem WireGuard je, čtěte dále zde. Poté můžete přejít k instalaci a přečíst si pokyny pro rychlý start, jak ji používat.
Pokud vás zajímá vnitřní vnitřní fungování, mohlo by vás zajímat stručné shrnutí protokolu nebo jít více do hloubky tím, že si přečtete technický dokument, který podrobněji popisuje protokol, kryptografii a základy. Pokud máte v úmyslu implementovat WireGuard pro novou platformu, přečtěte si prosím poznámky pro různé platformy.
WireGuard bezpečně zapouzdřuje IP pakety přes UDP. Přidáte rozhraní WireGuard, nakonfigurujete jej pomocí svého soukromého klíče a veřejných klíčů vašich kolegů a poté přes něj posíláte pakety. Všechny problémy distribuce klíčů a push konfigurací jsou mimo rozsah WireGuard; to jsou problémy, které je lepší nechat pro jiné vrstvy, abychom neskončili s nadýmáním IKE nebo OpenVPN. Oproti tomu více napodobuje model SSH a Mosh; obě strany mají navzájem své veřejné klíče a pak si mohou jednoduše začít vyměňovat pakety přes rozhraní.
Síťové rozhraní
WireGuard funguje přidáním jednoho nebo více síťových rozhraní, jako je u ethernetu eth0 nebo wlan0, tak wireguardové rozhraní se nazývá wg0 (nebo wg1, wg2, wg3 atd.).
Toto síťové rozhraní lze poté konfigurovat normálně pomocí ifconfig(8) nebo ip address(8), přičemž cesty k němu lze přidat a odebrat pomocí route(8) nebo ip route(8) a tak dále se všemi běžnými síťovými nástroji.
Specifické aspekty rozhraní WireGuard se konfigurují pomocí nástroje wg(8). Toto rozhraní funguje jako tunelové rozhraní.
WireGuard spojuje IP adresy tunelu s veřejnými klíči a vzdálenými koncovými body. Než rozhraní odešle paket protejšku (peer), provede následující:
-
Tento paket je určen pro
192.168.30.8. Který je to protejšek (peer)? Podíváme se… Jo, je to pro protějšekABCDEFGH. (Nebo pokud to není pro žádný nakonfigurovaný protejšek, tak se paket zahodí.) -
Zašifrujeme celý IP paket pomocí veřejného klíče protějšku
ABCDEFGH. -
Jaký je vzdálený koncový bod (endpoint) protějšku ABCDEFGH? Podíváme se… Dobře, koncovým bodem je port UDP 53133 na hostiteli 216.58.211.110.
-
Odešleme šifrované bajty z kroku 2 přes internet na adresu
216.58.211.110:53133pomocí UDP.
Když rozhraní přijme paket, stane se toto:
-
Právě jsem dostal paket z portu UDP 7361 na hostiteli 98.139.183.24. Pojďme ho dešifrovat!
-
Dá se správně dešifrovat a autentizovat a je z protějšku
LMNOPQRS. Dobře, poznamenáme si, že nejnovější internetový koncový bod protejškuLMNOPQRSje 98.139.183.24:7361 používající UDP. -
Po dešifrování je to paket prostých bajtů z adresy
192.168.43.89. Může nám protejšekLMNOPQRSposílat pakety z adresy192.168.43.89? -
Pokud ano, přijmeme paket na rozhraní. Pokud ne, zahodíme ho.
V zákulisí se toho děje mnoho, aby bylo zajištěno náležité soukromí, autenticita a dokonalé dopředné utajení pomocí nejmodernější kryptografie.
Směrování pomocí šifrovacích klíčů
Srdcem WireGuardu je koncept nazvaný směrování pomocí šifrovacíh klíčů (Cryptokey Routing), který funguje tak, že spojuje veřejné klíče se seznamem IP adres tunelu, které jsou povoleny v tunelu. Každé síťové rozhraní má soukromý klíč a seznam partnerů. Každý peer má veřejný klíč. Veřejné klíče jsou krátké a jednoduché a používají je kolegové ke vzájemné autentizaci. Lze je předat pro použití v konfiguračních souborech jakoukoli metodou (třeba je nadiktovat telefonem), podobně jako je možné poslat svůj veřejný klíč SSH příteli pro přístup k shellu serveru.
Server může mít například konfiguraci:
[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
ListenPort = 51820
[Peer]
PublicKey = xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=
AllowedIPs = 10.192.122.3/32, 10.192.124.1/24
[Peer]
PublicKey = TrMvSoP4jYQlY6RIzBgbssQqY3vxI2Pi+y71lOWWXX0=
AllowedIPs = 10.192.122.4/32, 192.168.0.0/16
[Peer]
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.10.10.230/32
A klientský počítač může mít třeba tuto:
[Interface]
PrivateKey = gI6EdUSYvn8ugXOt8QQD6Yc+JyiZxIhp3GInSWRfWGE=
ListenPort = 21841
[Peer]
PublicKey = HIgo9xNzJMWLKASShiTqIybxZ0U3wGLiUeJ1PKf8ykw=
Endpoint = 192.95.5.69:51820
AllowedIPs = 0.0.0.0/0
V konfiguraci serveru bude každý peer (klient) schopen posílat pakety do síťového rozhraní se zdrojovou IP odpovídající jeho odpovídajícímu seznamu povolených IP adres.
Například, když server přijme paket od peer gN65BkIK…, poté, co byl dešifrován a ověřen, je-li jeho zdrojová IP adresa 10.10.10.230, je povolen vstup na rozhraní; jinak se zahazuje.
Když chce síťové rozhraní v konfiguraci serveru odeslat paket peerovi (klientovi), podívá se na cílovou IP tohoto paketu a porovná ji se seznamem povolených IP každého peeru, aby zjistil, kterému peeru jej poslat.
Pokud je například síťové rozhraní požádáno o odeslání paketu s cílovou IP 10.10.10.230, zašifruje jej pomocí veřejného klíče peer gN65BkIK… a poté jej odešle na nejnovější internetový koncový bod tohoto peeru.
V konfiguraci klienta bude jeho jediný peer (server) moci posílat pakety do síťového rozhraní s libovolnou zdrojovou IP (protože 0.0.0.0/0 je zástupný znak).
Například, když je paket přijat od peera HIgo9xNz…, pokud se dešifruje a autentizuje správně, s jakoukoli zdrojovou IP, pak je povolen vstup na rozhraní; jinak se zahazuje.
V konfiguraci klienta, když chce síťové rozhraní poslat paket svému jedinému peeru (serveru), zašifruje pakety pro jednoho peer s libovolnou cílovou IP adresou (protože 0.0.0.0/0 znamená libovolnou adresu).
Pokud je například síťové rozhraní požádáno o odeslání paketu s libovolnou cílovou IP adresou, zašifruje jej pomocí veřejného klíče jednoho peer HIgo9xNz… a poté jej odešle na nejnovější internetový koncový bod jednoho peer.
Jinými slovy, při odesílání paketů se seznam povolených IP chová jako jakási směrovací tabulka a při příjmu paketů se seznam povolených IP chová jako jakýsi seznam řízení přístupu.
To je to, co nazýváme Cryptokey Routing Table: jednoduchá asociace veřejných klíčů a povolených IP adres.
Pro kterékoli pole lze použít libovolnou kombinaci IPv4 a IPv6. WireGuard je v případě potřeby plně schopen zapouzdřit jeden do druhého.
Vzhledem k tomu, že všechny pakety odesílané na rozhraní WireGuard jsou šifrované a ověřené, a protože existuje tak těsné spojení mezi identitou peera a povolenou IP adresou peera,
správci systému nepotřebují složitá rozšíření firewallu, jako např. IPsec, ale spíše se mohou jednoduše shodovat na „je to z této IP? na tomto rozhraní?“ a mít jistotu, že jde o bezpečný a autentický paket.
To značně zjednodušuje správu sítě a řízení přístupu a poskytuje mnohem větší jistotu, že vaše pravidla iptables skutečně dělají to, co jste jim zamýšleli.
Zabudovaný roaming
Konfigurace klienta obsahuje počáteční koncový bod jeho jednoho peer (serveru), takže ví, kam má odeslat šifrovaná data, než přijme šifrovaná data. Konfigurace serveru nemá žádné počáteční koncové body svých vrstevníků (klientů). Důvodem je, že server zjišťuje koncový bod svých protějšků zkoumáním, odkud pocházejí správně ověřená data. Pokud server sám změní svůj vlastní koncový bod a odešle data klientům, klienti objeví nový koncový bod serveru a aktualizují konfiguraci stejně. Klient i server odesílají šifrovaná data na nejnovější koncový bod IP, pro který autenticky dešifrovali data. Na obou koncích tedy existuje plný IP roaming.
Připraveno pro kontejnery
WireGuard odesílá a přijímá šifrované pakety pomocí síťového jmenného prostoru, ve kterém bylo rozhraní WireGuard původně vytvořeno. To znamená, že můžete vytvořit rozhraní WireGuard ve svém hlavním síťovém jmenném prostoru, který má přístup k internetu, a poté jej přesunout do síťového jmenného prostoru patřícího kontejneru Docker jako jediné rozhraní tohoto kontejneru. Tím je zajištěno, že jediný možný způsob, jakým je kontejner schopen přistupovat k síti, je prostřednictvím zabezpečeného šifrovaného tunelu WireGuard.
Praktické použití
Před podrobným vysvětlením skutečných příkazů může být velmi poučné nejprve sledovat, jak je používají dva kolegové konfigurovaní vedle sebe:

Příkazový řádek
Poznámka: konfiguraci rozhraní může provádět pouze uživatel root nebo jiný uživatel s oprávněními administrátora.
Nové rozhraní může být přidáno pomocí ip link, což zajistí i automatické natažení modulů jádra:
# ip link add dev wg0 type wireguard
Uživaleté jiných systémů než Linux budou místo toho psát wireguard-go wg0.
Přiřadíme novému wireguard rozhraní IP adresu pomocí ifconfig nebo ip address
# ip address add dev wg0 192.168.2.1/24
Pokud máme celkově jenom dva peery, může být toto vhodnější
# ip address add dev wg0 192.168.2.1 peer 192.168.2.2
Přiřazení klíčů k rozhraní a koncové body mohou být doplněny pomocí prográmku wg
# wg setconf wg0 myconfig.conf
nebo bez konfiguračního souboru
# wg set wg0 listen-port 51820 private-key /path/to/private-key peer ABCDEF... allowed-ips 192.168.88.0/24 endpoint 209.202.254.14:8172
Nakonec je potřeba rozhraní zaktivovat pomocí ifconfig nebo ip link:
ip link set up dev wg0
Existují také příkazy wg show a wg showconf, kterými si prohlédneme aktuální konfiguraci.
Pokud napíšeme jenom wg, je to stejné jako wg show, což nám zobrazí všechna wireguard rozhraní.

Pokud potřebujete další informace, tak jsou v manuálové stránce wg(8), neboli man 8 wg.
Celá procedura nahození wireguard rozhraní pomocí wg a ip může být zautomatizována příkazem wg-quick

Generování klíčů
Wireguard potřebuje veřejný a soukromý klíč zakódovaný kódováním base64.
Můžeme je vytvořit pomocí utility wg
$ umask 077
$ wg genkey >privatekey (1)
| 1 | Příkaz wg genkey vytvoří nový soukromý klíč a vypíše ho na standardní výstup (stdout). Přesměrujeme ho pomocí > do souboru privatekey. |
Ze soukromého klíče můžeme odvodit veřejný klíč:
$ wg pubkey < privatekey > publickey (1)
| 1 | wg pubkey čte ze standardního vstupu (stdin) soukromý klíč a na standardní výstup vypisuje veřejný klíč. Přesměrujeme ze souboru na stdin < privatekey a předměrujeme stdout do souboru > publickey. |
Můžeme to také udělat jedním vrzem:
$ wg genkey | tee privatekey | wg pubkey >publickey
NAT a Firewall Traversal Persistence
Ve výchozím nastavení se WireGuard snaží být co nejtišší, když není používán; není to upovídaný protokol.
Z velké části přenáší data pouze tehdy, když si peer přeje posílat pakety.
Když není požádán o odeslání paketů, přestane odesílat pakety, dokud nebude znovu požádán.
Ve většině konfigurací to funguje dobře.
Pokud je však peer za NATem nebo firewallem, může si přát, aby mohl přijímat příchozí pakety, i když žádné pakety neodesílá.
Protože NAT a stavové firewally sledují „spojení“, pokud si peer za NAT nebo firewallem přeje přijímat příchozí pakety, musí udržovat mapování NAT/firewallu v platnosti tím, že bude pravidelně zasílat pakety udržující aktivitu.
Tomu se říká trvalé udržování života (keep alive).
Když je tato možnost povolena, paket udržující aktivitu je odeslán do koncového bodu serveru jednou za sekundu.
Rozumný interval, který funguje s širokou škálou firewallů, je 25 sekund.
Nastavením na 0 se tato funkce vypne, což je výchozí nastavení, protože většina uživatelů to nebude potřebovat, a díky tomu bude WireGuard o něco upovídanější.
Tato funkce může být specifikována přidáním pole PersistentKeepalive = do protějšku v konfiguračním souboru nebo nastavením persistent-keepalive na příkazovém řádku.
Pokud tuto funkci nepotřebujete, nepovolujte ji. Ale pokud jste za NAT nebo firewallem a chcete přijímat příchozí spojení dlouho poté, co síťový provoz utichl, tato možnost udrží „spojení“ v očích NAT otevřené.
Instalace
Wireguard beží na velkém množství operačních systémů (Windows, MacOS, Android, iOS, fůra Linuxů, OpenBSD, FreeBSD, OpenWRT, Termux), podrobnosti najdete na stránce autora Installation
Windows
Instalační soubor je ke stažení odsud.
macOS
Instalátor je ke stažení z App Store
Android
Instalátor na Play Store anebo APK soubor z webu Wireguardu
Linuxy
Debian
# apt install wireguard
Ubuntu
$ sudo apt install wireguard
Fedora
$ sudo dnf install wireguard-tools
Arch
$ sudo pacman -S wireguard-tools
OpenSUSE/SLE
$ sudo zypper install wireguard-tools
Slackware
$ sudo slackpkg install wireguard-tools
Gentoo
# emerge wireguard-tools
Pokud si linuxový kernel sestavujete sami, tak pro správné fungování Wireguardu musí být v kernelu následující volby:
-
CONFIG_WIREGUARD: Toto je povinnost, bez toho wireguard nebude fungovat.
-
CONFIG_IPV6_MULTIPLE_TABLES: Tato volba je nutná pro automatické směrování implicitní routy uvnitř wg-quick(8), není nutná pro fungování WireGuardu jako takového.
-
CONFIG_IP6_NF_RAW: Tato volba je nutná pro automatické směrování implicitní routy uvnitř wg-quick(8), není nutná pro fungování WireGuardu jako takového.
-
CONFIG_IP_NF_RAW: Tato volba je nutná pro automatické směrování implicitní routy uvnitř wg-quick(8), není nutná pro fungování WireGuardu jako takového.
Volby sestavení kernelu najdete v souboru /usr/src/linux/.config nebo můžete použít příkaz:
# cd /usr/src/linux
# make menuconfig
Konfigurace v menuconfig
CONFIG_WIREGUARD — vybereme "Device Drivers" dále "Network device support" a zde "WireGuard secure network tunnel".
CONFIG_IPV6_MULTIPLE_TABLES — vybereme "Networking support", dále "Networking options", dále "The IPv6 protocol" a nakonec "IPv6: Multiple Routing Tables".
CONFIG_IP6_NF_RAW — vybereme "Networking support", dále "Networking options", dále "Network packet filtering framework (Netfilter)", dále "IPv6: Netfilter Configuration" a nakonec volbu "raw table support (required for TRACE)"
CONFIG_IP_NF_RAW — vyberme "Networking support", dále "Networking options", dále "Network packet filtering framework (Netfilter)", dále "IP: Netfilter Configuration" a nakonec volbu "raw table support (required for NOTRACK/TRACE)"
# cd /usr/src/linux
# make && make install && make modules_install && grub-mkconfig -o /boot/grub/grub.cfg
OpenWRT
# opkg install wireguard
FreeBSD
# pkg install wireguard
OpenBSD
# pkg_add wireguard-tools
Příklady konfiguračních souborů
Příklady konfigurace budou na cvičení v OU5.
Gentoo Linux konfigurace
config_eth0="10.0.0.2/24"
routes_eth0="default via 10.0.0.138"
# lokalni sit
config_eth1="10.0.1.2/24"
# wireguard zakaznik 1
config_wg0="10.87.15.3/24"
wireguard_wg0="/etc/wireguard/wg0.conf"
# wireguard zakaznik 2
config_wg1="10.93.21.3/24"
wireguard_wg1="/etc/wireguard/wg1.conf"
# zakaznik 1
[Interface]
PrivateKey = privátní klíč (1)
#Address = 10.87.15.3/24
[Peer]
PublicKey = EfqcWnXxG628OtR8W2AkkO16A4mSARiHGwg05wO7exo=
EndPoint = 46.253.96.150:29361
AllowedIPs = 10.87.15.1, 192.168.105.0/24, 192.168.106.0/24, 192.168.108.0/24, 192.168.15.0/24, 192.168.20.0/24, 192.168.1.0/24, 192.168.2.0/24
PersistentKeepalive = 10
| 1 | Soukromý klíč nebudeme zveřejňovat. |
# zakaznik 2
[Interface]
PrivateKey = privátní klíč (1)
#Address = 10.93.21.3/24 (2)
[Peer]
PublicKey = XvOkUrcvPQByEUzTEBUkoNTA0t8Qnz4x1Tqi5cuAJGg=
PresharedKey = 7e5OpocC9RICfwRKili4ZQmSNHRoNDCzdsBuZGHVM7M= (3)
EndPoint = [2a02:17a6:2000:abcd::3]:31483 (4)
#EndPoint = 194.61.51.188:31483 (5)
AllowedIPs = 10.93.21.1, 192.168.30.0/24, 192.168.31.0/24
PersistentKeepalive = 10
| 1 | Soukromý klíč nebudeme zveřejňovat |
| 2 | V Gentoo se IP adresa nesmí použít, nastavuje se v /etc/conf.d/net |
| 3 | PresharedKey je symetrický klíč (tady je schválně poškozen), je to dodatečná ochrana proti postkvantové kryptoanalýze |
| 4 | Jako EndPoint je možné použít IPv6 adresu a posílat přes IPv6 tunel IPv4 provoz |
| 5 | Nebo je možné použít IPv4 adresu |
Fungující příklad v učebně ou5
Wireguard síť si zvolíme 172.16.48.0/24. Všechny operace budeme provádět jako root v terminálu. Roota získáme pomocí příkazu sudo su.
Stroj ou5-1
IP adresa stroje je 10.200.1.196. Wireguard bude poslouchat na UDP portu 55501.
# cd /etc/wireguard
# umask 077
# wg genkey > ou5-1.key
# wg pubkey < ou5-1.key > ou5-1.pub
Jakýmkoliv způsobem dostaneme veřejný klíč ou5-1.pub na stroj ou5-4 a tam vložíme do sekce [Peer].
A obráceně ze stroje ou5-4 dostaneme na stroj ou5-1 jeho veřejný klíč ou5-4.pub.
[Interface]
Address = 172.16.48.1
PrivateKey = GNtwpumvBYaAj/HBbE18Mtg8A7cOouumCpaOtKXlp0c=
ListenPort = 55501
[Peer]
PublicKey = MYqWCcQJ5O86wpsJ/46yJ1pqUC98bIrg6ZGaLp479Gg=
AllowedIPs = 172.16.48.4
EndPoint = 10.200.1.189:55504
PersistentKeepalive = 10
# wg-quick up wg0
Stroj ou5-4
IP adresa stroje je 10.200.1.189. Wireguard bude poslouchat na UDP portu 55504
# cd /etc/wireguard
# umask 077
# wg genkey > ou5-4.key
# wg pubkey < ou5-4.key > ou5-4.pub
[Interface]
Address = 172.16.48.4
PrivateKey = ADfdVIrkSoxl3wHfoU5GLAtQQmabjtsvckhQAzfLrkY=
ListenPort = 55504
[Peer]
PublicKey = GnS5Kd+0mOETHZbKMhynklGPszuvIos91RRIAEDFEjA=
AllowedIPs = 172.16.48.1
EndPoint = 10.200.1.196:55501
# wg genkey | tee ou5-4.key | wg pubkey > ou5-4.pub
# wg-quick down wg0.pub


Nastavení automatického spuštění wireguardu po zapnutí stroje (Debian)
Spouštění služeb na Linuxu typu Debian (Ubuntu, LinuxMint) se děje pomocí systemd.
Vytvoříme si službu /usr/lib/systemd/system/wireguard.service následujícího znění:
# wireguard.service
[Unit]
Before=network.target
[Service]
Type=oneshot
# wireguard wg0 -- nastartování
ExecStart=/usr/bin/wg-quick up wg0
# wireguard wg0 -- ukončení
ExecStop=/usr/bin/wg-quick down wg0
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Zapnutí služby po startu systému se děje příkazem:
# systemctl enable wireguard
Vypnutí služby (wireguard se nebude spouštět po startu):
# systemctl disable wireguard
Ruční nastartování wireguardu pomocí služby:
# systemctl start wireguard
Ruční zastavení wireguardu pomocí služby:
# systemctl stop wireguard
Poznámky
# usermod -a -G sudo uživatel