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.)


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".

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.


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.


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).