Die Möglichkeit, einen lokalen Rechner unter einer öffentlichen IPv4-Adresse freizugeben, bringt diverse Vorteile. Leider sind viele von uns hinter einem NAT einer einschränkenden Endverbraucher-Scheißkiste gefangen. Den Provider davon zu überzeugen, eine statische IPv4-Adresse zu reservieren, ist oftmals teuer oder gar nicht möglich (hust DSLite).
Eine angehensweise ist das Aufsetzen einer VPN-Verbindung, jedoch möchte nicht jeder auf dem Gerät eine VPN-Software o.ä. aufsetzen. Stattdessen verwenden wir hier in dieser Anleitung ein Raspberry Pi, der als "Mittelmann" bei der VPN-Verbindung dient.
Ein toller Name, nicht wahr? Das Projekt war ursprünglich eine Schnapsidee von mir, als ich testen wollte, wie schnell ein altes Windows-Betriebssystem, das ohne jeglichen Schutz online ist, angegriffen werden kann.
Hierbei benötigen wir:
Bevor wir starten können, muss zunächst unser VPS-Server eingerichtet werden. Beginnen wir mit den IP-Adressen. Mein Provider hat bereits beide IPv4-Adressen vorkonfiguriert, sodass ich keine Änderungen mehr machen musste. Am Ende müssen beide IPv4-Adressen auf einer Schnittstelle konfiguriert sein.
Wenn du schon darauf bestehst, einem Gerät eine öffentliche IPv4-Adresse zu geben, solltest du ihm auch eine coole Domain geben. Zumindest habe ich das so gemacht.
Gehe dazu zu deinem Lieblings-DNS-Provider (z.B. Cloudflare) und binde dort deine Domain ein. Ich verwende hier meinen eigenen DNS-Server. Die Haupt-IP vom VPS sollte eine Subdomain bekommen. Darüber kannst du dann zukünftig den Server für Wartungsarbeiten erreichen. Die Domain selbst vergibst du dann die separate IP-Adresse. Über der wird dann dein Gerät erreichbar sein.
Wir wollen, dass der VPS-Server alles zum Raspberry Pi routet und der Raspberry Pi zum Gerät am Ende des LAN-Kabels. Dafür aktivieren wir IP-Forwarding auf beiden Geräten.
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
Hierfür unkommentieren wir net.ipv4.ip_forward=1
in der Datei /etc/sysctl.conf
.
Für den VPN-Server verwenden wir Wireguard. In diesem Schritt gehe ich davon aus, dass Wireguard bereits auf dem Server installiert ist. Beginnen wir nun mit der Konfiguration zwischen VPS-Server und dem Raspberry Pi.
[Interface]
Address = 10.8.0.1/24
SaveConfig = false
ListenPort = 51820
PrivateKey = QP3nVqzSGNOJcbI8EuuMLEHZ+Ab4KjXTJpwG9F6gNlg=
[Peer]
PublicKey = zLLFeZ1pEGc7tTNvsWXSLjMqWlyfcNJsjUn76WovxyE=
AllowedIPs = 10.8.0.2,78.31.64.138/24
Und so sollte /etc/wireguard/wg0.conf
auf meinem Server aussehen. Stelle sicher, dass du meine IP-Adresse mit deiner separaten IP-Adresse austauschst.
Verwende unbedingt andere Keys als die hier genannten! Zur Key-Generierung kannst du z.B. Seiten wie diesen hier verwenden.
Auch wenn es für einige von euch offensichtlich ist, solltet ihr darauf achten, dass ihr den öffentlichen Schlüssel der Gegenstelle (in diesem Fall den des Raspberry Pi's) nicht mit dem eures Servers verwechselt.
Selbst nach einem Neustart wird die Konfig nicht übernommen, da mit momentan den Tunnel nur manuell starten können. Hierzu verwenden wir ein Autorun-Script, dass wir beim Starten ausführen.
#!/bin/bash
systemctl start wg-quick@wg0
ip addr del 78.31.64.138/24 dev ens3
ip neigh add proxy 78.31.64.138 dev ens3
Bitte beachte auch hier wieder auf die IP-Adresse und auf die Schnittstelle. Durch diesen Script wird der Tunnel gestartet und die separate IP wird dem Tunnel überlassen. Danach speichern wir die Datei unter /root/autorun.sh
und markieren die Datei aus ausführbar mittels chmod +x /root/autorun.sh
.
Zum Schluss erstellen wir ein Service, der beim Bootvorgang das Script ausführt.
[Unit]
Description=VPN stuff
[Service]
ExecStart=/root/autorun.sh
[Install]
WantedBy=multi-user.target
Diese Datei speichern wir unter /etc/systemd/system/vpnstuff.service
ab. Anschließend laden wir den Dienst neu und aktivieren den Service.
root@host:~# systemctl daemon-reload
root@host:~# systemctl enable vpnstuff.service
root@host:~# reboot
Nach dem Neustart sollte der Tunnel erreichbar sein. Testen können wir das, indem wir die IP von der internen wg0-Schnittstelle ''10.8.0.1'' anpingen.
root@host:~# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 10.8.0.1: icmp_seq=2 ttl=64 time=0.049 ms
64 bytes from 10.8.0.1: icmp_seq=3 ttl=64 time=0.043 ms
^C
--- 10.8.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2017ms
rtt min/avg/max/mdev = 0.037/0.043/0.049/0.005 ms
Auch hier gehe ich davon aus, dass WireGuard bereits installier ist. Kümmern wir uns nun um die Konfiguration.
[Interface]
PrivateKey = cEZoCQlVM10V2Ua2ZwwstOcmdMeUOrLGN+6fND/zn3w=
Address = 10.8.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = 1U3MawSu1M+PgcauW97vm6PiwA9qDSuOIzHeh8fKK04=
AllowedIPs = 0.0.0.0/0
Endpoint = 78.31.64.135:51820
PersistentKeepalive = 25
Diese Konfig speichern wir unter /etc/wireguard/wg0.conf
ab. Genauso wie beim Server muss aktuell der Tunnel manuell gestartet werden. Aber das machen wir in einem späteren Schritt!
Der Pi sollte schon Plug&Play sein. Schließlich kann jedes Gerät heutzutage DHCP, also warum nutzen wir es nicht gleich?
pi@penisexposer:~ $ sudo apt install isc-dhcp-server
pi@penisexposer:~ $ sudo systemctl disable isc-dhcp-server
Direkt nach der Installation kommt der Fehler, dass der DHCP Server nicht starten konnte. Aber das ist kein Problem, da wir hier noch die Standard-Konfig drin haben.
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
# Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4="eth0"
#INTERFACESv6=""
Im nächsten Schritt konfigurieren wir die Schnittstelle, auf dem der DHCP-Server läuft. IPv6 lassen wir kommentiert, da wir es hier nicht verwenden. Die Konfig ändern wir in der Datei /etc/default/isc-dhcp-server
.
Nun konfigurieren wir das Netz, dass über DHCP ausgegeben wird.
subnet 0.0.0.0 netmask 0.0.0.0 {
option routers 10.2.0.1;
range 78.31.64.138 78.31.64.138;
option subnet-mask 255.255.255.255;
option domain-name-servers 1.1.1.1;
one-lease-per-client true;
}
Nicht jedes Gerät unterstützt das Subnetz 255.255.255.255. Falls es hier zu Problemen kommt, verwende stattdessen 255.255.255.252.
Diese Netzkonfiguration speichern wir in die Datei /etc/dhcp/dhcpd.conf
.
Nun wo wir die VPN-Verbindung zwischen Server und Pi haben und jetzt den DHCP-Server einem Netz zugewiesen haben, kümmern wir uns um das Autorun-Script.
#!/bin/bash
systemctl start wg-quick@wg0
ip addr add 10.2.0.1 peer 78.31.64.138 dev eth0
dhclient -v
rm /var/lib/dhcp/dhcpd.leases
service isc-dhcp-server restart
Durch diesen Script wird der Tunnel und DHCP gestartet. Danach speichern wir die Datei unter /home/pi/autorun.sh
und markieren die Datei aus ausführbar mittels chmod +x /home/pi/autorun.sh
.
Zum Schluss erstellen wir ein Service, der beim Bootvorgang das Script ausführt.
[Unit]
Description=VPN & DHCP stuff
[Service]
ExecStart=/home/pi/autorun.sh
[Install]
WantedBy=multi-user.target
Diese Datei speichern wir unter /etc/systemd/system/exposer.service
ab. Anschließend laden wir den Dienst neu und aktivieren den Service.
pi@penisexposer:~# systemctl daemon-reload
pi@penisexposer:~# systemctl enable exposer.service
pi@penisexposer:~# reboot
Das war’s auch schon. Verbinde nun dein Gerät mit dem LAN-Port deines Pi's und schalte DHCP ein. Automatisch sollte dein Gerät die separate IPv4-Adresse vom VPS-Server zugewiesen bekommen.