Ga naar de inhoud
Home » WireGuard op een Pi

WireGuard op een Pi

Raspberry Pi Blog Header

Het opzetten van een VPN klinkt moeilijker dan dat het is. Wat willen we bereiken; stel je hebt een omgeving als deze:

In je eigen omgeving thuis heb je een serie apparaten, stel een aantal PC’s met nog wat meer (Pi) ongein. Een van deze Pi’s zal de vpn server moeten gaan worden. Het hele netwerk zit aan elkaar geknoopt aan een router/modem van je provider die op zijn beurt weer contact heeft met het Internet.

Als je op het internet zit met je mobiel of laptop zou je verbinding kunnen maken met het thuis front. Echter mocht je met je mobiel in Denemarken staan, dan weet “de wereld” dat en kun je niet doen alsof je in Nederland bent. Zou je dat toch willen, om bijvoorbeeld televisie te kijken. Dan kun je dat oplossen door gebruik te maken van een vpn. Een vpn verbinding is eigenlijk heel simpel. Je device, bijvoorbeeld je telefoon, gaat via een tunnel naar je huis, of beter, naar je vpn server thuis. En van daaruit ga je de wereld weer in. De wereld denkt dus dat je in Nederland bent.

Install

Installeer eerst wat benodigdheden op je Pi die straks je vpn server wordt:

$ apt install curl nc tcpdump iptables

Met curl kun je data ophalen vanaf een ander systeem, met nc kun je data versturen naar een poort op een host, tcpdump kan je laten zien welk verkeer er op een poort is en iptables is een firewall. De firewall heb je ook nodig, straks meer hierover.

Start de firewall en controleer of ze gestart is:

$ sudo systemctl start iptables$ sudo systemctl enable iptables
$ sudo systemctl status iptables

Controleer /etc/sysctl.conf of de volgende settings gezet zijn:

net.ipv4.ip_forward=1

Als je ook IP6 gebruikt:

net.ipv6.conf.all.forwarding=1

Staat er nog een #-je voor en/of is de waarde 0. Haal dan het #-je weg en/of set de waarde op 1

Reload de configuratie:

$ sudo sysctl -p

Stel dat het interne IP adres van je vpn server (to be) 192.168.2.1 is, zorg er dan voor dat op je router/modem poort 51820 UDP geforward wordt naar 192.168.2.1 (staat vaak onder het kopje NAT of Forwarding)

Maak de volgende notities want die het je tijdens de installatie van Pi VPN nodig:

  • het IP adres van je modem/router (kan je doen via https://whatismyipaddress.com/)
  • en als je modem/router een hostname heeft heeft noteer die dan ook
  • noteer tevens welke DNS je gebruikt. Je kunt een eigen DNS hebben maar ook die van je provider, of een algemeen beschikbare (b.v. google op 8.8.8.8 en 4.4.4.4)

Installeer Pi VPN (= WireGuard) op je Pi. Uitleg op https://pimylifeup.com/raspberry-pi-wireguard/ Zorg ervoor dat je Wireguard selecteert en niet OpenVPN.

PiVPN install

https://install.pivpn.io |<bash

Op het eerste scherm wordt de info gegeven dat je of OpenVPN or WIreguard gaat installeren, toets Ok

Het wteede schermgeeft aan dat je vpn een vasst adres moet hebben omdat het een server is. Voor ons geldt dat het ip dat je modem/router krijgt van je provider vast moet zijn. In de praktijk blijkt dat als je je modem/router niet lang uit laat staan dit ip adres eigenlijk nooit veranderd. Ook met het ip adres van je systeem waarop je pivpn gaat installeren ook vast zijn. Als dit een dynamisch adres is maar je zet je Pi eigenlijk nooit uit, dan zal dit ook vast zijn. WIl je echt zeker zijn geeft dit systeem dan een vast ip adres (dit doe je in de dhcp instellingen van je dhcp server, mogelijk de router van je provider).

Het volgende scherm laaat je de huidige instellingen zijn, toets No en op het volgende scherm toets je Yes. Het volgende Ok en het daarop volgende ook weer Ok

Het volgende scherm vraagt je de gebruiker te selecteren waaronder PiVPN laat draaien, de gebruiker pi is een goede keuze, toets daarna Ok. Vervolgens wordt gevraagd of je OpenVPN of Wireguard wilt installeren. Kies Wireguard.

Vervolgens moet je het te gebruiken poort nummer opgeven, kies 51820 en toets Ok

Hierna een confirmatie scherm, toets Ok

Nu moet je je DNS kiezen, maak een keuze uit de lijst of gebruik custom voor je eigen DNS. Bij custom geef je het ip addres op van (eigen) DNS. Bijvoorbeeld 8.8.8.8 als je Google wilt gebruiken, of het ip adres van je DNS op je interne netwerk. Is het systeem waar je PiVPN op draaid ook je DNS (dit is mogelijk zo als je bijvoorbeeld PiHole ook op deze machine draaid) dan toets je 127.0.0.1

Toets vervolgens op OK.

Daarna moet je het publike ip adres van je router opgeven (had je genoteerd) of als je een een dns entry hebt kun je hier de naam (b.v. vpn.vanmij.nl) opgeven. Toets Ok. Nu worden de keys gemaakt, toets Ok

Nu volgt er informatie om PiVPN automatisch te laten updaten als dat nodig is. Toets Ok en in het volgende scherm kun je dit toestaan of weigeren. Ik zou toestaan kiezen.

Hierna krijg de melding dat alles geinstalleerd is en je aan de slag kunt. Toets Ok en in het laatste scherm wordt je gevraagd of er gereboot moet worden. Kies Yes.

==========================

Configuratie in

  • /opt/pivpn (is een symlink naar /usr/local/src/pivpn/scripts/)
  • /etc/pivpn (hierin staat onder andere de hosts file die wireguard gebruikt)
  • /etc/wireguard (configuratie van wireguard met o.a. wg0.conf)
  • /home/pi/configs (bevat de configuratie van alle clients)

Zorg ervoor dat de server herstart wordt na installatie.

Na reboot, controleer of de service gestart is:

$ systemctl status wg-quick@wg0

Als het niet gestart is, maakt dit dan mogelijk met

$ systemctl enable wg-quick@wg0
$ systemctl start wg-quick@wg0

Bekijk de config vanWireGuard met:

$ sudo wg show
interface: wg0
public key: ztVoU+XU1PEEtqBS8AEzk9cRPreRdIao90TPzFyvQiw=
private key: (hidden)
listening port: 51820

Zie je ook nog peers staan in de output dan gaan we die eerst verwijderen (starten met een schone lei)

Voorbeeld:

$ pivpn -l
::: Clients Summary :::
Client Public key Creation date
iPhoneArjan 8Px46tOeNzZ6fijRlUYQlIFVeB0TLFOZp5gXd1XqQ3Q= 15 Jun 2024, 15:22, CEST
arjanpc 7DxDr8TiGBQoKbskzYQ2aI/mlL0bTUPz6cS1JUP9aAI= 15 Jun 2024, 17:47, CEST
t410 evKuDle/CR9zFbZ32VVgItwRfipOvdmpGqQe8lxSJlg= 12 Jul 2024, 19:34, CEST
::: Disabled clients :::
$

Verwijder ze daarna via:

$ pivpn -r iPhoneArjan arjanpc t410
Do you really want to delete iPhoneArjan? [y/N] y
::: Updated server config
::: Client config for iPhoneArjan removed
::: Client Keys for iPhoneArjan removed
::: Successfully deleted iPhoneArjan
::: Updated hosts file for Pi-hole
Do you really want to delete arjanpc? [y/N] y
::: Updated server config
::: Client config for arjanpc removed
::: Client Keys for arjanpc removed
::: Successfully deleted arjanpc
::: Updated hosts file for Pi-hole
Do you really want to delete t410? [y/N] y
::: Updated server config
::: Client config for t410 removed
::: Client Keys for t410 removed
::: Successfully deleted t410
::: Updated hosts file for Pi-hole
::: WireGuard reloaded
$

Je hebt nu een schone lei LOL

Maar we moeten nog even wat knutselen, open het bestand

$ sudo vi /etc/wireguard/wg0.conf

Even doorheen stappen:

[Interface]
PrivateKey = iNkfxVdp26BFKZvK/nPtgfAROCNgMZLQ9sA8q1BMy3o=
Address = 10.210.109.1/24
ListenPort = 51820
MTU = 1420
## The PostUp will run when the WireGuard Server starts the virtual VPN tunnel.
## The PostDown rules run when the WireGuard Server stops the virtual VPN tunnel.
## Specify the command that allows traffic to leave the server and give the VPN clients access to the Internet.
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Je hebt een private key gekregen (net als een public key). Niet aankomen!

Het adres bereik dat gebruikt wordt in de tunnel, in dit geval 10.210.109.1/24 dus 10.210.109.0 t/m 10.210.109.255. Alleen veranderen naar een uniek bereik als je dit bereik gebruikt in je eigen netwerk.

De Poort waar op geluisterd wordt (5128)) … Niet aankomen! De MTU (maximale transmissie unit) is gezet op 1420 .. Niet aankomen.

De PostUp en PostDown regels moet je exact zo overnemen zoals ze hier staan. Controleer wel (ip address list) of je interface dat je gebruikt om op je interne netwerk te komen ook eth0 heet.

Zoals je ziet zijn dit iptables commando’s … maar wat moet die firewall hier? Je tunnel gebruikt het adres bereik 10.210.109.1/24 Je interne netwerk gebruik een ander adres bereik, bijvoorbeeld 192.168.2.1/24 Dus daar hoort een vertaal slag tussen. Deze vertaal slag wordt gedaan door de NAT in je firewall. D PostUp commando’s worden uitgevoerd als je vpn gestart wordt, de PostDown commando’s worden gebruikt als je vpn gestopt wordt. Het verschill is aangeven met rood … A voor add en D voor delete

Dit is dus de reden dan je een firewall moet installeren.

Testen

We gaan nu testen of alle verbindingen er zijn.

Open een apart window voor logging info. In dit window voer je uit:

$ sudo tcpdump -ttttni any 'udp port 51820'

Open nog een window en voer daar uit:

$ nc -vz -u vpn.famtenhoopen.nl 51820

Hier is vpn.famtenhoopen de url van het modem/router. Heb je die niet gebruik dan het ip adres van je modem (opvraagbaar via https://whatismyipaddress.com/). 51820 is de poort die je vpn (= Wireguard) gebruikt. Met andere woorden nc gaat wat data verzenden naar udp poort 51820 op vpn.famtenhoopen.nl … en inderdaad in het window met tcpdump moet nu wat gebeuren. Bijvoorbeeld …

$ sudo tcpdump -ttttni any 'udp port 51820'
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
2024-07-13 17:37:55.538421 eth0 Out IP 192.168.2.1.35729 > 80.60.218.224.51820: UDP, length 1
2024-07-13 17:37:55.538766 eth0 Out IP 192.168.2.1.35729 > 80.60.218.224.51820: UDP, length 1
2024-07-13 17:37:55.539663 eth0 In IP 192.168.2.254.35729 > 192.168.2.1.51820: UDP, length 1
2024-07-13 17:37:55.539668 eth0 In IP 192.168.2.254.35729 > 192.168.2.1.51820: UDP, length 1
2024-07-13 17:37:56.539182 eth0 Out IP 192.168.2.1.35729 > 80.60.218.224.51820: UDP, length 1
2024-07-13 17:37:56.539618 eth0 In IP 192.168.2.254.35729 > 192.168.2.1.51820: UDP, length 1
2024-07-13 17:37:57.539644 eth0 Out IP 192.168.2.1.35729 > 80.60.218.224.51820: UDP, length 1
2024-07-13 17:37:57.540060 eth0 In IP 192.168.2.254.35729 > 192.168.2.1.51820: UDP, length 1
2024-07-13 17:37:58.540142 eth0 Out IP 192.168.2.1.35729 > 80.60.218.224.51820: UDP, length 1
2024-07-13 17:37:58.540574 eth0 In IP 192.168.2.254.35729 > 192.168.2.1.51820: UDP, length 1

Op een bepaald tijdstip is op interface eth0 data in/out gekomen van/naar een ip adres.poort richting ip adres.poort via het UDP protocal met een lengte van 1

Zie je echter niets .. dan kan de paniek uitbreken LOL, heb je wel de forward gezet in je router/modem? Is wireguard wel gestart. Loop alles nog even doorrrrrrr….

Alles werkt, dus we kunnen nu een ….

VPN Client Toevoegen

Stel je wilt je telefoon toe voegen:

$ pivpn add
Enter a Name for the Client: iPhoneArjan
::: Client Keys generated
::: Client config generated
::: Updated server config
::: Updated hosts file for Pi-hole
::: WireGuard reloaded
======================================================================
::: Done! iPhoneArjan.conf successfully created!
::: iPhoneArjan.conf was copied to /home/pi/configs for easytransfer.
::: Please use this profile only on one device and create additional
::: profiles for other devices. You can also use pivpn -qr
::: to generate a QR Code you can scan with the mobile app.
======================================================================
$

In /home/pi/configs/iPhoneArjan.conf staat nu een config bestand (profile) voor deze client. Deze kun je gebruiken om de client te configureren.

$ cat /home/pi/configs/iPhoneArjan.conf
[Interface]
PrivateKey = gFgs8........szvJE4=
Address = 10.210.109.2/24
DNS = 10.210.109.1

[Peer]
PublicKey = ztVoU+...........yvQiw=
PresharedKey = Vazm...........K2I=
Endpoint = vpn.famtenhoopen.nl:51820
AllowedIPs = 0.0.0.0/0
$

Maaaarrrrrr het is makkelijker om dit met een QR code te doen:

$ pivpn -qr

Instaleer nu Wireguard op je telefoon en scan de qr-code. Add Tunnle – Create from QR code (scan) en geef de tunnel een naam. Activeer vervolgens je vpn op je telefoon. Open op je telefoon een browser en ga naar een willekeurig web adres …

Kijk op het window van tcpdump of er wat gebeurt ……

WireGuard zonder IP6 op eenPi

Zorg dat de Pi alleen op IP4 werkt zie Disable IP6 op een Pi

In /etc/pivpn/wireguard/setupVars.conf pivpnenableipv6 op 1 zetten

In /etc/pivpn/wireguard/setupVars.conf alle IP6 adressen weghalen (pivpnNETv6 en Allowed_IPS)

In /etc/wirequard/wg0.conf alle IP6 adressen weghalen

Nu kun je clients genereren (pivpn add) die alleen IP4 gebruiken.