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)
1hostname
Jetzt ändern wir den Namen mit…
1sudo hostname -b wireclient
Check neuen Hostname…
1hostname
Suchen, wo der Name noch verwendet wird… (jetzt brauchen wir den alten Namen nochmal, der jetzt zwischen die Hochkommas kommt…)
1sudo 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)
1sudo nano /etc/hosts
- IP Adresse fest vergeben (hier die Variante via dhcpd)
1234sudo service dhcpcd statussudo service dhcpcd startsudo systemctl enable dhcpcdsudo nano /etc/dhcpcd.conf
Beispielkonfig
1234interface eth0static ip_address=192.168.100.10/24static routers=192.168.100.1static domain_name_servers=192.168.100.1 - Abschluss mit…
1sudo 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
12sudo systemctl enable sshsudo systemctl start ssh - Hostname anpassen (siehe Client)
- IP Adresse anpassen (siehe Client)
Beispielkonfig
1234interface eth0static ip_address=10.150.150.10/24static routers=10.150.150.250static 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…
12345678910sudo apt-get updatesudo apt-get upgradesudo apt-get install raspberrypi-kernel-headersecho "deb http://deb.debian.org/debian/ unstable main" | sudo tee --append /etc/apt/sources.list.d/unstable.listsudo apt-get install dirmngrwget -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-unstablesudo apt-get updatesudo apt-get install wireguardsudo reboot - Konfiguration Wireguard
- Privaten und öffentlichen Schlüssel des Clients erstellen
Erstellen des Wireguard Verzeichnis
1sudo mkdir /etc/wireguard/
Wechsel ins Wireguard Verzeichnis
1cd /etc/wireguard
Generieren des privaten Schlüssels mit dem Wireguard Tool
1wg genkey > private.key
Erstellen des Öffentlichen Schlüssels, welcher aus dem privaten Schlüssel generiert wird
1wg pubkey > public.key < private.key
Public Key anzeigen mit…
1cat public.key
Private Key anzeigen mit…
1cat private.key - Konfiguration am Client
1sudo 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.
1234567891011121314[Interface]Address = 172.20.20.11/24PrivateKey = ClientPrivateKeyMussHierReinListenPort = 51238PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPostDown = 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:51238PublicKey = ServerPublicKeyMussHierReinAllowedIPs = 10.0.0.0/8,172.20.20.0/24PersistentKeepalive = 25 - Lassen wir Wireguard automatisch starten…
1sudo 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…
123456789101112[Interface]PrivateKey = ServerPrivateKeyMussHierReinListenPort = 51238Address = 172.20.20.1/24PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPostDown = 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 = ClientPublicKeyMussHierReinAllowedIPs = 172.20.20.0/24,192.168.100.0/24PersistentKeepAlive = 25 - Wenn beide Seiten fertig sind, der Server bspw. via DNAT veröffentlicht wurde, starten wir Wireguard auf beiden Seiten mit:
1sudo wg-quick up wg0
Jetzt heißt es testen, also am Raspi Client bspw.
Status der Verbindung anzeigen:
1sudo wg show
Idealerweise sieht man (hier bspw. am Pi-Client) den Datenfluss sendend und empfangend…
oder ein klassischer Ping auf die Gegenseite…
1ping 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 […]