Wireguard web manažment

Ohľadom projektu wireguard som už napísal niekoľko článkov. Len v krátkosti spomeniem, že sa jedna o jednoduchú, rýchlu a bezpečnú virtuálnu privátnu sieť. Wireguard sa v linuxovom prostredí nasadzuje veľmi jednoducho a taktiež konfigurácia nie je veľmi zložitá. Ak sa kamarátime s linuxovým terminálom, tak VPN rozbehneme do niekoľkých minút. Dnes si však ukážeme ako spravovať sieť cez web manažment.

Obsah

Úvod do problematiky

Na spravovanie VPN sietí je dnes obrovské množstvo aplikácii, ale mňa najviac priťahovalo správa pomocou webu, to znamená, že som sa zameral na vyhľadávanie webovej aplikácie. Niektoré aplikácie boli veľmi dobre spracované, ale nie všetky mi vyhovovali. Mal som jednu dôležitú požiadavku a to bolo vytváranie viacerých sieťových rozhraní. Prevažná väčšina aplikácii fungovala v rámci jedného konfiguračného súboru (wg0). Prikladám tu zoznam aspoň niektorých zaujímavých projektov (inak je ich nespočetné množstvo)

Niektoré projekty sú rozsiahlejšie a ďaleko presahovali moje požiadavky. Tiež si treba všímať (väčšina projektov je hostovaná na githube, prip. na dockerhube) či je projekt živý. Ak autor na projekt nesiahol 1-2 a viac rokov, tak je veľmi pravdepodobné, že už ho ďalej nebude vyvíjať, príp. aktualizovať z pohľadu bezpečnosti.

Ako som už spomenul, niektoré projekty boli rozsiahlejšie ale ja potrebujem niečo jednoduché a účinné. Úplne najzákladnejšie požiadavky, ktoré by som prijal:

  • Vytváranie viacerých sieti
  • Vytváranie a mazanie užívateľov
  • Generovanie QR kódov
  • Editácia konfiguračných súborov cez web
  • Vytváranie IP tables cez web
  • Zobrazenie štatistík užívateľov
  • Manažment bez použitia SSH

Musím však napísať, že niektoré projekty som nerozbehol vôbec, niektoré neboli podľa mojich predstav a vyskúšal som ich len toľko, čo sa dá spočítať na prstoch jednej ruky. Už len vyhľadávanie a štúdium okolo toho mi zabralo spustu času. Napr. celkom sa mi pozdával projekt WGDashboard, ale ten bol napísaný pre Python 3.7 a s Python 3.11 som už mal problémy. Autor síce tvrdí, že už pracuje na projekte pre Python 3.12, ale zatiaľ je to v nedohľadne. Celkom slušne vyzeral aj Tunel, ale nakoniec som sa rozhodol pre wireguard_webadmin. Tento projekt spĺňal všetky moje požiadavky a jedna sa o celkom nový projekt. Či bude projekt živý aj o 2-3 a viac rokov nedokáže povedať nikto, ale teraz na ňom vývojár usilovne pracuje. Čo píše o wireguard_webadmin samotný autor:

Wireguard_webadmin je intuitívne webové rozhranie pre správu WireGuard VPN, navrhnuté tak, aby zjednodušilo konfiguráciu a dohľad nad VPN. Podporuje prístup viacerých používateľov a viacero inštancií WireGuard. Postavené na princípoch open source a ideálne pre správcov, ktorí hľadajú efektívne a užívateľsky prívetivé riešenie správy VPN.

Od známych dostávam často otázky, ako sa z vonka (WAN) napr. mobilom dostanem do mojej domácej siete LAN. Na túto otázku odpovedám protiotázkou, máš verejnú IPv4 adresu? Väčšina netuší o čom točím a odpoveď je „NEVIEM“. Ich jediným cieľom je dostať sa na domáci NAS, IP kameru a pod.

Možností ako sa z WAN dostať do domácej LAN je mnoho, napr. požiadať ISP o verejnú IPv4 adresu, prenajať si VPS, ktorý prevažne ponúka verejnú IPv4, kúpiť si službu VPN atď. Väčšinou ani jedna z možností nie je zadarmo. Dovolím si povedať, že každá z týchto služieb zhltne z peňaženky predplatiteľa 4-5€ mesačne. Za ďalšie, užívateľ týchto vymožeností musí mať aspoň aké-také zručnosti aby si dokázal nejaký bezpečný tunel vytvoriť. Ja som v minulosti už napísal na blogu článok Ako spojiť zariadenia na internete bez verejnej IPv4 adresy. V článku som popisoval ako si pomocou príkazov wg-quick vytvoríme a nakonfigurujeme celú VPN sieť.

Nikdy nie je na škodu naučiť sa principiálne veci ako sieť funguje a ako používať príkazy, ale keď máme možnosť webového klikania a znížené riziko pochybenia pri konfigurácii, tak prečo to nevyužiť.

WIreguard nemusí vždy fungovať len ako peer to peer, alebo server-client. Je množstvo scenárov ako zosieťovať zariadenia. Najjednoduchšia možnosť, ktorú som spomenul, je spojiť 2 zariadenia, čiže peer to peer, alebo client to client. ďalšie možnosti sú napr. server a viac klientov. Ďalej to môže byť, klient a sieť, alebo sieť-sieť, resp. prepojenie viac sieti. Iná možnosť je spojiť 2 siete cez nejaký VPS a využiť Zero Trust. To znamená, že do existujúceho WG tunela (šifrovacie kľúče sú umiestnené na troch miestách) vnoríme (incuding) ďalší WG tunel, ktorý bude mať šifrovacie kľúče len v koncových sieťach a tým znemožníme prevádzkovateľovi VPS odpočúvať komunikáciu.

Wireguard_webadmin

Ďalej napíšem ako som konkrétne postupoval pri inštalácii wireguard_webadmin. Tradične to inštalujem v LXC Debian 12 a vnútri použijem docker a docker compose. V návode na inštaláciu (resp. build) sú možnosti inštalácie aplikácie s nginx reverzným proxy, alebo bez proxy. Ja už reverzný proxy používam, tak som zvolil možnosť bez rev. proxy servera, docker-compose-no-nginx.yml.

Uvažujem, že LXC beží v LAN sieti s IP adresou

192.168.1.116

Najprv nainštalujeme docker (nebudem sem zbytočne kopírovať príkazy, keď na oficiálnom docker webe sú aktuálne príkazy). Pokiaľ sme docker a docker compose nainštalovali úspešne, tak inštalácia resp. build wireguard_webadmin bude hračka. Stačí použiť niekoľko jednoduchých príkazov

sudo su
git clone https://github.com/eduardogsilva/wireguard_webadmin
cd wireguard_webadmin
nano docker-compose-no-nginx.yml

docker-compose-no-nginx.yml môžeme trocha upraviť. Zmeny som vykonal len v dvoch riadkoch a jeden riadok som doplnil.

version: '3'
services:
  wireguard-webadmin:
    container_name: wireguard-webadmin
    restart: unless-stopped
    build:
      context: .
    environment:
      - SERVER_ADDRESS=192.168.1.116
      - DEBUG_MODE=True
    volumes:
      - wireguard:/etc/wireguard
      - static_volume:/app_static_files/
    ports:
      # Do not directly expose the Django port to the internet, use some kind of reverse proxy with SSL.
      - "192.168.1.116:5000:8000"
      # Warning: Docker will have a hard time handling large amount of ports. Expose only the ports that you need.
      # Ports for multiple WireGuard instances. (Probably, you just need one)
      - "51830-51849:51830-51849/udp"
      # Ports for port forwarding rules. Add your own ports here if you need them.
      - "8080-8089:8080-8089/tcp"
 
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
    command: /bin/bash /app/init.sh
 
  wireguard-webadmin-cron:
    container_name: wireguard-webadmin-cron
    restart: unless-stopped
    build:
      context: ./cron
      dockerfile: Dockerfile-cron
    depends_on:
      - wireguard-webadmin
 
volumes:
  static_volume: 
  wireguard:

V riadku 9 SERVER_ADDRESS nastavíme IP adresu na 192.168.1.116, čo je IP adresa nášho servera. V riadku 16 nastavíme tú istú IP adresu. Defaultný port je 8000:8000, ja som spravil len kozmetickú zmenu, pretože keď som testoval inú aplikáciu pre wireguard web manažment tak som používal port 5000. Takto som to mal nastavené aj na reverznom proxy servery a nemenil som to. Pokojne však môže ostať port 8000:8000 a do wireguard_webadmin by sme sa logovali na tomto porte. Plus doplnil som riadok 33 aby sa reštartoval aj wireguard-webadmin-cron. Teraz môžeme vytvoriť docker

Poznámka: Riadok 33 bol už vo ver. 0.9604 pridaný

docker compose -f docker-compose-no-nginx.yml up --build -d

Tento proces bude trvať niekoľko minút. Po vytvorení a spustení kontajnera zadáme do nášho obľúbeného webového prehliadača

192.168.1.116:5000

Konfigurácia wireguard_webadmin

Teraz si môžeme vo wireguard_webadmin vytvoriť administrátorské meno a heslo. Ihneď po prihlásení môžeme prejsť do nastavenia Server settings. Tam už uvidíme prednastavené hodnoty, ktoré môžeme kedykoľvek zmeniť. Neodporúčam zasahovať do kľúča (či už sa jedna o privátny, alebo verejný), pretože na základe privátneho kľúča sa generuje verejný a narušením jedného z nich môžeme mať problémy.

Dôležité je tiež nastaviť Public Address a Listen port. Už len pripomeniem, že na routery musíme nastaviť port forwarding na port, ktorý sme si zvolili (v mojom prípade 51830) a použitý bude protokol UDP. To by bolo k nastaveniu servera všetko.

Teraz v rámci wireguard_webadmin prejdeme na položku peers a môžeme kliknuť na Create peer. Zvolíme si len názov peera a všetko ostatné bude vygenerované automaticky. Peer IP Addresses and networks bude ďalšia v poradí. Napr. keď sme predtým vytvárali server s IP adresou 10.10.3.1/32, tak prvému peerovi bude pridelená IP adresa 10.10.3.2, druhému peerovi 10.10.3.3 atď. Teraz môžeme kliknúť na Submit

Budeme hneď presmerovaný na WireGuard Peer List, kde vidíme zoznam všetkých peerov pod jednou inštanciou (wg0). Čo najskôr klikneme na Update and restart service aby sa aplikovali zmeny. pri každom peerovi, máme 3 ikonky (viď červený rámik).

  • Prvá ikonka zobrazí QR kód s konfiguráciou pre klienta
  • Druhá ikonka ponuka stiahnutie konfig. súboru
  • Tretia ikonka povoľuje úpravu súboru

Najrýchlejšie otestovanie, či všetko správne funguje, je použitie mobilného telefónu s nainštalovanou aplikáciou (v mojom prípade pre Android) Wireguard a naskenovanie QR kódu v aplikácii. Okamžite by sa mal vytvoriť medzi serverom a klientom šifrovaný tunel a mal by prebehnúť handshake (podanie ruky).

Wireguard_webadmin má v menu okrem iného ešte jednu zaujímavú položku a to je Firewall. Tento firewall je založený na iptables, kde môžeme klikacou metódou vytvárať rôzne pravidlá. Myslím si, že tento firewall je veľmi silný nástroj na manažovanie a riadenie klientských kont. Môžeme zakazovať, alebo povoľovať čokoľvek a komukoľvek. Na obrázku sú prednastavené po-inštalačné pravidla.

Už len okrajovo spomeniem, že v menu je možné vytvárať užívateľské konta pre rôzne úrovne riadenia wireguard_webadmin aplikácie.

Nie málo zaujímavou položkou je tiež >_Console, čo je akoby webový linuxový terminál. Samozrejme tam nemôžeme vykonávať terminálové príkazy, ale máme možnosť zobraziť na štandardný výstup napr. iptables, ifconfig, wgshow, alebo otestovať ping či traceroute.

Ďalšia WG sieť

Ak by sme chceli vytvoriť ďalší WG server, tak klikneme na Server Settings a následne na „Create Instance„. Postupovať budeme ako pri konfigurácii prvého servera, len si musíme zvoliť novú IP adresu servera (siete) a nový port. Takýmto spôsobom vieme vytvoriť mnoho inštancii. V nastaveniach firewallu potom vieme nastaviť či máju byť siete od seba izolované, alebo nie.

Aktualizácia

Ak existuje nová aktualizácia wireguard_webadmin, tak v ľavej dolnej časti aplikácie sa zobrazí červené tlačidlo „Update available„, kde po kliknutí vidíme čo je obsahom aktualizácie pre každú novú verziu.

Na GitHube je samozrejme aj postup ako upgradovať aplikáciu. Podľa inštrukcii sa v termináli prepneme do adresára  wireguard_webadmin a zastavíme docker (sme prihlásený ako root, alebo použijeme sudo)

cd path/to/wireguard_webadmin
docker compose down

Dôležité je vytvoriť zálohu databázy ak by sa počas aktualizácie niečo pokazilo (cestu zálohy si nastavíme podľa seba (v nasledujúcom príkaze je cesta nasmerovaná do /root)).

tar cvfz /root/wireguard-webadmin-$(date +%Y-%m-%d-%H%M%S).tar.gz /var/lib/docker/volumes/wireguard_webadmin_wireguard/_data/

Teraz môžeme stiahnuť poslednú aktualizáciu a aplikáciu pomocou docker compose znova nasadíme

git pull origin main
docker compose -f docker-compose-no-nginx.yml up --build -d

Po aktualizácii prejdeme do webového rozhrania aplikácie a skontrolujeme, či funguje všetko správne. Ak zistíme nejaký problém, môžeme nahliadnuť do logu

docker compose logs

Záver

Wireguard_webadmin je veľmi pekne spracovaná web aplikácia. Responzivita je samozrejmosťou, čiže spravuje sa dobre aj na mobilných zariadeniach. Skutočne som z tejto aplikácie nadšený, pretože dlho som hľadal jednoduchú správu wireguard inštancii. V súčasnosti prebieha vývoj dosť intenzívne a do aplikácie pribúdajú nové funkcie, alebo sa fixujú nájdene bugy. Z toho vyplýva, že tento blogový článok sa môže stať časom neaktuálny a nebude zohľadňovať dôležité funkcie, ktoré autor pridá do aplikácie neskôr. Ďakujeme autorovi, že vyvíja open source a vďaka dockeru je nasadenie a aktualizácia triviálna.

Použitá literatúra

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *