Lokale Linux applicaties publiek toegankelijk maken zonder port forwarding & UPnP, met statisch IP-adres, en met bescherming van lokale IP-adres

Dit artikel legt uit hoe je applicaties die je lokaal beheerd op een Linux systeem, in dit geval een Ubuntu Server 22.04, publiek toegankelijk kunt maken zonder port forwarding & UPnP, met statisch IP-adres, en met bescherming van je lokale IP-adres.




In vele gevallen is port forwarding het meest toegankelijke en voor de hand liggende, deze tutorial vereist technische kennis op het vlak van systeem administratie.

Deze tutorial is het meest toepasselijk indien je applicatie(s) op een apart apparaat (of meerdere apparaten) gehost worden en deze zich op je lokale netwerk bevindt. Het is mogelijk de instructies toe te passen op je eigen apparaat indien daar je applicatie draaiende is, het is belangrijk om hierbij te vermelden dat het volledige netwerk- & internetverkeer van het apparaat onder de configuraties valt die aangebracht zullen worden, afscheiding of onderscheid tot stand brengen is mogelijk maar komt niet aan bod in dit artikel. 

Om de applicatie(s) op je apparaat publiek toegankelijk te maken zullen volgende zaken aan bod komen:

  • het aanmaken en configureren van je eigen VPS (Virtual Private Server) met WireGuard VPN (Virtual Private Network) server
  • het installeren van de WireGuard VPN client en aanverwante packages op je apparaat
  • het configureren van de VPN client
  • verbinding tot stand brengen tussen de client en je eigen VPN server
  • het testen van de verbindingen en de configuraties

Om dit alles mogelijk te maken wordt gebruik gemaakt van een nieuwe VPN server die je zelf beheerd.
Deze extra VPS bevindt zich in de cloud, waarbij de toegang en het beheer volledig van jou zijn.



Voordelen

  • bescherming van je lokale IP-adres
  • statisch IP-adres
    • kan indien gewenst aan een domeinnaam gekoppeld worden
  • geen port forwarding vereist
  • geen UPnP / NAT-PMP vereist (veiliger)
    • routes (local to external port mappings) worden manueel bepaald
      • geen veranderende publieke poort
  • je eigen VPS met VPN server 
    • kan gebruikt worden om je internetverkeer van andere apparaten te beschermen
    • volledig onder eigen beheer 
    • uitbreidbaar middels floating IPs
    • toegankelijk maken van applicaties
    • mogelijkheid tot load balancing door reverse proxy

Nadelen

  • aparte VPN server vereist die als reverse proxy fungeert
  • configuratie en systeembeheer vereist
  • minder dynamisch dan UPnP / NAT-PMP



Benodigdheden

  • het apparaat
    • fysiek of middels een SSH verbinding bereikbaar
    • heeft toegang tot het internet
    • Linux distro (in dit artikel Ubuntu Server >=22.04)
  • basiskennis systeem administratie
    • configuraties gebeuren via een command line interface (CLI)
    • configuraties gebeuren via een web applicatie/interface
  • basiskennis over netwerken
  • een persoonlijke domeinnaam (niet verplicht maar sterk aangeraden)


Tijdens het volgen van deze tutorial worden wijzigingen aangebracht op je apparaat, (indien deze reeds geconfigureerd is) dien je zelf te controleren dat er geen conflicten plaatsvinden of bestaande configuraties overschreven worden.
Dit artikel maakt gebruik van een nieuwe Ubuntu Server 22.04 instantie.

Stap 1 - VPS met WireGuard VPN server aanmaken

Om op een eenvoudige wijze een VPS aan te maken kan dit bijvoorbeeld door gebruik te maken van cloud provider Hetzner.

Eenmaal de VPS is aangemaakt dient er verbonden te worden middels SSH om de configuraties in te stellen die het mogelijk maken om de web applicatie te gebruiken, waar de meeste VPN-gerelateerde configuraties aangebracht en beheerd kunnen worden.

Om aan de slag te gaan heb je dus een account bij Hetzner nodig.


Eenmaal je geregistreerd bent bij Hetzner navigeer je naar het cloud management portaal en maak je een nieuwe VPS aan waar de WireGuard VPN server op voorgeinstalleerd wordt.

Maak allereerst een nieuw project aan waar de VPS in aangemaakt kan worden.

Geef deze een naam naar keuze.


Open het project en maak een nieuwe VPS aan door te klikken op "Create Resource" en vervolgens "Servers".

Kies vervolgens het datacenter waar de VPS aangemaakt dient te worden, om latency zo laag mogelijk te houden kan men een datacenter dichtbij kiezen.
Selecteer vervolgens Ubuntu 24.04 als operating system (OS).

Bepaal vervolgens de systeem specificaties door het VPS type te selecteren.
Voor dit doeleind is een instap Shared VPS met vCPU en x86 (Intel of AMD) architectuur geschikt.
Indien nodig kan dit later aangepast worden in het cloud management portaal.

Controleer vervolgens dat er een IPv4 en IPv6 adres toegekend zal worden aan de VPS. Indien je over een SSH key beschikt kan deze hier geupload worden, indien niet verloopt authenticatie middels een wachtwoord dat we zodadelijk genereren in het cloud management portaal.

Controleer vervolgens dat er geen volumes & firewalls toegekend zijn.
Indien gewenst schakel je de dagelijkse backup in.

Controleer vervolgens dat er geen placement groups, labels of cloud config toegekend is.

Kies een naam voor de VPS en maak vervolgens de VPS aan met de "Create & Buy now" knop.

De VPS wordt aangemaakt, dit kan enkele minuten duren.
Indien de status indicator groen is (zie #1) is de VPS klaar voor ingebruikname.
Klik vervolgens op de naam van je VPS om de detail weergave te openen (#2).

Navigeer naar het "Rescue" tabblad en klik vervolgens op "Reset Root Password", indien de melding weergegeven wordt die aangeeft dat dit geslaagd is (#4) kopieer en bewaar je de gebruikersnaam, wachtwoord (#5) en het IPv4 adres (#6) op een veilige locatie. Deze gegevens worden zodadelijk gebruikt om in te loggen op de VPS via een SSH verbinding.

Indien melding #4 niet verschijnt maar er wel een gebruikersnaam en wachtwoord weergegeven wordt (#5) dien je nogmaals het wachtwoord te resetten. (Het resetten van het wachtwoord kan soms mislukken indien de VPS net opgestart is.)


Hoera! Tijd om verbinding te maken met de VPS door middel van een SSH verbinding. 

Hiervoor hebben we een command prompt nodig.

  • Windows: zoek voor "cmd" en open "Command Prompt"
  • macOS: zoek voor "terminal" en open "Terminal"
  • Linux: zoek voor "terminal" en open "Terminal"

In de command prompt geef je volgend commando in:

ssh <username>@<ipv4_address>

Vervang hierbij <username> door de username en <ipv4_address> door het IPv4 adres van je VPS.
In dit geval wordt dat dus: 

ssh root@94.130.104.83

Voer het commando uit (ENTER) en bevestig de identiteit van de VPS door "yes" in te voeren en dit te bevestigen (ENTER). De identiteit van de VPS wordt opgeslagen op je apparaat, indien een man-in-the-middle attack zou plaatsvinden (identiteit VPS komt niet meer overeen) bij toekomstige verbindingen wordt je hiervan op de hoogte gebracht.

Geef vervolgens het wachtwoord in (plakken met rechtermuisklik) en bevestig met ENTER. (Het wachtwoord of de gecensureerde karakters worden niet weergegeven in de command prompt, bevestigen kan direct na het plakken. Zie #1)

Een SSH verbinding is tot stand gebracht indien je het volgende welkomstbericht te zien krijgt (Zie #2), alle commando's die vanaf nu uitgevoerd worden gebeuren op de VPS en niet op je eigen apparaat. Te herkennen aan de gebruikersnaam en servernaam die gewijzigd zijn (Zie #3, root@wg-vpn-server-tutorial).

Om het IPv4 en IPv6 adres van de VPS te controleren kan men volgende commando's uitvoeren (Zie #1):

curl ip.me --ipv4

curl ip.me --ipv6

Om de sessies van de VPS weer te geven kan volgend commando uitgevoerd worden (Zie #3):

who

(Eigen IP-adres gecensureerd in dit voorbeeld):


Indien we onverwachts verbinding met de VPS verliezen is het handig om na het opnieuw verbinden verder te kunnen met dezelfde inhoud in de command prompt, en om te garanderen dat lopende commando's niet abrupt verbroken worden door een verlies van verbinding, openen we allereerst een tmux sessie met volgend commando:

tmux

Indien we de verbinding met de VPS verliezen kan, na het opnieuw verbinden met het bovenstaande SSH commando, de tmux shell sessie hervat worden met volgend commando

tmux attach  

Scrollen inschakelen in een tmux shell kan met CTRL+[.
Uitschakelen kan vervolgens met "q".

Hoera! Nu kunnen we overgaan tot het installeren van de WireGuard VPN server op de VPS.

Om te garanderen dat alle commando's (in correcte volgorde) uitgevoerd worden wordt er gebruik gemaakt van het installatie script dat aangeboden wordt door construct0, welke een aangepaste en uitgebreidere versie van het script is dat door Hetzner gebruikt wordt om een WireGuard VPN server met web interface aan te maken.

Voer volgend commando uit om het script op te slaan op de VPS:

curl -o- https://raw.githubusercontent.com/construct0/sysadmin/refs/heads/main/wg_server_install.sh > wg_server_install.sh

Bekijk het bestand in de huidige folder vervolgens met:

ls -l

Optioneel: bekijk de inhoud van het script

Om te weten wat er precies uitgevoerd zal worden kan het script bekeken worden door deze te openen met tekstbewerker nano:

nano wg_server_install.sh


De tekstbewerker kan gesloten worden met CTRL+X, indien er per ongeluk wijzigingen werden aangebracht druk je vervolgens op "n" op je toetsenbord om deze niet op te slaan. 

Maak het script vervolgens uitvoerbaar op de VPS:

chmod +x wg_server_install.sh

Bekijk het bestand in de huidige folder opnieuw en verifieer dat de rechten zijn aangepast:

ls -l

Start daarna de installatie en configuratie met:

clear && bash wg_server_install.sh

De installatie van de benodigde software gaat van start, dit kan enkele minuten in beslag nemen. Na installatie zal gevraagd worden om deze in te stellen.

Software vereist om de web interface te compilen wordt geinstalleerd, gevolgd door de web interface broncodes (wireguard-ui).

De assets (afbeeldingen, styling, ..) worden gegenereerd & gebundeld.

Vervolgens worden configuratie-bestanden en folders aangemaakt, een willekeurige session secret gegenereerd en opgeslagen, en het IPv6 adres toegevoegd aan de WireGuard network interface configuratie.

Het publieke IPv4 adres van de VPS wordt tot slot ter informatie meegedeeld.

De installatie van de software is hierbij geslaagd, je krijgt een invoerveld te zien die vraagt op welke manier je de web interface wenst te bereiken.
Dit kan het IPv4 adres zijn (94.130.104.83 in dit geval), of een domeinnaam die je bezit.

In dit geval wordt ter illustratie het IPv4 adres gebruikt, in de optionele Stap 2 wordt er getoond hoe men vervolgens kan upgraden naar een domeinnaam.

Geef vervolgens een gebruikersnaam en wachtwoord op om mee in te loggen op de web interface. (Wachtwoord-karakters worden niet weergegeven in de CLI.)

Indien je een domeinnaam ingegeven hebt wordt er ook gevraagd een email adres in te voeren. Daar worden belangrijke meldingen over je SSL certificaat naar verstuurd.

Controleer en bevestig vervolgens met "y" om de configuratie af te ronden.
De WireGuard network interface wordt aangemaakt, een self-signed SSL certificaat wordt gegenereerd, de web service en wireguard-ui worden opgestart en de fingerprint van het certificaat wordt meegedeeld.


Hoera! De installatie is geslaagd.

Open een nieuw venster in je web browser en navigeer naar het IPv4 adres of de domeinnaam die je zojuist ingesteld hebt.

Indien je geen domeinnaam hebt ingesteld krijg je een waarschuwing over het SSL certificaat, dit aangezien het niet verbonden is aan een register zoals dat bij een domeinnaam wel het geval is.

Om veilige toegang te garanderen dient de fingerprint die meegedeeld werd door de VPS overeen te stemmen met de fingerprint van het certificaat dat de browser ontvangen heeft. 

Open in de browser de detailweergave van het SSL certificaat.

Vergelijk de fingerprints, in dit geval is het een match.

Sluit de detailweergave & ga verder naar de web interface.

Log vervolgens in met de ingestelde gebruikersnaam en wachtwoord.

 

De management applicatie opent zich.


Stap 2 - (Optioneel) Upgraden naar een domeinnaam

Om de web interface te raadplegen via een domeinnaam die je bezit dient deze te verwijzen naar het IPv4 en/of IPv6 adres van de VPS.

Dit kan door een DNS record van type A (IPv4) en/of AAAA (IPv6) toe te voegen. Ter illustratie, het toevoegen van een A record met Cloudflare.

DNS records beheren: zie het management portaal van je registrar of van de derde partij indien je de nameservers gewijzigd hebt. 

Voeg een nieuwe DNS record toe met de weergegeven configuraties, kies een subdomein naam naar keuze. 

Open de command prompt en voer volgend commando uit: 

clear && bash wg_server_install.sh

Dezelfde procedure van Stap 1 wordt doorlopen, geef de domeinnaam op indien hier om gevraagd wordt. Indien je domeinnaam niet verwijst naar de VPS wordt dit meegedeeld.

Indien dat wel het geval is krijg je bevestiging, geef vervolgens "n" in om het huidige wachtwoord van het admin account te behouden. 

Voer je email adres in. Hier worden SSL certificaat notificaties naar verstuurd.

Controleer en bevestig vervolgens de gegevens.


Hoera! De wijziging werd doorgevoerd.
Open een nieuw venster in je browser en bezoek de domeinnaam.
Log vervolgens in om de management applicatie te gebruiken.



Stap 3 - WireGuard VPN server instellen via web interface

WireGuard Server

Open de web interface en navigeer naar de "WireGuard Server" pagina.
Hier kan de WireGuard network interface geconfigureerd worden.

Breng volgende wijzigingen aan:

  1. Verwijder de 2 bestaande "Server Interface Addresses"
  2. Voeg vervolgens 1 nieuw adres toe: 10.0.10.1/24
  3. Vul het "Post Up Script" veld in met:
    • iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  4. Vul het "Post Down Script" in met:
    • iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


Klik vervolgens op "Save".

Service Interface Address(es)

Dit is het IP adres van de WireGuard network interface, na totstandbrenging van een verbinding door de VPN client passeert het internetverkeer via deze interface.

PostUp Script

Zorgt ervoor dat internetverkeer van VPN clients correct:

  • doorgestuurd kan worden (packet forwarding)
    • waarbij het IP adres van de VPN server bij de bestemmeling als afzender aanzien wordt

PostDown Script

Zorgt ervoor dat de packet forwarding configuratie van PostUp ongedaan wordt gemaakt.


Open de command prompt van de VPS en controleer het IP adres van de wg0 interface. Indien deze niet 10.0.10.1 is (#2) dienen we de WireGuard interface te vernieuwen.

Bekijk de network interfaces van de VPS:

ifconfig

In dit geval komt dit niet overeen, verwijder de WireGuard interface:

wg-quick down wg0

Maak de interface opnieuw aan:

wg-quick up wg0

Bekijk en controleer de wg0 interface opnieuw:

ifconfig



Global Settings

Open de web interface en navigeer naar de "Global Settings" pagina. 

Voeg indien gewenst IPv4 DNS servers toe. IPv6 wordt in Stap 8 uitgeschakeld op je apparaat.

Endpoint Address

Het aanspreekpunt voor VPN clients om een VPN verbinding tot stand te brengen.

DNS Servers

Default VPN client profiel DNS servers.
Clients kunnen hier van afwijken indien de configuratie ter hunne zijde aangepast wordt.

MTU

Bepaalt de maximale grootte van een internet packet.

Persistent Keepalive

Houdt de verbinding tussen VPN client en VPN server actief indien er geen verzoeken plaatsvinden.

Firewall Mark

Een label dat toegevoegd wordt aan internet packets.

Table

Bepaalt welke ip routing tabel er gebruikt wordt.

Wireguard Config File Path

De locatie van de WireGuard network interface configuratie op de VPS.


Stap 4 - Toevoegen van een VPN client profiel via de web interface

Open de web interface en navigeer naar de "WireGuard Clients" pagina.

Voeg een nieuwe VPN client (configuratie) toe door op "New Client" te klikken.
Geef vervolgens een naam aan de client, bijvoorbeeld "webserver" indien je lokale apparaat zal dienen als website host.

Het IPv4 adres binnen het subnet van de VPN server werd automatisch ingevuld, indien actief op een apparaat zal deze aanspreekbaar zijn door de VPN server met adres 10.0.10.2.

Bevestig vervolgens om de VPN client toe te voegen.

Bevestig vervolgens de configuratie door op "Apply Config" te klikken, en bevestig met "Apply" in de popup window. 

Download vervolgens het configuratie bestand om deze in Stap 7 toe te passen op je apparaat.
Open alvast het bestand met een tekst bewerker (bijvoorbeeld Notepad of Text Editor).

 


 

Stap 5 - Rechtstreeks bepalen van extern IP-adres mogelijk maken

Indien je op je apparaat waar de VPN client op ingesteld zal worden wenst om je publiek waarneembare IP-adres te bepalen zonder hiervoor afhankelijk te zijn van derde partijen dan kan dit door op je VPS miniupnpd te configureren voor dit doeleind.

(!) Belangrijk om hierbij te vermelden is dat er louter gebruik wordt gemaakt van miniupnpd voor dit doeleind, en niet voor het gebruik van het UPnP protocol.

De verbinding wordt tot stand gebracht door middel van de WireGuard voorzieningen; de VPS wordt door configuratie en activering van miniupnpd aanzien als een UPnP apparaat (Internet Gateway Device) op het lokale netwerk van je apparaat, zelfs wanneer deze door diens configuratie UPnP verzoeken blokkeert.

Met andere woorden, miniupnpd wordt gebruikt voor peer discovery & het aanvragen van het externe IP-adres aan de VPN server, welke op zijn beurt het externe IP-adres aanvraagt bij de ISP.

Broncode:
miniupnpd/upnpsoap.c:GetExternalIPAddress > miniupnpd/getifaddr.c:getifaddr

Voer volgende commando uit op de VPS om miniupnpc en miniupnpd te installeren:

cd && clear && apt-get update && apt install miniupnpc miniupnpd -y

Bekijk de geinstalleerde versie van de miniupnp daemon (miniupnpd) en de systeem status door volgend commando uit te voeren:

miniupnpd --version && echo -e "\n\n" && systemctl status miniupnpd.service

De versie wordt weergegeven (#1), en de status van miniupnpd - welke momenteel uitgeschakeld (#2 - wordt niet automatisch opgestart) en inactief (#3) is.

Maak vervolgens een backup van de default configuratie:

mv /etc/miniupnpd/miniupnpd.conf /etc/miniupnpd/miniupnpd.conf.backup && touch /etc/miniupnpd/miniupnpd.conf

En bekijk vervolgens de folder inhoud van de folder waarin de miniupnpd configuratie zich bevindt:

ls /etc/miniupnpd/

Daarna voegen we configuraties toe aan het nieuwe en lege configuratiebestand.
Allereerst wensen we dat de miniupnpd informatie omtrent uptime dat van de daemon is en niet dat van de VPS zelf:

echo "system_uptime=no" >> /etc/miniupnpd/miniupnpd.conf

Voorzie de daemon van een unieke identifier, dat kan gerust deze zijn:

echo "uuid=1ed739ff-1493-4b51-a691-b2193111e1f2" >> /etc/miniupnpd/miniupnpd.conf

We wensen de laatste Internet Gateway Device standaard te gebruiken:

echo "force_igd_desc_v1=no" >> /etc/miniupnpd/miniupnpd.conf

De externe ethernet interface wordt bepaald, op Hetzner cloud servers is dit steeds eth0: 

echo "ext_ifname=eth0" >> /etc/miniupnpd/miniupnpd.conf

De virtual network interface waar verzoeken aanvaard worden wordt bepaald, in dit geval de WireGuard network interface; welke VPN clients toelaat om te verbinden met de miniupnpd service op de VPS via deze interface:

echo "listening_ip=wg0" >> /etc/miniupnpd/miniupnpd.conf

Aangezien we het UPnP protocol zelf niet gebruiken schakelen we dynamische port forwarding voor alle poorten uit:

echo "deny 0-65535 0.0.0.0/0 0-65535" >> /etc/miniupnpd/miniupnpd.conf

De configuraties werden aangebracht, bekijk ter controle de inhoud van het configuratie bestand:

cat /etc/miniupnpd/miniupnpd.conf

Start vervolgens de miniupnpd service:

systemctl start miniupnpd.service

Wacht enkele ogenblikken en bekijk de status.
De try_sendto foutmeldingen zijn normaal.

systemctl status miniupnpd.service

 

Indien de status "active (running)" is schakelen we automatisch opstarten van de daemon in:

systemctl enable miniupnpd.service

Tot slot kunnen we de huidige miniupnpd service die beschikbaar is op het IP adres van de wg0 interface terugvinden door: 

netstat -tuln | grep 10.0.10.1

Dit louter ter controle, de poort kan verschillen en niet alle miniupnpd gerelateerde services worden weergegeven.


Stap 6 - Installeren van benodigde software op je apparaat

Om het configureren van de WireGuard VPN client & killswitch op je apparaat mogelijk te maken dienen enkele apt packages geinstalleerd te worden.

Indien je fysiek toegang hebt tot het apparaat en niet gebruik wenst te maken van SSH om ermee te verbinden interageer je met de command line interface middels monitor en toetsenbord.
Indien je wel met SSH wenst te verbinden (aangeraden) open je hiervoor een nieuw command prompt en maak je verbinding met je apparaat; sluit de command prompt van je VPS nog niet.

ssh <gebruikersnaam>@<lokaal_ip_adres_apparaat>

In beide gevallen promoveer je vervolgens de shell sessie om te configureren met het root account:

sudo su

Open een tmux shell sessie:

tmux

Installeer de benodigde apt packages:

apt-get update && apt install netfilter-persistent iptables-persistent python3-dev traceroute resolvconf wireguard miniupnpc wireguard-tools ipcalc -y

Bevestig (arrow keys & ENTER) het opslaan van de huidige IPv4 en IPv6 routing rules indien gevraagd:


Wacht tot het installeren van de apt packages is voltooid.



Waarvoor dienen de packages?

  • interactie met VPN server mogelijk maken
    • wireguard, wireguard-tools
    • resolvconf
  • controle correcte werking
    • traceroute
    • python3-dev
  • interactie met de miniupnp daemon van de VPS mogelijk maken om het externe IP adres te bepalen
    • miniupnpc
  • mogelijk maken om killswitch configuraties persistent/permanent te maken
    • iptables-persistent, netfilter-persistent
  • vereist tijdens configuratie voor het bepalen van het lokale netwerk adres
    • ipcalc


Stap 7 - WireGuard VPN client configureren

Navigeer naar de folder waar de WireGuard configuraties opgeslagen worden:

cd /etc/wireguard

Controleer dat deze folder geen bestaande configuraties bevat:

ls

Open de tekstbewerker voor een nieuw configuratiebestand met naam wg0.conf:

nano wg0.conf

Indien je een SSH verbinding hebt met je apparaat (aangeraden) kopieer je de inhoud van het geopende VPN client configuratie bestand dat je gedownload en geopend hebt in Stap 4.

(Indien je fysiek interageert met je apparaat dien je op een andere wijze het configuratie bestand over te dragen, dat kan via USB of door manueel in te voeren.)

Plak vervolgens de gekopieerde configuratie met een rechtermuisklik in de nano tekstbewerker (#1).
Sla het bestand op met CTRL+O (#2), gevolgd door ENTER (#3).

Verander AllowedIPs van 

AllowedIPs = 0.0.0.0/0,::/0

naar

AllowedIPs = 0.0.0.0/0

Indien je IPv6 uitgeschakeld hebt.

Controleer het resultaat (#1) en sluit de tekstbewerker met CTRL+X (#2).




 

Stap 8 - Eerste verbindingstest tussen client & server

Navigeer naar de root folder & controleer je huidige publieke IP adres met een verzoek naar een derde partij:

cd && curl ip.me --ipv4 && curl ip.me --ipv6

Schakel de wg0 WireGuard VPN client configuratie in op je apparaat:

wg-quick up wg0

Controleer je huidige publieke IPv4 adres met een verzoek naar een derde partij:

curl ip.me --ipv4

Controleer je huidige publieke IPv4 adres door middel van de miniupnpd daemon die je ingesteld hebt op je VPS in Stap 5:

external-ip

De WireGuard VPN client is goed geconfigureerd & actief indien je het IPv4 adres van je VPS te zien krijgt:


Schakel vervolgens de automatische opstart van de VPN client in:

systemctl enable wg-quick@wg0

Aangezien de VPN server en client geconfigureerd zijn voor IPv4 verkeer schakelen we vervolgens IPv6 netwerk- & internetverkeer uit op je apparaat:

echo -e "\nnet.ipv6.conf.all.disable_ipv6 = 1\nnet.ipv6.conf.default.disable_ipv6 = 1\nnet.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf && sysctl -p

Aangezien deze tutorial gaat over het publiek toegankelijk maken van lokale applicaties & het IPv6 protocol niet door alle apparaten ondersteund wordt zijn alle configuraties IPv4 georienteerd. Hierdoor wordt accidentele routing via het IPv6 adres dat niet onder de configuraties van de VPN server valt expliciet uitgesloten.   

Vraag de website van Google op door middel van traceroute om te zien hoe de bestemming (Google) bereikt wordt (#1):

traceroute google.com

Het IP adres wordt bepaald door een DNS aanvraag, waarna de VPN server aangesproken wordt (#2 - 10.0.10.1), diverse intermediairen passeert, en terecht komt bij Google (#3).

Zoals het verzoek naar ip.me heeft aangetoond krijgt Google het verzoek toe met als afzender het IP adres van je VPS/VPN server.

Vraag de DNS records van Google op om te zien welke DNS server gebruikt wordt:

Zoals geconfigureerd in wg0.conf wordt de DNS server 8.8.8.8 gebruikt om de IP-adres(sen) te vergaren.


Stap 9 - VPN client killswitch functionaliteit configureren

Om ervoor te zorgen dat je lokale IPv4 adres (toegekend door je ISP) niet gebruikt wordt om internet verzoeken te versturen dient er een "killswitch" geconfigureerd te worden.

Deze killswitch zorgt er dus voor dat, indien je apparaat onverwacht verbinding verliest met de VPN server, er geen publiek internetverkeer - behalve met de VPN server - kan plaatsvinden.

Naast deze restricties blijft intranet verkeer (op je lokale netwerk tussen apparaten) en onderling tussen applicaties op je apparaat steeds mogelijk.

Om te garanderen dat alle commando's (in correcte volgorde) uitgevoerd worden wordt er gebruik gemaakt van het killswitch script dat aangeboden wordt door construct0.

Voer volgend commando uit om het script op te slaan op de VPS:

cd && curl -o- https://raw.githubusercontent.com/construct0/sysadmin/refs/heads/main/wg_client_apply_killswitch.sh > wg_client_apply_killswitch.sh

Bekijk het bestand in de huidige folder vervolgens met:

ls -l

Optioneel: bekijk de inhoud van het script

Om te weten wat er precies uitgevoerd zal worden kan het script bekeken worden met:

cat wg_client_apply_killswitch.sh


Maak het script vervolgens uitvoerbaar op de VPS:

chmod +x wg_client_apply_killswitch.sh

Voer het script vervolgens uit:

clear && bash wg_client_apply_killswitch.sh

Alle uitgevoerde commando's worden weergegeven:

  1. laat verkeer toe via de wireguard interface
  2. laat verkeer toe tussen services op het apparaat
  3. laat lokaal netwerkverkeer toe
  4. extraheren van VPN server IP adres & poort uit de wireguard configuratie
  5. laat verkeer toe naar de VPN server,
    laat geen buitengaand verkeer toe dat niet via de wireguard interface verloopt of voldoet aan bovenstaande voorwaarden
  6. persistent opslaan van bovenstaande

Bekijken van de killswitch rules kan met:

iptables --list

Het verwijderen van de killswitch rules kan met:

iptables --flush

Indien deze permanent verwijderd dienen te worden voer je vervolgens dit uit:

netfilter-persistent save



Stap 10 - Testen VPN client killswitch

Om te bevestigen dat de killswitch correct functioneert, schakel de VPN client uit met:

wg-quick down wg0

Probeer de webpagina van Google op te vragen & een ICMP ping antwoord van een Cloudflare IP adres te ontvangen:

curl google.com || ping 1.1.1.1

Beiden lukken niet door de killswitch. Beeindig de poging met CTRL+C of wacht op een timeout.

Schakel de VPN client terug in & probeer dezelfde verzoeken te versturen:

wg-quick up wg0

curl google.com && ping 1.1.1.1


De killswitch functioneert zoals verwacht.


 

Stap 11 - Heropstarten van je apparaat

Om te bevestigen dat de VPN client & killswitch na heropstart actief zijn, herstart je je apparaat met:

reboot

De verbinding wordt verbroken, maak opnieuw verbinding na enkele minuten.


 

Stap 12 - Bevestigen dat VPN client & killswitch actief zijn

Nadat je verbinding hebt gemaakt, controleer of de VPN client actief is:

external-ip && curl ip.me --ipv4 && curl ip.me --ipv6

Het IPv4 adres van je VPS verschijnt tweemaal, het IPv6 verzoek mislukt.
Indien je een ander IPv4 adres (lokale IP) te zien krijgt werkt de killswitch niet & werd de VPN client niet automatisch opgestart.
Je kan het IPv6 verzoek beeindigen met CTRL+C of wachten op een timeout.

Volg de instructies van Stap 10 om de killswitch te testen.


 

Stap 13 - Dummy webservice opstarten

Alvorens je eigen applicaties publiek toegankelijk te maken, maken we gebruik van een tijdelijke dummy web server op je apparaat.

Maak een nieuwe folder aan in de root directory & open deze:

cd && mkdir tempweb && cd ./tempweb

Maak vervolgens een index.html pagina aan met herkenbare inhoud:

echo "Dummy webservice" > index.html

Start vervolgens de web server op poort 9999 en het IP adres van de wg0 interface, indien deze poort in gebruik is door een applicatie kies je een andere poort:

python3 -m http.server --bind 10.0.10.2 9999

Indien je de web server ook op je lokale netwerk beschikbaar wilt stellen vervang je 10.0.10.2 door 0.0.0.0,
of laat je het --bind argument weg.



Stap 14 - Reverse proxy configureren

Om deze webservice toegankelijk te maken via het IP-adres van je VPS dient de reverse proxy geconfigureerd te worden op je VPS.

Hiervoor maken we gebruik van Nginx.
Installeer eerst de uitgebreidere versie:

apt-get update && apt install nginx-full -y


Open het centrale configuratiebestand met tekstbewerker nano:

nano /etc/nginx/nginx.conf

Voeg volgende stream configuratie toe:

Indien gewenst stel je een andere publieke poort in (#1).
Sla de configuratie op met CTRL+O, gevolgd door ENTER.
Sluit vervolgens de tekstbewerker met CTRL+X.

Controleer de Nginx configuraties met:

nginx -t

Indien succesvol, garandeer automatische heropstart & herstart de Nginx service:

systemctl enable nginx.service && systemctl reload nginx.service || echo "*** Starting Nginx instead.." && systemctl start nginx.service



Stap 15 - Bereikbaarheid van dummy webservice testen

Open je browser en navigeer naar <vps_ip>:9999.
Indien de configuraties goed aangebracht zijn krijg je de inhoud van de index.html die gehost wordt door de dummy webservice te zien.

Op je apparaat is tevens het verzoek te zien, door de reverse proxy is hier het IP adres van de WireGuard network interface van de VPN server te zien.



Stap 16 - (!) Logging van reverse proxy verkeer

Het inschakelen van logging voor het verkeer dat je reverse proxy verwerkt op je VPS is mogelijk, de hoeveelheid logs die gegenereerd worden hangt af van welk type applicatie (game server, video streaming, web server, ..).

De Nginx configuratie die gebruik maakt van een reverse proxy server configuratie binnen de scope van een gedefinieerde stream (zoals in Stap 14) kent het type van de data niet, wat het mogelijk maakt om elk soort verkeer te verwerken.

Dit in tegenstelling tot een reverse proxy server die niet binnen de scope van een stream gedefinieerd is, maar gelimiteerd is tot uitsluitend HTTP(s) verkeer.
Er is in dat geval standaard logging aanwezig, wat bij het gebruik van een stream niet het geval is.

Je apparaat ontvangt het internetverkeer van je VPS, en zoals Stap 15 heeft aangetoond is hier het IP-adres van de oorspronkelijke afzender niet beschikbaar.
Dit, samen met het ontbreken van standaard logging voor streams op je VPS, kan dus leiden tot een scenario waarbij men het IP-adres van de afzender nodig heeft maar deze nergens meer beschikbaar is. 

Voor een applicatie of service die dmv HTTP(s) beschikbaar dient worden gesteld is het mogelijk om de server configuratie an sich te configureren (in de sites-enabled folder), zonder hierbij een stream te definieren als parent.
Men bekomt hierdoor standaard logging & men kan door middel van de X-Forwarded-For header het IP-adres van de afzender toevoegen aan het verzoek, maar men dient echter wel het publieke SSL certificaat te configureren & beheren op de server van de reverse proxy zelf. 

Bij gebruik van een stream kan het publieke SSL certificaat lokaal beheerd worden.

Afhankelijk van het type data dient een specifieke configuratie gehanteerd te worden.
Voor een standaard TCP stream kan logging als volgt geconfigureerd worden:

log_format stream_log_format '$remote_addr [$time_local] $protocol $bytes_sent $bytes_received $session_time';
access_log /var/log/nginx/stream_access.log stream_log_format;


Je stream access log ziet er dan als volgt uit:

Ter vergelijking, een standaard HTTP(s) access log:


Voor een UDP stream is het aangeraden om onder andere de write interval af te stemmen op de applicatie aangezien een doorsnee toepassing duizenden UDP pakketten per gebruiker, per seconde, omvat.


Extra commando's

Om dit artikel af te sluiten een korte oplijsting van commando's.

VPS

  • wg
  • tcpdump
  • htop
  • ip addr

Je apparaat

  • upnpc -s
  • wg
  • tcpdump
  • htop
  • ip addr

Om documentatie over een commando te bekijken

  • man <commando_zonder_argumenten>













Comments

Popular posts from this blog

Ensuring verifiable communication between nyzo node operators by designing and deploying an authentication protocol