V předchozím článku o WireGuardu jsme si představili tuto moderní a jednoduchou VPN, která sídlí v linuxovém jádře. Není sice ještě součástí hlavního vývojového stromu, ale v praxi to nepředstavuje velkou překážku. Budeme instalovat do Debianu, v ostatních distribucích to bude velmi podobné. Část s konfigurací je pak samozřejmě na všech systémech stejná.
Instalujeme do Debianu
Aktuální WireGuard naleznete v Debianu unstable a je připraven ve formě DKMS. Bude vám fungovat i ve starších Debianech: Jessie, Stretch nebo v aktuálním Buster. Instalace je docela přímočará a zabere vám chvilku.
Nejprve je potřeba do stávající instalace přidat repozitář pro unstable. To provedeme tak, že založíme nový soubor /etc/apt/sources.list.d/unstable-wireguard.list
a do něj zapíšeme cestu k novému repozitáři:
deb http://deb.debian.org/debian/ unstable main
Nechceme ovšem, abychom z unstable instalovali všechny balíčky, ale jenom ty ručně zvolené. Proto mu snížíme prioritu, aby při výběru vyhrávala naše současná větev. Do souboru /etc/apt/preferences.d/limit-unstable
zapíšeme následující tři řádky s pinem (více v samostatném článku):
Package: * Pin: release a=unstable Pin-Priority: 90
Máme hotovo, teď už stačí jen aktualizovat seznam balíčků a nechat nainstalovat balíček wireguard
. Jelikož ten se nachází jen ve větvi unstable, bude nainstalován automaticky odtamtud. Jde o metabalíček, který sebou pomocí závislostí přiveze balíčky wireguard-dkms
a také důležitý wireguard-tools
. Pro sestavení jaderného modulu budeme potřebovat ještě hlavičky pro naše jádro.
# apt update # apt install linux-headers-amd64 wireguard
Tím končí část věnovaná Debianu, zbytek článku už je distribučně nezávislý.
Klíče a IP… to je vlastně vše
WireGuard vyniká především svou jednoduchostí. Nezajímají ho uživatelské účty, certifikáty, autority a podobné věci. Každý komunikující partner je identifikován pomocí veřejného klíče a IP adres, které používá uvnitř VPN. Takhle jednoduché to je.
Volitelně může mít nastavenou také cílovou IP adresu, na kterou je směrována komunikace. WireGuard nezná žádné servery a klienty, všichni komunikující partneři jsou si rovni. Ve skutečném světě ale míváme často jeden koncentrátor a k němu několik komunikujících klientů. Ti pak mají na své straně nastavenou právě cílovou IP adresu centrálního bodu.
V případě komunikace určené k odeslání se v tabulce virtuálních IP adres uvnitř WireGuardu nalezne správný příjemce a jeho veřejný klíč se použije k zašifrování provozu. Ten se pak pošle buď na nakonfigurovanou skutečnou adresu nebo na tu, ze které klient komunikoval naposledy.
Pokud jsou pakety naopak přijímány, použije se místní privátní klíč k jejich dešifrování. Navíc WireGuard automaticky ověří, že odesílatel jako odchozí adresu použil skutečně tu, která mu v rámci VPN náleží. Pokud tomu tak není, pakety jsou odmítnuty. To je velmi užitečná vlastnost, která zajišťuje autenticitu provozu přicházejícího přes WireGuard. Veřejný klíč našeho partnera je pevně svázán s jeho konkrétní adresou (nebo rozsahem) a on si nemůže libovolně vymýšlet jinou nebo se dokonce uvnitř VPN vydávat za někoho jiného.
Manuální konfigurace
Pro konfiguraci se používají běžné síťové nástroje, protože WireGuard maximálně využívá stávajících součástí jádra. Pomocí utility ip
tedy můžeme vytvářet nová rozhraní, konfigurovat směrování a dělat vše tak, jak jsme zvyklí i běžných síťových karet.
Pro zbytek konfigurace, specifický právě pro WireGuard, slouží utilita s dvoupísmenným názvem wg
, která umí vše podstatné: generovat klíče a upravovat tabulku partnerů. Pomocí ní tedy dostaneme svou VPN do plně funkčního stavu.
Předvedeme si manuální konfiguraci, protože na ní se nejlépe ukazuje celý koncept. Protože ale jde o neperzistentní nastavení, hodí se spíše pro testovací účely. Pro použití v praxi pak lépe poslouží další metody popsané níže.
Nejprve tedy vytvoříme pár klíčů, které budeme na místním stroji používat. Totéž musíme samozřejmě udělat na všech počítačích, které s námi budou komunikovat. Vzájemně si pak vyměníme pouze veřejné klíče. Generování můžeme provést pomocí jednoho řádku, ve kterém vygenerujeme privátní klíč, uložíme ho na disk a rovnou z něj odvodíme klíč veřejný:
# wg genkey | tee wg-private.key | wg pubkey > wg-public.key
Tip: Pokud chcete hezkou adresu, můžete využít nástroj wireguard-vanity-address, který ve velkém generuje náhodné klíče a hledá v nich vámi zadaný řetězec. Pokud jej najde, vypíše vytvořený klíč na standardní výstup. Tahle si můžete připravit pěkné klíče, které pak v sobě třeba nesou název: PETRsAhXGpkLeoayaPQ+Rvk/+k1LR7XggPuawMFv1X8=
Poté už vytvoříme nové síťové rozhraní, kterému dáme nějaký název (třeba wg0
) a jako typ uvedeme wireguard
. Pokud hned první krok selže, pak nemáte WireGuard správně nainstalovaný nebo nemáte zavedený potřebný modul.
# ip link add dev wg0 type wireguard
V dalším kroku musíme na rozhraní přidat nějakou IP adresu. Můžeme používat samozřejmě IPv4 i IPv6, adresa by se ale neměla vyskytovat ani v jedné ze skutečných sítí, do kterých jsme my nebo naši partneři připojeni. Nastanou pak potíže se směrováním, protože klienti nebudou vědět, do které sítě dané pakety posílat.
# ip address add dev wg0 192.168.100.1/24
WireGuardu musíme předat klíče, které budou využívány při komunikaci. Na své straně přidáme ten privátní a k protistraně pak jen veřejný. Nejprve začneme našim počítačem, kterému nastavíme UDP port pro přijímání šifrované komunikace a privátní klíč:
# wg set wg0 listen-port 51820 private-key ./wg-private.key
Pro každého partnera, identifikovaného veřejným klíčem, nastavíme povolené IP adresy uvnitř VPN a volitelně také reálnou IP adresu a port.
# wg set wg0 peer TcCK+JJLHZcH9zdLRqtJ7cHiCJH2a6iBN2TjVi6zIxw= \ allowed-ips 192.168.100.2/32 endpoint 192.0.2.123:51820
Tento krok opakujeme pro každého partnera, se kterým budeme chtít komunikovat. Každý dostane svou IP adresu a s ní spojený veřejný klíč.
Posledním krokem je nahození celého rozhraní, čímž to vlastně celé spustíme:
# ip link set wg0 up
Pro přehled o současném nastavení WireGuardu můžeme opět použít příkaz wg
, který bez parametrů vypíše informace o všech nakonfigurovaných rozhraních a partnerech:
# wg interface: wg0 public key: xcC08j4bC0Z756eokOM1nezhbTU6k25XGSeTmEpVKUQ= private key: (hidden) listening port: 51820 peer: TcCK+JJLHZcH9zdLRqtJ7cHiCJH2a6iBN2TjVi6zIxw= endpoint: 192.0.2.123:51820 allowed ips: 192.168.100.2/32
Všimněte si, že privátní klíč je v tomto výpise skrytý. Můžete si jej na výslovné přání vypsat pomocí wg show wg0 private-key
nebo povolit jeho běžné zobrazování ve výpisu tak, že nastavíte proměnnou prostředí WG_HIDE_KEYS
na hodnotu never
.
Můžeme se také přesvědčit, že nám jádro při nahození linky upravilo směrovací tabulku a přidalo do ní správné cesty:
# ip route … 192.168.100.0/24 dev wg0 proto kernel scope link src 192.168.100.1
Stejný postup musí proběhnout i na druhé straně a pak můžeme začít komunikovat s protistranou pomocí bezpečného tunelu. Zároveň budeme přijímat jen pakety šifrované správným klíčem a používající předpokládanou IP adresu našeho partnera.
Konfigurační soubor
Manuální konfigurace není příliš praktická, existuje však možnost uložit si výše zmíněné konfigurační volby do souboru a z něj je nechat načítat pomocí utility wg-quick
. Ta se stará o správu celého rozhraní a umí vlastně provést všechny kroky, které jsme si před chvílí ukazovali.
Formát konfiguračního souboru je pevně dán a je velmi jednoduchý. Všechno pochopíte z následujícího příkladu, který kopíruje námi vytvořenou ruční konfiguraci:
[Interface] Address = 192.168.100.1/24 PrivateKey = QD8zBS9nCwzhBrr6W9rEtcegvCwRk1SDFZFjSL3bMGQ= [Peer] AllowedIPs = 192.168.100.2/32 PublicKey = TcCK+JJLHZcH9zdLRqtJ7cHiCJH2a6iBN2TjVi6zIxw= Endpoint = 192.0.2.123:51820
Konfigurační soubor pro rozhraní může být uložen kdekoliv, utilita wg-quick ho ale umí pohodlně najít v /etc/wireguard/
a pak vám stačí předat jen název rozhraní. Doporučuji tedy soubor hodit do /etc/wireguard/wg0.conf
. Pak bude stačit rozhraní nahodit pomocí:
# wg-quick up wg0
Výhodou konfiguračního souboru je, že je univerzální a lze jej importovat také do WireGuardu na dalších platformách: Android, macOS, iOS nebo Windows.
WireGuard pro road warriory
Předvedli jsme si propojení dvou počítačů pomocí tunelu. Uživatelé si obvykle pod jménem VPN automaticky představují režim, kdy se po světě pohybuje řada uživatelů (road warriors) a ti se potřebují připojovat k jednomu koncentrátoru pevně usazenému ve firmě. Už jsme si řekli, že rozdělení na server a klient ve WireGuardu neexistuje, ale čistě formálně si je takhle můžeme pojmenovat.
Z hlediska konfigurace nejde o nic složitého, vlastně stačí využít všechny výše uvedené postupy, na serveru nakonfigurovat všechny klienty bez pevné vnější adresy (Endpoint) a přidělit jim nějakou IP adresu v naší VPN.
Klienti naopak musí zvolit skutečnou IP adresu serveru a přijímat od něj pakety s libovolnou zdrojovou IP adresou. Tím se server ujme úlohy výchozí brány a začne nám jím proudit veškerý provoz do internetu. O správné směrování komunikace do skutečného internetu se pak postará wg-quick
pomocí chytré manipulace s policy routingem. Podstatná část klientské konfigurace pak bude vypadat takto:
[Peer] AllowedIPs = 0.0.0.0/0 PublicKey = xcC08j4bC0Z756eokOM1nezhbTU6k25XGSeTmEpVKUQ=
Vyzkoušejte Cloudflare WARP
Pro rychlé osahání WireGuardu jako VPN klienta je možné použít veřejnou bezplatnou službu Cloudflare WARP, která využívá WireGuard s drobnými úpravami. Pomocí neoficiálního shellového skriptu vygenerujeme pár klíčů, předáme je pomocí API do Cloudflare a obratem obdržíme IP adresy a další konfigurační údaje. Vygenerovaný konfigurační soubor pak můžeme použít k nastartování VPN pomocí nástroje wg-quick
.
$ wget https://gist.github.com/oskar456/594f1b5e84ca887c439fb457800b377e/raw/wgcf.sh To connect, run as root: # wg-quick up /home/user/.wgcf/wgcf.conf To disconnect, run as root: # wg-quick down /home/user/.wgcf/wgcf.conf $ sudo wg-quick up /home/user/.wgcf/wgcf.conf [#] ip link add wgcf type wireguard [#] wg setconf wgcf /dev/fd/63 [#] ip -4 address add 172.16.0.2 dev wgcf [#] ip -6 address add fd01:5ca1:ab1e:8027:6691:f8d2:1c5b:413a dev wgcf [#] ip link set mtu 1400 up dev wgcf [#] resolvconf -a wgcf -m 0 -x [#] wg set wgcf fwmark 51820 [#] ip -6 route add ::/0 dev wgcf table 51820 [#] ip -6 rule add not fwmark 51820 table 51820 [#] ip -6 rule add table main suppress_prefixlength 0 [#] ip -4 route add 0.0.0.0/0 dev wgcf table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0
Příště budeme integrovat
V příštím článku se podíváme na to, jak WireGuard integrovat do systému tak, aby například sám nabíhal při startu nebo abyste ho mohli ovládat standardními systémovými nástroji.