Wanneer een beveiligde verbinding handig uitkomt
Introductie: Wireguard VPN Wireguard in Docker
Je Firewall instellen
Verbinden met je VPN met een client
Wireguard gebruikers aanmaken en afmelden
Je eigen VPN-server
<todo>
Bedenk dat bandbreedte niet gratis is, en internetverkeer routeren via je VPS wellicht niet de privacy geeft die je denkt.
Dat gezegd, er is een duidelijke use case voor een VPN-netwerkverbinding met je VPS-server.
Het enige wat we hier echter maken is een beveiligde tunnel van een client computer naar je VPS- server. Vanaf je VPS-server (wireguard server) is het uiteraard niet extra beveiligd. Het gaat dus niet over 'veilig' surfen of anonimiteit.
Je verbinding is dan zo veilig als je VPS-server, wat niet: niet. En ook niet anoniem, want iedereen kan uiteraard uitzoeken wie betaalt voor welk IP. Dus wees van dat alles bewust. Het is geen wondermiddel.
Wireguard software betreft vrije software, zie: Wireguard.com.
Er zijn alternatieven voor Wireguard, zoals OpenVPN. En dat is ook mooie software, maar Wireguard is eenvoudiger om mee te starten.
</todo>
Introductie: Wireguard VPN
Docker
Docker-compose
Een Linux-server (gebruikt in dit voorbeeld: ubuntu server)
De wens om een VPN te starten, voor het routeren van het internetverkeer van een client- computer via je VPS-server.
De gekozen aanpak is gebaseerd op die van The Digital Life, bekijk de blogpost hier en eventueel hier - als ook de video hier en ook eventueel hier. Het materiaal van Christian Lempa is een tip voor geïnteresseerden.
En we gebruiken Wireguard software, de website daarvoor is wireguard.com, met generieke installatie documentatie hier.
We hebben weer een docker-compose.yaml nodig, maak daarvoor weer een map aan, in ons voorbeeld: /opt/wireguard-server
En de docker-compose.yaml in /opt/wireguard-server/ als volgt:
Wireguard in Docker
Benodigd
Aanpak
De docker-compose.yaml
version: "2.1"
services:
wireguard:
image: linuxserver/wireguard container_name: wireguard cap_add:
- NET_ADMIN - SYS_MODULE environment:
- PUID=1000 - PGID=1000
Wat zien we de volgende instellingen:
Betreft de nieuwe service wireguard.
We gebruiken de wireguard container van het geweldige linuxserver initiatief. En die bouwen (op het moment van schrijven in ieder geval) goede containers. Veel
ondersteuning ook voor ARM64, wat uiteraard een bonus is, dit geldt ook de wireguard container.
De container is de wireguard container, en die is (check) recent bijgewerkt en up-to-date.
Lees de gelinkte documentatie.
Deze container komt met automatische routing opties voor het routeren van verkeer door de Wireguard tunnel, zodat je een VPN-achtige werking kunt realiseren.
De container heeft een logische naam toegewezen gekregen: wireguard
De container heeft een aantal extra permissies (capabilities, dat is: rechten) benodigd:
namelijk: NET_ADMIN en SYS_MODULE. En dat betreft een toegenomen veiligheidsrisico dat je wilt onderzoeken voordat je verder gaat.
De NET_ADMIN capability: "Perform various network-related operations.", overgenomen van hier.
En de SYS_MODULE capability: "Load and unload kernel modules." voor het laden van de wireguard kernel module.
De PUID en GUID zijn de user en group ids, die staan ingesteld op gebruiker 1000, vermoedelijk is dat het userid van je beheer user en de bijbehorende groep. Zorg dat je hier de IDs zet die je gebruikt op de volumes die je mount. Vaak is dat gebruiker 1000, dat is: de eerst aangemaakte gebruiker. Maar dat is zeker niet altijd het geval, dus controleer dat.
TZ = timezone, stel in naar wens.
- TZ=Europe/Amsterdam
- SERVERURL=wireguard.domain.com #optional - SERVERPORT=51820 #optional
- PEERS=1 #optional - PEERDNS=auto #optional
- INTERNAL_SUBNET=10.13.13.0 #optional - ALLOWEDIPS=0.0.0.0/0 #optional volumes:
- /opt/wireguard-server/config:/config - /lib/modules:/lib/modules
ports:
- 51820:51820/udp sysctls:
- net.ipv4.conf.all.src_valid_mark=1 restart: unless-stopped
De SERVERURL is niet helemaal optioneel. Je kan hier het IP-adres van je VPS-server invullen, of het domeinnaam, of: auto. Dan doet de Wireguard-server / container een lookup via een server op internet. De auto optie werkt dus niet voor interne netwerken zoals je thuisnetwerk.
De SERVERPORT is standaard op 51820, kan je herzien als je wilt.
De PEERS environment variabele geeft aan hoeveel gebruikers er geregistreerd moeten worden bij de start. Je kan later gebruikers toevoegen.
PEERDNS is de DNS-server die gebruikt wordt. Met auto gebruiken je verbonden
gebruikers de eigen interne DNS-dienst in de Wireguard-container. Je kan hier ook een DNS-server IP-adres instellen, dan gebruiken de verbonden gebruikers een externe DNS- dienst zoals opgegeven. Bedenk dat servers die je raadpleegt kunnen achterhalen welke DNS-server je gebruikt, en dan dus het IP-adres van je VPS vinden.
De subnet instellingen kan je herzien, voor het correct werken met IP-adressen in je VPS/VPN netwerk, maar is in mijn geval zo prima.
De mount van /lib/modules is uiteraard gevaarlijk. Maar je moet - in voorkomende
gevallen - wel een kernel-module compileren/creëren voor de host-server. In dat geval is toegang tot je /lib/modules benodigd. Oordeel zelf of dat inderdaad het geval is, of dat je VPS-OS voldoende up-to-date is, dat de wireguard kernel module reeds beschikbaar is.
Wireguard maakt gebruik van het UDP protocol, in dit geval via poort 51820. Die moeten we dus openzetten op de firewall(s). Die moet je beschikbaar maken op de host-server, voor verbinding van buiten.
Je start je container met:
Dan gaat de software gedownload en gestart worden. Uiteindelijk zie je dan:
En dan check je nog even of het inderdaad draait:
En jawel:
Starten!
sudo docker-compose up -d
Status: Downloaded newer image for linuxserver/wireguard:latest Creating wireguard ... done
sudo docker-compose ps
Name Command State Ports --- wireguard /init Up 0.0.0.0:51820->51820/udp,:::51820->51820/udp
En de status van de wireguard server in de wireguard container opvragen, als volgt:
Dat is het commando: docker: voer uit, met een interactieve terminal, in de wireguard container, het commando: wg
En wg is de wireguard tool die je gebruikt voor het beheren van de wireguard installatie. En dat geeft standaard de status van de wireguard server. Bijvoorbeeld:
Je ziet dat de firewall luistert op de opgegeven poort. Je ziet de publieke key en dat er inderdaad één peer (gebruiker) geregistreerd is.
De standaard configuratie bekijken: De container heeft in de /opt/wireguard-server een config map aangemaakt. Controleer dat dit gelukt is, en dat er inderdaad bestanden zijn weggeschreven, waaronder:
De peer1 map voor de eerste standaard aangemaakte gebruiker Het standaard wireguard configuratiebestand: wg0.conf
De peer1 map, in de config map, in /opt/wireguard-server geeft de benodigde informatie voor het verbinden met je kersverse VPN server.
In de automatisch aangemaakte configuratie voor de Wireguard VPN-server, wordt netwerkverkeer dat binnenkomt over de wg0 interface (dat is, uit je beveiligde VPN tunnelverbinding) doorgestuurd moet worden naar internet. Dat is forwarden en gebeurt met masquerading, dat is: NAT / Network Address Translation. Hierdoor lijkt het verkeer van je client-computer te komen vanaf je wireguard- server / VPS-server.
Maar daarvoor moet je VPS-server / wireguard-server wel goed ingesteld staan, dat dit daadwerkelijk kan/mag.
Controleer of dit kan/mag met:
sudo docker exec -ti wireguard wg
interface: wg0
public key: PX8...Eg0=
private key: (hidden) listening port: 51820
peer: Pve....u9nQ=
allowed ips: 10.13.13.2/32
IP Forwarding
Als het goed is zie je een 1 als uitkomst.
Zie je geen 1 als uitkomst?
Dan moet je deze functionaliteit hiervoor gaan aanzetten. Hiervoor moet je bewerken /etc/sysctl.conf door het aanzetten van de net.ipv4.ip_forward functionaliteit. Dat is, het verwijderen van de # aan het begin van de regel, zodat de ip_forward optie aangezet wordt.
Het relevante stukje in het sysctl.conf bestand:
Als je met IPv6 werkt, moet je dit ook voor IPv6 aanzetten, verderop in het .conf bestand.
Na het verwerken wil je de server herstarten, of de sysctl dienst herstarten met:
Je ziet als het goed is dat ip_forward wordt aangezet:
Controleer nu opnieuw of het goed staat ingesteld, met het 'cat .... /ip_forward' commando zoals boven weergegeven.
cat /proc/sys/net/ipv4/ip_forward
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
sudo sysctl -p
net.ipv4.ip_forward=1
Voor toegang tot je VPS-server, tot de Wireguard container, op poort 51820, moet je de firewall openen.
Controleer eerst dat er een dienst actief is op je VPS-server:
Je kunt dan zien of er inderdaad software draait luisterend op poort 51820. Iets als:
Je kunt vervolgens je eigen firewall openen voor de wireguard dienst met:
En controleer dan dat de nieuwe firewall-regel inderdaad is aangekomen:
En controleer in die lijst dat de 51820 UDP vermelding in de lijst staat als ALLOW.
Bedenk dat je VPS provider ook nog een firewall zal hebben, waar je wel of niet wat mee moet.
Je Firewall instellen
netstat -tulpen | grep 51820
udp 0 0 0.0.0.0:51820 0.0.0.0:* 0 5239976 - udp6 0 0 :::51820 :::* 0 5239980 -
sudo ufw allow 51820/udp
sudo ufw status
De configuratie voor de client is te vinden in de map op je VPS-server met de naam:
En om heel precies te zijn het bestand: peer1.conf
Je wilt nu vanaf een andere computer verbinden met je VPS. Dan heb je de gegevens nodig uit de peer1 map.
Let op, onderstaande betreft de gebruiker van de VPN-dienst. Dit is dus je client, niet je VPS-server zelf.
Je kunt bijvoorbeeld het peer1.conf bestand kopiëren naar een Linux/Ubuntu computer en plaatsen in de /etc/wireguard map als wg0.conf
Hoe je het peer1.conf bestand veilig! verplaatst van je server naar de client laat ik over aan de gebruiker. Je kunt met secure copy (scp) veilig bestanden kopieren, zie bijvoorbeeld ter illustratie deze documentatie. Je kan de inhoud visueel copy/pasten, je kan het overtypen, je kan de
peer1.png gebruiken als QR-code (merk de ijzige rillingen op als je QR-code hoort), etc.
Hoe dan ook, voor de test, kopieer de peer1.conf van je VPS-server naar je client computer, en plaats die voor de test in de wireguard configuratie map als: /etc/wireguard/wg0
We gaan werken met wireguard verbindingen met het commando wg_quick. Lees daar dus wat over.
Je verbindt nu je client computer (niet je VPS dus) met de wireguard serversoftware op je VPS- server met het commando:
Verbinden met je VPN met een client
/opt/wireguard-server/config/peer1
Naar je client computer
Studeerwerk benodigd? Lees de getting started handleiding op Wireguard.com.
En je wordt verbonden, iets als:
Je ziet dat IPv4 en IPv6 routes opgezet worden zodat al (IPv4 0.0.0.0/0 en IPv6 ::/0) het
netwerkverkeer standaard gerouteerd wordt naar wg0, de tunnelverbinding naar de VPS-server. Zo wordt het lokale verkeer dus doorgestuurd naar je Wireguard container en komt het virtuele privé- netwerk tot stand.
Je bent nu dus verbonden met je VPS-server, via een VPN-verbinding. Je wilt daarvan nu de status controleren:
De status informatie is iets als:
wg-quick up wg0
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.13.13.2 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a wg0 -m 0 -x [#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820 [#] ip -6 rule add not fwmark 51820 table 51820 [#] ip -6 rule add table main suppress_prefixlength 0 [#] ip6tables-restore -n
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0 [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1 [#] iptables-restore -n
Studeerwerk benodigd? Het netwerkverkeer wordt geregeld door een Linux subsysteem (onderdeel) met de naam netfilter. Voor het inregelen van het gewenste netwerkverkeer in het netfilter systeem, gebruik je gereedschap. Dat gereedschap is iptables (of, eventueel nieuwer, nftables). De docker container komt met automatische configuratie via iptables opdrachten. Je kunt met aanvullende configuratie uiteraard deze functionaliteit
personaliseren en je VPN tunnel op andere manieren inzetten. Daarvoor is dan aanvullend studeerwerk benodigd over netfilter en iptables.
sudo wg
En je bent duidelijk verbonden, anders zag je geen interface en peer. En je ziet een recente handshake, de verbinding is levend.
Je kunt eventueel nog zien of je inderdaad een wg0 netwerk hebt gekregen:
Zoek dan in de lijst je wg0 verbinden op. Of vraag die specifiek op via:
Met als resultaat:
Gelukt. Je kunt nu internet gebruiken, bedenk daarbij dat je internet gebruik nu verloopt via je VPS- server.
De client computer is verbonden met je Wireguard-server op je VPS.
interface: wg0
public key: Pve...u9nQ=
private key: (hidden) listening port: 51820 fwmark: 0xca6c
peer: PX8...Eg0=
endpoint: 132.45.67.89:51820 allowed ips: 0.0.0.0/0, ::/0 latest handshake: 19 seconds ago
transfer: 16.46 KiB received, 18.88 KiB sent
ip a
ip address show dev wg0
11: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.13.13.2/32 scope global wg0
valid_lft forever preferred_lft forever
De VPN-verbinding controleren op de VPS-
server
Je kunt zien dat er inderdaad een client verbonden is, door het wg commando uit te voeren. Dit moet dan wel in de Wireguard docker container gebeuren, als volgt:
Met als resultaat:
Je ziet dat er daadwerkelijk informatie uitgewisseld is, en dat de laatste handshake is twee minuten geleden - niet heel recent maar voor onze situatie (verkeer geïnitieerd door de client) goed
genoeg. De peer (je gebruiker / client computer) is dus verbonden met je wireguard server op je VPS. En je ziet in het statusschermpje ook het publieke IP-adres van de verbonden peer computer.
Op gegeven moment wil je de verbinding weer ophangen, vanaf je client, dat doe je met:
Je ziet dat de VPN-verbinding opgehangen wordt:
En je kunt nog even checken wat de status is van wireguard op je client:
sudo docker exec -ti wireguard wg
interface: wg0
public key: PX8...Eg0=
private key: (hidden) listening port: 51820
peer: Pve....u9nQ=
endpoint: 213.12.34.654:23226 allowed ips: 10.13.13.2/32
latest handshake: 1 minute, 54 seconds ago transfer: 27.26 KiB received, 57.77 KiB sent
De verbinding ophalen vanaf de client
wg-quick down wg0
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0 [#] ip -6 rule delete table 51820
[#] ip -6 rule delete table main suppress_prefixlength 0 [#] ip link delete dev wg0
[#] resolvconf -d wg0 -f [#] iptables-restore -n [#] ip6tables-restore -n
En als het goed is geeft die nu aan dat er geen verbinding is. (Geen status info) sudo wg
<todo> verder uitwerken </todo>
Wanneer je een gebruiker toegang hebt gegeven tot je VPN-server, kan het nodig zijn die toegang ook weer in te trekken. En dat doe je door in wireguard de peer te verwijderen in de config file
De wireguard server identificeert gebruikers op basis van de public/private keys. In de configuratie van wireguard (/opt/wireguard-server/config/wg0.conf) zie je onder het kopje [peer] ieder van de peers (gebruikers) die je toegang hebt gegeven. Verwijder daar de peer die je wilt verwijderen, en de private key van die peer. En gereed.