VPN Server on Demand
Hintergrund und Motivation
Es gibt heutzutage bereits viele Möglichkeiten auf seine Daten von unterwegs aus zuzugreifen. Je nachdem wo man seine Daten speichert liegen diese ggf. eh schon in der Cloud und ein Zugriff ist, sofern man eine aktive Internetverbindung hat, jederzeit möglich.
Wer seine Daten jedoch nicht „aus der Hand“ geben möchte betriebt zu Hause oft eine NAS oder eine anderes Geräte wo Dateien und Fotos gespeichert werden. Hier steht man jedoch oft vor der Herausforderung, auf die Daten von Unterwegs aus zuzugreifen. Wobei die Größe der „Herausforderung“ natürlich immer von der gewünschten Lösung abhängt. Viele NAS Systeme bringen mittlerweile einen Cloud Service mit, welcher über die Webiste oder eine APP des Herstellers einen Zugriff auf seine eigene NAS zu Hause ermöglicht (falls man das möchte).
Ich hatte mich damals jedoch bewusst gegen eine NAS entschieden, da ich neben der Datenhaltung gerne einen „vollwertigen“ PC / Server wollte, welcher bei Bedarf auch entsprechend Leistung zur Verfügung stellt. Ich entschied mich daher für einen kleinen Mediaserver mit I5 Setup:
- Intel Core i5-8500 @ 3.00GHz
- ASUS ROG STRIX Z370-G, Mainboard
- 16GB G.Skill Value DDR4-2400 DIMM CL15 Dual Kit
- SanDisk 240GB SSD für das Betriebssystem (Windows Server 2016)
- Samsung 960 EVO 500Gb M.2 SSD für VMs und Datenbanken
- 2x Samsung EcoGreen F4 HD204UI 2TB im Raid 1 für wichtige Daten
- Seagate 4TB NAS HDD (ST4000VN000) für unwichtige Daten
Stromverbrauch
Der Mediaserver verbraucht im Idle (bis mittlerer Aktivität) ca. 45W, was im Gegensatz zu einer NAS recht viel ist. Im Durchschnitt wird der Mediaserver jedoch nur ca. 2-3 Stunden pro Tag benötigt, wobei die meiste Zeit für das Backup reserviert ist. Daher schaltet sich der Server nach einer Stunde Inaktivität in den Sleep Mode, dort verbraucht er im Durchschnitt nur noch 4W.
Eine kurze Vergleichsrechnung, wenn der Mediaserver 24/7 im Jahr läuft ergibt sich, bei einem Preis von 29 Cent pro Kilowattstunde folgende Kostenrechnung:
45W * 24 Stunden = 1080Wh pro Tag
1,08kWh * 0,29 €/kWh * 365 Tage= 114,31 € im Jahr
Wenn der Server aber nur 3 Stunden pro Tag „wach“ ist und die restliche Zeit im Sleep Mode ergeben sich folgende Kosten pro Jahr:
(45W * 3 Stunden) + (4W * 21 Stunden) =219Wh pro Tag
0,219kWh * 0,29 €/kWh * 365 Tage= 23,18 € im Jahr
Es liegt also auf der Hand, dass der Server sich nur bei Bedarf einschaltet und bei Inaktivität wieder in den Sleep Mode wechseln soll.
Wie man den Energiesparmodus konfiguriert sollte bereits ausreichend im Web beschrieben sein. Spannender ist die Frage, wie man den Server wieder (vor allem von unterwegs) aufweckt und wie man per VPN darauf zugreifen kann. Fangen wir mit dem VPN Server an.
SoftEther VPN Server
Zunächst mal, für einen VPN Zugriff, benötigt man oftmals keinen eigenen Server mehr. Viele NAS-Systeme und Router, unter anderem die Fritzbox, bringen mittlerweile einen eigenen VPN Server mit, dieser lässt sich sehr schnell und einfach über die Weboberfläche konfigurieren. Eine Anleitung für die Fritzbox findet man z.B. hier.
Auch ich hab eine Fritzbox und hatte zunächst den VPN Server im Einsatz. Es gibt jedoch ein paar Punkte die für mich gegen die Verwendung des Fritzbox VPN Servers sprechen:
- Der Upload des VPNs (also von zu Hause nach draußen) ist auf 15Mbit beschränkt, wobei viele Praxistests sogar nur einen Durchsatz von 3,5Mbit ergeben haben, auch wenn die eigene Leitung wesentlich mehr leisten könnte. Das Problem ist nicht unbekannt und liegt wohl daran das die Fritzbox für die Verschlüsselung der Daten nur einen Kern verwendet, siehe hierzu auch den Speedtest. AVM meint dazu folgendes: VPN langsam.
- die Fritzbox unterstütz nur IPSec über AES und somit auch kein OpenVPN
- Man benötigt für Windows einen extra Client
- Der VPN Server ist immer aktiv
Ich wollte einen eigenen VPN Server, welcher mehr Konfigurationsmöglichkeiten bietet und vor allem die volle Leistung meiner Leitung (100Mbit Upload) bereitstellt. Nach einiger Recherche bin ich auf den Multi-Protocol VPN Server „SoftEther“ gestoßen. Der Server ist für alle gängigen Betriebssystemen verfügbar und Freeware. Mehr dazu auf der Homepage von SoftEther.
Die Voraussetzungen halten sich überschaubar, neben einem Windows, Linux oder Max Betriebssystem benötigt man nur einen Router welcher NAT bzw. Portforwarding unterstütz.
Ich hab als Plattform eine Hyper-V mit Ubuntu Server OS auf meinem Mediaserver hochgezogen. Die Installation und Einrichtung von dem VPN Server ging sehr problemlos und ist hier gut beschrieben.
Das script für den Service musste ich jedoch wie folgt anpassen, damit unter Ubuntu auch der Autostart funktioniert
Damit der VPN Server von extern erreichbar ist, muss das notwendige Portforwarding eingestellt werden. Je nach VPN Protokollen müssen unterschiedliche Ports freigegeben / weitergeleitet werden, siehe hierzu auch die Spezifikationen.
Um seinen Router von extern erreichen zu können benötigt man entweder eine feste IP Adresse oder eine DynDNS. Ich kann DynoDNS empfehlen, der Dienst ist komplett kostenlos und man muss ihn nicht regelmäßig erneuern.
Der Part mit dem VPN Server sollte damit erledigt sein, bleibt der Teil mit dem „on Demand“.
Wake on LAN
Ich hatte mir die Voraussetzung gesetzt, dass der VPN Server nur dann aktiv sein soll, wenn ich ihn auch brauche. Das heißt ich möchte ihn aktiv einschalten können. Nachdem der VPN Server sowieso als VM auf meinem Mediaserver läuft und dieser ja immer wieder in den Sleep Modus geht, muss der Mediaserver von extern „aufgeweckt“ werden können.
Dazu erstmal eine interessante Erkenntnis: ich hatte die Befürchtung, dass der Mediaserver, sobald eine VM läuft, nicht in den Sleep Modus wechseln würde. Ich hatte mich getäuscht, wenn auf der VM keine Aktivität stattfindet, legt sich der Server wie gewohnt schlafen. Und das Beste daran, sobald er aufwacht, läuft auch die VM wieder und der VPN Server ist wieder erreichbar. Ich muss sagen, ich bin positiv überrascht von dem Energiesparmodus von Windows. Bleibt also das Thema mit dem aufwecken. Meine Backup Tasks hatten bisher den Server selbstständig wieder aus dem Sleep Modus geweckt, nun sollte das „Wecken“ aber auch über das Netzwerk möglich sein. Hierzu muss man im BIOS vom Mainboard die Einstellung „Power on PCIE“ aktivieren, ggf. hilft Google falls die Einstellung bei anderen Mainboards anders benannt sein sollte. Weitere Einstellungen sind ggf. in Windows notwendig: Windows 10 WOL
Im internen Netz
Da ich meinen Server und die Daten darauf ja auch immer wieder benötige wenn ich zu Hause bin, hab ich mir ein kleines PowerShell Skript geschrieben, welches den Server aufweckt.
Siehe dazu auch den Beitrag: WOL per PowerShell
Solange man sich im internen Netz befindend und man ein anderes Gerät hat (es gibt auch WOL Apps fürs Handy) ist das aufwecken also kein Problem.
Über das Internet
Fritzbox und die WOL Funktion
Nun, die Jungs von AVM haben sich dafür auch was überlegt und so gibt es tatsächlich in der Fritzbox eine Option ein Gerät „aufzuwecken“ sobald eine Anfrage an das Gerät erfolgt.
Das Problem bei einer VM, die Portfreigaben für den VPN werden natürlich an die IP & MAC der VM weitergeleitet d.h. das WOL Packet, welches zwar den Mediaserver erreicht, enthält die virtuelle MAC Adresse der VM, das LAN Interface des Mediaservers reagiert somit nicht und der Server samt VMs bleibt im Sleep Modus.
Das Problem lässt sich recht einfach umgehen, man erstellt einfach eine beliebige Portfreigabe auf den Server / Host selbst, also den Mediaserver und aktiviert die Option „Wake on LAN“ in der Fritzbox. Jetzt benötigt man nur noch eine Anfrage an den Port und schon startet der Server. Hierfür muss der Port selbst am Mediaserver nicht mal offen sein. Um eine Anfrage auf einem bestimmten Port zu schicken, reicht ein Portscan oder man sendet über Ncat ein Paket an den gewünschten Port.
Und hier liegt nun das zweite Problem: ein einfacher Portscan kann somit einen Start des Servers verursachen. Das ist zwar nicht weiter tragisch oder sicherheitsrelevant aber es ist eben auch nicht sehr elegant wenn jemand fremdes per Zufalls-Scan meinen Server aus dem Schlaf aufweckt.
Die Herausforderung ist also ein Gerät zu finden, welches in meinem Netzwerk hängt und sich von extern steuern lässt um WOL Packete zu verschicken. Meine erste Idee war, einen Alexa Skill zu verwenden. Nachdem die Alexageräte selbst aber keine WOL Packete versenden können, funktioniert bei dem Skill das Prinzip auch nur wieder darüber, dass von extern ein Packet an eine Portfreigabe der eigenen Fritzbox geschickt. Also wieder nicht das was ich wollte.
Arduino als WOL Server
Nachdem ich noch einen Arduino von einem Workshop aus der Arbeit daheim hatte, kam mir die Idee das ganze über diesen zu realisieren.
Die Idee: der Arduino verbindet sich beim starten automatisch mit dem eigenen WLAN und löst (automatisch oder nach einem Befehl) das Senden eines WOL Packets aus, welches wiederum meinen Mediaserver und somit meinen VPN Server startet. Das starten des Arduino wiederum übernimmt eine WLAN Steckdose welche über eine App und einen IoT Server von überall aus gesteuert werden kann.
Die Hardware Voraussetzungen sind überschaubar:
- Als Arduino hab ich einen ESP8266 auf einem D1 mini* Board verwendet.
- Die WLAN Steckdose ist von GOSUND*, hat einen Stromzähler integriert und ist per Alexa, Google, IFTTT etc. ansprechbar. Die App dazu nennt sich SmartLife.
Den Aufbau des Arduino Projekts, hab ich in dem Artikel WOL Server mit Arduino ausführlicher beschrieben.
Das Konzept hier aber kurz zusammengefasst:
Der Arduino wird über ein USB Ladegerät an die WLAN Steckdose angeschlossen. Arduino und Mediaserver befinden sich beide im selben Subnetz. Die WLAN Steckdose bleibt grundsätzlich aus. In der Fritzbox richtet man eine Portfreigabe (5444) auf die feste IP des Arduino ein.
Der Ablauf stellt sich nun wie folgt da:
- Über die APP SmartLife wird die WLAN Steckdose aktiviert
- Der Arduino startet und verbindet sich mit dem WLAN
- Der Arduino generiert einen Startcode und sendet diesen an eine definierte E-Mail Adresse
- Man empfängt die E-Mail und startet die APP Termux am Handy
- Dort verbindet man sich über ncat mit dem UPD Server des Arduino und gibt den Start Code aus der E-Mail ein
- Der Arduino sendet nun das WOL Packet an den Mediaserver
- Der Mediaserver „wacht auf“ und man kann sich mit dem VPN Server verbinden
Nachdem es mein erstes Arduino Projekt war, ist die Lösung mit der manuellen Eingabe des Starcodes ggf. noch etwas umständlich, ich wollte aber ein kleines Sicherheitsfeature drinnen haben, welches unabhängig von der Stromversorgung ist.
Ein paar Ideen welche den Prozess vereinfachen könnten:
- Punkt 1 bis 4 kann man auslassen, solange man die Steckdose vom Arduino nicht ausschaltet
- Solange der Startcode sich nicht ändert (siehe Punkt davor), könnte man sich auch ein Script schreiben, welches den Startcode enthält um den Server per „one click“ zu starten. (z.B. über ein Termux Widget: https://wiki.termux.com/wiki/Termux:Widget)
- Mit einem GSM Modul für den Arduino und einer SIM Karte könnte man den Serverstart auch mit Hilfe einer SMS auslösen.
- Den gesamten Prozess auf dem Handy könnte man mittels IFTTT und z.B. Tasker wohl weitestgehend automatisieren.
Fazit
Mit ein bisschen technischen Interesse, kann man sich oft selbst eine Lösung bauen ohne dabei viel Geld investieren zu müssen. Der VPN Server von SoftEther bietet mir volle Kontrolle und Einstellmöglichkeiten ohne dabei auf Leistung verzichten zu müssen. Der Anwendungsfall war für mich ein perfekter Grund in die Welt von Arduino einzusteigen und hat viel Spaß gemacht, es gibt einfach unzählige Möglichkeiten was man mit einem Arduino und ein paar günstigen Modulen alles machen kann. Die nächsten Ideen sind schon da.