Einen Wireguard Site to Site VPN Tunnel einrichten
Wireguard ist eine open Source VPN Lösung. Der Server, welcher hierbei als VPN Gateway fungiert, läuft im Regelfall auf einem Unix basierten OS, meist im internen Netz des Firmennetzwerks. Die Clients wiederum sind für nahezu alle Client Betriebssysteme verfügbar. Das mache ich mir zunutze, denn man kann auf diese Weise einen Client im lokalen Netzwerk (Homeoffice?) bereithalten, der stets eine Verbindung zum Firmennetzwerk aufbaut. Alle anderen PC’s im lokalen Netzwerk, können dann via statischer Route so konfiguriert werden, dass Anfragen in das Netz der Company über diesen Client geroutet werden. Das erübrigt bspw., dass ein Client im Netzwerk eine SSL-VPN Verbindung zur Company aufbauen muss.
Damit das System ständig laufen kann, sollte es ein kleines, kompaktes Gerät, mit wenig Stromverbrauch sein. Was eignet sich hier besser, als ein Raspberry Pi? Wie man den installiert, hab ich hier umfassend beschrieben.
Die „Software“ Wireguard an sich, macht aus Sicht der Installation übrigens keinen Unterschied zwischen „Server“ und „Client“, man spricht hier von sog. „Peers“. Lediglich die Konfigurationsdatei unterscheidet sich zwischen dem Server und den Clients, also den „Peers“.
Achtung Sicherheit und Flexibilität!
Wireguard benötigt auf der Client Seite einen entsprechend freigeschalteten ausgehenden UDP Port, welcher frei definierbar ist, aber auch freigeschaltet sein muss! (Hotel Hotspots, Flughafen Hotspots, etc. öffnen im Regelfall lediglich TCP 80 (HTTP), TCP 443 (HTTPS) und selten auch UDP 53 (DNS). Diese Ports können NICHT für Wireguard verwendet werden!
Auf der Server Seite muss ein Admin ran, denn der Wireguard Server muss auf dem konfigurierten Port, aus dem Internet erreichbar sein! Wer jetzt die Idee hat, UDP 53 (DNS) hierfür zu verwenden, wird vermutlich scheitern, denn Wireguard verhindert „by Design“ den Start der Wireguard VPN Schnittstelle auf diesem Port, da hier im Regelfall bereits „resolved/dnscrypt-proxy“ horcht. Nachzulesen ist dieses Problem auch hier.
Das Prinzip
Folgendes Schema dient bei der Installation als Orientierung. Eine Konstellation, die man durchaus häufiger vorfinden dürfte. Im Schema ist beispielhaft nur ein Client dargestellt, dies können natürlich im weiteren Betrieb durchaus mehr werden.
Grundsätzlicher Ansatz und Vorbereitungen
- Definition des zentralen Serversystems, wie Standort, Plattform, Netzwerk (hier Labor, VM mit Raspian Desktop, Servernetz)
- Definition der Server Management IP (10.150.150.10/24)
- Definition des SEPARATEN Wireguard Netzwerks, welches mit keinem bestehenden Teilnetz „überlappt“. (10.172.172.0/24)
- Definition der Server IP im Wireguard Subnetz (10.172.172.1/24)
- Definition der Client IP(s) (10.172.172.11/24)
- Definition der öffentlichen IP / des öffentlichen DNS Namens, des Servers im Company Netzwerk (hier nicht veröffentlicht)
Konfigurationsschritte „Serverseite“
- Installation Raspian Buster Desktop
- SSH aktivieren
- Konfiguration der lokalen IP im Firmennetz, die nur dem Management des Servers dient (10.150.150.10/24)
- Konfiguration eines weiteren Interfaces – der Wireguard NIC – im Beispiel „wg0-server“. (10.172.172.1/24)
- Installation Wireguard
- Konfiguration Wireguard, gemäß der obigen Festlegungen
- Konfiguration der erlaubten Client Zugriffe, anhand der Client IP und des Client Public Key. (10.172.172.11/24)
- Veröffentlichung des Servers (DNAT) am WAN Anschluss der Firewall, um die Client Verbindungen zu ermöglichen. Den Destination Port habe ich im Beispiel auf 51238 festgelegt.
- Test der Client VPN Zugriffe
Konfigurationsschritte am Client
- Installation Raspian Buster
- SSH aktivieren
- Konfiguration der lokalen IP (dies kann durchaus eine dynamische IP sein)
- Installation Wireguard für das entsprechende Betriebssystem
- Konfiguration Wireguard für das entsprechende Betriebssystem, gemäß der obigen Festlegungen
- Test des VPN Zugriffs und des zugriffs auf die internen Systeme
Vorbereitung des Client im Homeoffice
(hier ein Raspberry „Pi 3 Model B“)
Kurzversion für Fortgeschrittene:
- Raspi mit Kabel an die FritzBox
- Auf dem Raspberry „Raspbian Buster Lite“ an den Start bringen
- SSH aktivieren
- Hostname anpassen
Für alle anderen hier Step by Step…
- In meinem Fall ist der Raspberry via LAN Kabel, direkt an die FritzBox angeschlossen
- Jetzt eine SD-Karte mit dem Raspberry-OS (bei mir die Variante „Raspbian Buster Lite“) und dem „Raspberry Pi Imager for Windows“ flashen… Es gibt auch andere Tools (bspw. „Balena Etcher“), für ein originales Raspian reicht das aber…
[wpdm_package id=’1027′] - Raspian Buster holen –> https://www.raspberrypi.org/downloads/raspbian/
- Achtung!
Nach dem Flashen der SD-Karte, diese nochmal in den PC stecken, nach dem Laufwerk „Boot“ suchen und hier eine leere Datei, OHNE Endung, mit dem Namen „ssh“ erstellen. Damit wird automatisch SSH am Raspi aktiviert und man muss nicht mit Tastatur, Maus und Monitor rumhampeln. Standardmäßig wird der Raspi sich die IP von der FritzBox holen und ist dann via SSH auf dieser IP erreichbar. - Jetzt via SSH am Raspi anmelden. Default Login am Raspi ist immer –> User: pi Passwort: raspberry
- Zuerst natürlich das Passwort ändern!
- Dann ändern wir den Hostnamen (in meinem Beispiel soll das System „wireclient“ heißen
Check den akuellen Namen (notieren, brauchen wir nachher nochmal)hostname
Jetzt ändern wir den Namen mit…
sudo hostname -b wireclient
Check neuen Hostname…
hostname
Suchen, wo der Name noch verwendet wird… (jetzt brauchen wir den alten Namen nochmal, der jetzt zwischen die Hochkommas kommt…)
sudo grep -lr "alter Name" /etc/*
Hier im Beispiel nur das Ergebnis, der Hostname ist schon geändert. Die Dateien /etc/ssh… können hier ignoriert werden, diese werden bei der Neuerstellung der SSH Keys automatisch angepasst…
Jede Datei, in welcher der Name vorkommt anpassen, hier zum Beispiel in der Datei „hosts“ (lokales DNS Resolve)sudo nano /etc/hosts
- IP Adresse fest vergeben (hier die Variante via dhcpd)
sudo service dhcpcd status sudo service dhcpcd start sudo systemctl enable dhcpcd sudo nano /etc/dhcpcd.conf
Beispielkonfig
interface eth0 static ip_address=192.168.100.10/24 static routers=192.168.100.1 static domain_name_servers=192.168.100.1
- Abschluss mit…
sudo reboot
Vorbereitung des Servers in der Company (Hyper-V VM, Raspian Buster Desktop)
- Virtuelle Maschine erstellen
- Raspian Desktop herunterladen und bereitstellen…
- SSH aktivieren, also Konsole öffnen
sudo systemctl enable ssh sudo systemctl start ssh
- Hostname anpassen (siehe Client)
- IP Adresse anpassen (siehe Client)
Beispielkonfiginterface eth0 static ip_address=10.150.150.10/24 static routers=10.150.150.250 static domain_name_servers=10.1.110.1
Wireguard Installation und Konfiguration
Die Installation ist auf dem PI und dem Server identisch.
Installation Wireguard auf Raspian Buster
- Installation Wireguard und Tools…
Zeile für Zeile in die SSH Console des Raspi kopieren…sudo apt-get update sudo apt-get upgrade sudo apt-get install raspberrypi-kernel-headers echo "deb http://deb.debian.org/debian/ unstable main" | sudo tee --append /etc/apt/sources.list.d/unstable.list sudo apt-get install dirmngr wget -O - https://ftp-master.debian.org/keys/archive-key-$(lsb_release -sr).asc | sudo apt-key add - printf 'Package: *\nPin: release a=unstable\nPin-Priority: 150\n' | sudo tee --append /etc/apt/preferences.d/limit-unstable sudo apt-get update sudo apt-get install wireguard sudo reboot
- Konfiguration Wireguard
- Privaten und öffentlichen Schlüssel des Clients erstellen
Erstellen des Wireguard Verzeichnissudo mkdir /etc/wireguard/
Wechsel ins Wireguard Verzeichnis
cd /etc/wireguard
Generieren des privaten Schlüssels mit dem Wireguard Tool
wg genkey > private.key
Erstellen des Öffentlichen Schlüssels, welcher aus dem privaten Schlüssel generiert wird
wg pubkey > public.key < private.key
Public Key anzeigen mit…
cat public.key
Private Key anzeigen mit…
cat private.key
- Konfiguration am Client
sudo nano /etc/wireguard/wg0.conf
Hier die Beispielkonfig gemäß Zeichnung, die auf dem Server natürlich vice versa anzupassen ist. Die Zeile „Endpoint“ im Bereich [Peer] ist am Server nicht erforderlich! Die beiden Zeilen in der Mitte (PostUp…) sorgen dafür, dass Anfragen des Client in das lokale Netzwerk geroutet werden, um so die „dahinter liegenden“ Systeme zu erreichen.
[Interface] Address = 172.20.20.11/24 PrivateKey = ClientPrivateKeyMussHierRein ListenPort = 51238 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] Endpoint = server.public.dns.com:51238 PublicKey = ServerPublicKeyMussHierRein AllowedIPs = 10.0.0.0/8,172.20.20.0/24 PersistentKeepalive = 25
- Lassen wir Wireguard automatisch starten…
sudo systemctl enable wg-quick@wg0
- Privaten und öffentlichen Schlüssel des Clients erstellen
- Wenn die Client Konfig fertig ist, Wireguard am Server auf identische Art und Weise bereitstellen und dann wäre das die Serverkonfig…
[Interface] PrivateKey = ServerPrivateKeyMussHierRein ListenPort = 51238 Address = 172.20.20.1/24 PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] PublicKey = ClientPublicKeyMussHierRein AllowedIPs = 172.20.20.0/24,192.168.100.0/24 PersistentKeepAlive = 25
- Wenn beide Seiten fertig sind, der Server bspw. via DNAT veröffentlicht wurde, starten wir Wireguard auf beiden Seiten mit:
sudo wg-quick up wg0
Jetzt heißt es testen, also am Raspi Client bspw.
Status der Verbindung anzeigen:sudo wg show
Idealerweise sieht man (hier bspw. am Pi-Client) den Datenfluss sendend und empfangend…
oder ein klassischer Ping auf die Gegenseite…ping 172.20.20.1
Ist die Antwort positiv, steht zunächst der Tunnel zwischen den Peers, Step 1 war also erfolgreich…
- Möchte man jetzt bspw. von anderen Clients im Peer Netz 192.168.100.0/24 auf die Gegenseite zugreifen, muss dem Client noch die Route über den Wireguard Peer mitgeteilt werden. Dazu wird in meinem Beispiel auf der Fritzbox eine Statische Route eingerichtet:
Heimnetz -> Netzwerk -> Netzwerkeinstellungen -> IP Routen - Jetzt wieder testen, also dieses Mal von einem Client im Peer Netz, hinter der Fritzbox einen Ping auf 10.xx.xxx.xxx. absetzen… War das ebenfalls erfolgreich, kann jetzt aus dem Netz 192.168.100.0/24, auf alle Systeme im 10.0.0.0/8 Netz zugegriffen werden.
[…] Basis-Konfiguration kann das System im Prinzip schon eingesetzt werden. Meine Projekte waren bisher „Raspi als Wirguard Client“, die Heimautomatisierung „Openhab“ und „Pihole“. Übrigens können diese […]