Hlavní navigace

Instalujeme WireGuard: návod pro VPN na distribuci Debian

Petr Krčmář

WireGuard sice stále ještě není součástí linuxového jádra, ale to nám vůbec nebrání v jeho nasazení. Ukážeme si, jak WireGuard nainstalovat do Debianu a jak díky němu zprovoznit jednoduchou VPN.

Doba čtení: 8 minut

Sdílet

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/+k1LR7XggPu­awMFv1X8=

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.