WireGuard přes web: Instalace a konfigurace WireGuard portálu

WIreGuard je moderní a výkonný VPN protokol, který nabízí možnost vytvoření bezpečné komunikace mezi zařízeními nebo celými sítěmi přes internet. Mezi jeho dominantní vlastnosti patří nízká latence a vysoká přenosová rychlost a to vše při vysoké úrovni zabezpečení. Využívá moderní šifrovací algoritmy jako ChaCha20 nebo Curve25519, které jsou optimalizovány právě pro takové využití.

Vývojáři cílili primárně na jednoduchost konfigurace a nasazení do provozu. Původně byl vytvořen pouze pro Linux ale momentálně nabízí aplikaci téměř pro všechny operační systémy včetně těch mobilních. K samotnému nastavení VPN komunikace nám stačí pouze veřejný klíč a IP adresa protější strany.


Proč využít webové rozhraní ke konfiguraci?

Samotná správa připojených klientů většinou probíhá přímo na WireGuard serveru úpravou konfiguračního souboru s příponou .conf. V případě, kdy ale potřebujete často upravovat nebo přidávat možné klienty, může být tento způsob zbytečně náročný. Právě z toho důvodu jsem začal pátrat po nějaké alternativě, která by mi umožňovala spravovat uživatele z pohodlí webového prostředí.

Pro začátek jsem si stanovil pár podmínek ať se mi lépe hledá

Musí to:

  • být pěkné
  • být přehledné i pro někoho jiného než mě
  • být bezpečné
  • umožňovat kompletní nastavení tak jako přímo v .conf souboru
  • umožňovat u komunikaci typu site-to-site

Nesmí to:

  • být náročné na instalaci
  • být placené
  • odesílat data třetím stranám nebo někam do cloudu

Mohlo by to:

  • umět běžet v Dockeru
  • mít databázi uživatelů
  • umožňovat uživateli stáhnout konfigurační soubor nebo QR kód bez nutnosti mého zásahu

Nalezené varianty

Po chvíli pátraní na internetu jsem objevil 3 různé varianty, které více či méně odpovídaly stanoveným požadavkům. Někomu může pro jeho využití vyhovovat i jiná varianta, než kterou jsem zvolil já.

WireGuard Easy

Jako první mě zaujal WireGuard Easy, už díky jeho názvu jsem chápal, že to bude snadné. Když jsem si prohlížel dokumentaci, zaujala mě i velice přívětivá administrace. Balíček pro Docker obsahuje i WireGuard server, není jej tedy nutné instalovat zvlášť.

Po prvotní instalaci a nastavení jsem vyzkoušel základní připojení, generování a stahování konfiguračních souborů a vše vypadalo v pořádku. V moment, kdy jsem se ale pokusil rozchodit komunikaci site-to-site, narazil jsem na problém. WireGuard Easy je natvrdo nastavený čistě pro komunikaci mezi serverem a uživateli. Není přes něj tedy možné směrovat jiné adresy, než přímo adresy připojených zařízení. To je způsobeno konfiguraci na serveru, kde je u Peeru v parametru AllowedIPs natvrdo nastavena jen jeho samotná adresa.

Díky tomuto nezdaru jsem se rozhodl posunout dál a vyzkoušet další nalezenou variantu. WireGuard Easy mě však zaujal svou jednoduchostí, umožňoval sice přihlášení pouze administrátora a možnost rozšířené konfigurace byla nulová. Dokážu si však představit nasazení pro nějakou velmi jednoduchou aplikaci.

WireGuard-UI

Další nalezenou variantu byl WireGuard-UI, který dle dokumentace sice umožňoval rozšířené nastavení serveru i klientů, avšak jeho mizerně vypadající rozhraní mě hned odradilo. Z tohoto důvodu jsem jej ani nezkoušel zprovoznit. Někomu by však mohla tato varianta vyhovovat, proto ji raději zmiňuji.

WireGuard Portal

A konečně náš vítěz, WireGuard Portal, který má opravdu povedené webové rozhraní a navíc umožňuje kompletní správu nad WireGuard serverem. Po větším prostudování dokumentace jsem si uvědomil, že splňuje všechny mé nároky a dokonce spoustu navíc. Umí běžet v Dockeru, má možnost přihlášení samotného uživatele, dokáže odesílat přihlašovací údaje mailem a všechna data ukládá v SQLite databázi.

Jako hlavní pozitivum bych určil možnost nasazení na již běžící WireGuard server, není tedy třeba vše konfigurovat znovu nebo nutit uživatele k migraci na jiný server. Nabízí toho ale mnoho, proto doporučuji navštívit GitHub projektu, kde se dozvíte mnohem více.


Instalace

Instalace asi není úplně přesný název, spíše se jedná o nahození potřebného pomocí souboru Docker compose. Pokud nevíte o co se jedná, doporučuji si něco málo nastudovat a poté se vrátit k tomuto návodu.

Instalaci provádím na pronajaté VPS, které má veřejnou IP adresu, na kterou jsem nastavil DNS záznam domény. Na serveru je nainstalovaný Ubuntu Server 22 a jedná se o nejnižší nabízenou variantu od FORPSI, nejedná se tedy o žádný výkonný stroj.

Dříve jsem zmínil, že WireGuard Portal umožňuje nasazení na již běžící server. V rámci tohoto návodu si ale právě takový server také vytvoříme.

Postup krok za krokem

1. Instalace Dockeru na server

Instalaci doporučuji provést na základě oficiálního návodu.

2. Vytvoření Docker sítě pro VPN

Tento krok není úplně nezbytný, avšak je důležité si uvědomit kam chceme a nechceme aby měl uživatel VPN přístup.

docker create network vpn

3. Tvorba adresáře pro naši Docker aplikaci

Stejně jak to doporučuje většina, tak i já doporučuji si vytvořit samostatnou složku pro naši aplikaci. Snažím se veškeré aplikace na serveru nějak logicky ukládat, proto volím adresář srv, kde vytvořím složku docker a v ní složku wireguard a rovnou se do ní přemístíme

mkdir -p /srv/docker/wireguard
cd /srv/docker/wireguard

Teď se nacházíme v naší složce pro celou aplikaci, v ní je nutné vytvořit další složky potřebné pro správnou funkci celé aplikace. V těchto složkách si po ukončení nebo restartu ukládá kontejner trvale svá data.

Konkrétně musíme vytvořit složku wireguard, která uchovává data samotného WireGuard serveru ale přistupuje k ní i náš WireGuard Portal. Dále vytváříme složku data, ve které si Portal ukládá svoji databázi.

mkdir wireguard
mkdir data
4. Úvodní konfigurace WireGuard serveru

Ve složce wireguard vytvoříme konfigurační soubor wg0.conf, který po spuštění serveru vytvoří rozhraní wg0 a přiřadí k němu konfiguraci obsaženou v souboru. V našem případě se jedná o konfiguraci pouze za účelem vytvoření rozhraní, protože následně si veškerou režii přebere přímo WireGuard Portal.

nano wireguard/wg0.conf

Pro vytvoření rozhraní sice musíme vložit privátní klíč, ten je však po spuštění Portalu nahrazen. Z toho důvodu můžeme vložit cokoliv. Další vložené parametry pak dokážeme upravit přímo přes webové rozhraní, takže opět nezáleží na tom co vložíme. Soubor uložíme a pokračujeme v další konfiguraci.

[Interface]
PrivateKey = yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=
Address = 10.8.0.1/24
ListenPort = 51820

5. Konfigurace WireGuard Portalu

Vytvoříme soubor config.yml, ze kterého je načítána konfigurace portálu. Tento soubor by měl být uložen v adresáři vedle docker-compose.yml, volba umístění je však na každém. Je důležité poté ale upravit právě docker-compose.yml aby obsahoval správnou cestu k souboru.

nano config.yml

Konfigurační soubor obsahuje základní nastavení celého WireGuard Portalu. Níže uvádím základní parametry s nastavením. Doporučuji se podívat na dokumentaci a přizpůsobit konfigurační soubor vašim požadavkům.

core:
  listeningAddress: :8123 # Port
  externalUrl: http://vpn.mojedomena.cz # WWW adresa
  title: Moje VPN 
  company: Firma s.r.o.
  adminUser: mail@example.cz # Administrátorský mail
  adminPass: heslo # Administrátorské heslo
  mailFrom: Moje VPN <vpn@mojedomena.cz>
  backgroundTaskInterval: 60 # Interval zápisu konfigurace v sekundách
database:
  typ: sqlite
  database: data/wg-portal.db # Umístění databáze
wg:
  devices:
    - wg0
  defaultDevice: wg0 # Nastavení rozhraní
  configDirectory: /etc/wireguard
  manageIPAddresses: true

6. Vytvoření docker-compose.yml a spuštění kontejnerů

Vytvoříme soubor docker-compose.yml, který sdružuje naše 2 aplikace a umožní nám spustit kontejnery v závislosti na sobě.

nano docker-compose.yml

Níže vytvořený docker-compose.yml soubor obsahuje konfiguraci obou kontejnerů. Za zmínku stojí převážně parametr network_mode u kontejneru wg-portal, ten nám totiž definuje ať kontejner využívá síťové rozhraní kontejneru s WireGuard serverem. To nám umožní přímý přístup k rozhraní wg0, které se po spuštění vytvoří.

services:
  wg-quick: # Kontejner s WireGuard serverem
    image: procustodibus/wireguard
    container_name: wg-quick
    cap_add:
    - NET_ADMIN # Povolení přístupu k síťovým prvkům
    ports:
    - 51820:51820/udp # Port pro WireGuard
    - 8123:8123 # Port pro webové rozhraní
    volumes:
    - ./wireguard:/etc/wireguard
    sysctls:
      - net.ipv4.ip_forward=1 # Povolení směrování IP 
      - net.ipv4.conf.all.src_valid_mark=1
    networks:
      - vpn

  wg-portal:
    image: wgportal/wg-portal:v1
    container_name: wg-portal
    restart: unless-stopped
    depends_on:
      - wg-quick # Závisí na wg-quick kontejneru
    cap_add:
      - NET_ADMIN
    volumes:
      - ./wireguard:/etc/wireguard
      - ./data:/app/data
      - ./config.yml:/app/config.yml
    network_mode: "container:wg-quick" # Využívá síť wg-quick kontejneru

networks:
  vpn:
    external: true 

Původní dokumentace k projektu Wireguard Portal sice počítá s napojením na WireGuard server běžící přímo na serveru. Tento způsob se mi ale moc nezamlouval a nesplňoval požadavky, aby vše běželo v Dockeru. Dohledal jsem tedy obraz kontejneru podporující rozšířené funkce WireGuardu wg-quick. Ty jsou nutné, protože s nimi pracuje samotný WireGuard Portal.

Teď už stačí jen zavřít, uložit a spustit na pozadí.

docker compose up -d

Po spuštění by měl být dostupný web WireGuard Portal na zvolené doméně nebo IP adrese.


Konfigurace přes webové rozhraní

Konečně jsme se dostali do webového prohlížeče, kde můžeme začít konfigurovat celý VPN server. Nejdříve je však nutné nakonfigurovat server tak, aby bylo možné začít vytvářet uživatele, kteří se mohou připojit. Zároveň bych rád i popsal možnost propojení dvou různých LAN sítí pomocí našeho serveru.

Po otevření webového rozhraní na zvolené doméně nebo IP adrese je nutné se přihlásit administrátorskými údaji, které jsme vyplnili v souboru config.yml.

Konfigurace serveru

Použité obrázky pochází z již nakonfigurovaného serveru, z toho důvodu jsem musel zakrýt důležité údaje. Pokusím se však popsat všechny podstatné parametry jak nejlépe to půjde.

Konfiguraci serveru provedeme v záložce WIREGUARD ADMINISTRATION, kde můžeme vidět tabulku nastaveni rozhraní a tabulku zobrazující uživatele, jejich adresy a aktuální stav.

Zde budete pravděpodobně vyzvání, aby jste provedli konfiguraci rozhraní wg0, to provedete kliknutím ikonu nastavení v pravém horním rohu tabulky s rozhraním.

V konfiguraci rozhraní si můžete všimnout, že privátní klíč je skutečně odlišný od toho, který jsme určili na začátku v souboru wg0.conf.

Jednoduchý popis základních parametrů:
  • Private Key – privátní klíč serveru
  • Public Key – veřejný klíč serveru vygenerovaný z privátního klíče
  • Listen port – port WireGuard serveru, musí souhlasit s portem ze souboru docker-compose.yml
  • Server IP address – IP adresa serveru v rámci VPN sítě
  • Public Endpoint for Clients – veřejná IP adresa nebo doména serveru, která bude využita k připojování klientů
  • DNS Servers – definuje DNS servery pro připojené uživatele
  • Default allowed IPs – globální parametr, který nastavuje povolené adresy na straně klienta
  • Persistent Keepalive – nastavuje interval v sekundách, který slouží k udržení spojení mezi klientem a serverem
  • Post Up – příkaz, který se vykoná po připojení uživatele do sítě, zde se upraví firewall pro možnost komunikace mezi klienty i ven do internetu
  • Post Down – příkaz, který se vykoná po odpojení, prakticky ruší všechny nastavené pravidla

Konkrétně nastavení Post Up je na každém, já poprosil ChatGPT aby mi vygeneroval pravidlo co umožní komunikaci v rámci VPN sítě i směrem do internetu.

Konfigurace běžného uživatele

Konfigurací běžného uživatele mám na mysli pouze připojení jednoho zařízení do VPN sítě např. notebook nebo telefon. Jedná se nám tedy jen o to, aby měl přístup k ostatním zařízením popřípadě serverům umístěním v rámci VPN sítě.

Takového uživatele vytvoříme velmi jednoduše, pouze kliknutím na ikonu v rámci hlavní administrátorské stránky. Vše je velmi intuitivní, takže po vyplnění emailu uživatele a potvrzení jména ihned dostáváme konfiguraci ke stažení. Zároveň máme možnost i načíst konfiguraci pomocí QR kódu. Webové rozhraní nám samozřejmě umožňuje i upravovat parametry každého uživatele zvlášť.

Konfigurace site-to-site

V rámci této konfigurace jde o propojení dvou různých LAN sítí tak, aby spolu mohly zařízení v rámci obou sítí komunikovat. K tomu využijeme jako prostředníka náš vytvořený VPN server. Toto je vhodné řešení zejména, pokud by ani jeden z routerů LAN sítí neměl přidělenou veřejnou IP adresu.

Postup vytvoření nového uživatele je stejný jako u běžného zařízení, tedy přidáme uživatele na administrátorské stránce. Co se ale liší, je nastavení parametru Extra Allowed IPs, který upravuje povolené IP adresy na straně serveru. Tento parametr nám právě WireGuard Easy neumožňoval změnit.

Pro správné pochopení problematiky je důležité si vysvětlit rozdíl mezi Allowed IPs na straně serveru a na straně klienta:

  • Na straně klienta nám tento parametr určuje, ke kterým IP adresám nebo rozsahům IP adres má uživatel přístup a jaké má tedy směrovat právě přes WireGuard rozhraní. Pokud by jsme tedy nastavili IP adresu 0.0.0.0/0, klient by veškerou komunikaci směroval skrze náš VPN server.
  • Na straně serveru však tento parametr určuje jaké dotazy v rámci VPN sítě směrovat na tohoto klienta. Běžně je tento parametr nastaven v podobě IP adresy klienta s maskou /32 např. 10.8.0.2/32. To nám říká, že pokud se někdo v rámci VPN sítě pokusí vyslat požadavek přímo na tuto adresu, bude přesměrován na tohoto klienta. Když tedy přidáme například IP adresu 192.168.0.0/24, všechny požadavky ve VPN síti na IP adresu v tomto rozsahu (192.168.0.1 – 192.168.0.255) budou přesměrovány tam.

Tohoto využíváme právě pro nasměrování různých požadavků z jedné do druhé LAN sítě nebo i ze samotné VPN sítě do LAN.

Nastavení routeru

Nastavení routeru se samozřejmě liší dle typu. Já osobně rád využívám Mikrotik, právě pro jeho téměř neomezené možnosti různých nastavení. Proto dále popíšu pouze stručný postup pro tento druh zařízení.

  1. Na routeru vytvoříme nové WireGuard rozhraní a jednoduše vložíme parametry z webu WireGuard Portal.
  2. Upravíme routy tak, aby žádané adresní rozsahy směrovaly na konkrétní IP adresu v rámci VPN sítě.
  3. Přidáme firewall pravidla, které nám povolí jednak příchozí WireGuard komunikaci tak komunikaci v rámci adresních rozsahů.

Téměř totožné nastavení je nutné provést na druhém routeru s rozdílem routování. Tedy přidat uživatele ve WireGuard portálu, nastavit rozhraní atd.

Jen pro konkrétní nastavení routeru by se dal napsat celý další návod.


Závěr

Jak lze z návodu vidět, instalace WireGuard Portalu je sice náročnější ale ušetřený čas se správou uživatelů to několikrát vynahradí. Osobně portál využívám již pár dní a právě propojení domácí a pracovní sítě si nemůžu vynachválit. Vše je nerozeznatelně svižné, jak kdybych seděl v kanceláři.

Dále bych rád věnoval ukázce správy uživatelů a nastavení mailového serveru pro automatické odesílání konfigurací uživatelům.


Zdroje

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *