Einen Server daheim ohne öffentliche IPv4 Adresse

Ziel

Eigenen Server zu Hause ohne IPv4 Adresse von außen über einen sicheren Tunnel verfügbar machen.


Werkzeuge:

  • Remote Server im Public Internet, z.B. VPS S von ionos für 1 €/Monat
  • Home Server im Home Netz hinter NAT, z.B. Ubuntu (Optional: Esxi)
  • ssh mit Reverse TCP Port Mapping
  • ssh Schlüsselpaar
  • autossh
  • crontab

Vorgehen

Zunächst wird ein Schlüsselpaar generiert, damit die Verbindung zw. Home Server und Remote Server ohne Passwort möglich ist.

Auf dem Home Server:

ssh-keygen -t rsa -b 4096

Mit dem folgenden Befehl kann geprüft werden, ob die Schlüssel (Private & Public) generiert wurden. Erwartet werden die Einträge id_rsa (Private) und id_rsa.pub (Public)

ls -l .ssh

Anzeigen des Schlüssels

cat .ssh/id_rsa.pub

Auf dem Remote Server

nano .ssh/authorized_keys

Der auf dem Home Server generierte Schlüssel wird auf dem Remote Server unter dieser Datei abgelegt, indem er als neue Zeile hinzugefügt wird.

Eingehende Verbindungen auf dem Remote Server sollen drauf gelassen werden. Dafür wird sshd_config angepasst.

nano /etc/ssh/sshd_config

Am Ende werden die folgenden Befehle hinzugefügt.

GatewayPorts yes
ClientAliveInterval 60
ClientAliveCountMax=2

sshd Service wird über den folgenden Befehl neugestartet.

service sshd restart

Test des Tunnels

Auf dem Server lässt man ein Watch Commando laufen.

watch -n 0.5 "netstat -tulpn"

Falls auf dem System net-tools fehlen sollten, können diese per folgendem Befehl installiert werden.

apt install net-tools

Auf dem Home Server wird der ssh-Tunnel mit dem folgenden Befehl aufgebaut.

ssh -N -R 80:localhost:80 root@server.domain.com

Wenn eine andere Portnummer als 22 verwendet werden soll, kann der folgende Befehl verwendet werden.

ssh -p 39122 -N -R 80:localhost:80 root@server.domain.com

Auf dem Remote Server, wo der „watch“ Befehl ausgeführt wird, sollte jetzt das Portmapping für 80 zu erkennen sein. Damit wäre der Port 80 auf dem Home Server über die IP Adresse des Remote Servers von außen erreichbar. Den ssh-Befehl auf dem Home Server kann dann per ctrl+c abgebrochen werden.

Verbindung automatisieren

Die Verbindung wird auf dem Home Server per autossh automatisiert. Der Befehl sieht wie folgt aus:

autossh -M 0 -f -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=2 \ -N -R 80:localhost:80 root@server.domain.com

Falls ein anderer Port als 22 verwendet werden soll, dann gilt der folgende Befehl:

autossh -M 0 -f -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=2 \ -p 39122 -N -R 80:localhost:80 root@server.domain.com

Damit die Verbindung vom Home Server zum Remote Server auch nach einem Neustart automatisch aufgebaut wird, wird noch in der crontab ein Eintrag hinzugefügt.

crontab -e

Der autossh Befehl wird wie folgt in der crontab aufgenommen:

@reboot autossh -M 0 -f -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=2 \ -p 39122 -N -R 80:localhost:80 root@server.domain.com

Update am 02.02.2021: Auf Ubuntu 20.04.2 LTS funktioniert der obere Befehl mit „\“ nicht mehr. Der Befehl muss entsprechend angepasst werden:

@reboot autossh -M 0 -f -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=2 -p 39122 -N -R 80:localhost:80 root@server.domain.com


Quelle: https://blog.wirelessmoves.com/