In diesem Artikel wollen wir einen Web-Server ohne öffentliche IP Adresse mit einem LTE Stick im Internet betreiben. Dazu brauchen wir zusätzlichen einen virtuellen Server mit einer festen öffentlichen IP Adresse. Ein virtuellen Server (1 vCPU + RAM 512MB + SSD 10G) gibt es ab 1,- EUR pro Monat. Der vServer sollte eine feste IPv4 und IPv6 Adresse haben.

+=============================+          +=========+         +==========+
| Privater Server + LTE Stick |--dyn.IP--| vServer |-fixe IP-| Internet |
+=============================+          +=========+         +==========+

Bei einer Verbindung mit dem Mobilfunknetz per LTE Stick wird dem Teilnehmer eine private IPv4 (10.xx.xx.xx) dynamisch zugewiesen. Diese IP wird per NAT mit einer öffentlichen IPv4 Adresse verbunden. Nur einige Mobilfunkanbieter verteilen schon IPv6 Adressen, jedoch kein Anbieter bietet eine feste IP Adresse an. Der private Server soll jedoch immer unter der gleichen Adresse erreichbar sein.

Auf die Einrichtung vom LTS Stick, Mobil- und SSH-Verbindung werde ich nicht weiter eingehen. Es soll hier nur kurz und kompakt die Einrichtung eine SSH Tunnel beschrieben werden.

Erzeugen eines SSH Key

Auf dem privaten Server erzeugen wir uns ein SSH Key. Vom privaten Server übertragen wir den PublicKey (~/.ssh/id_rsa.pub) auf den vServer in die Datei (~/.ssh/authorized_keys).

ssh-keygen -q -t rsa -N '' -C 'root@tunnel' -f ~/.ssh/id_rsa

Parameter: (-q) Quiet, (-t) Type, (-N) New passphrase, (-C) Comment, (-f) File

SSH Dienst einrichten

Auf dem vServer müssen wir im SSH Dienst einige Einstellung vornehmen. Ohne die Einstellung wird der Tunnel nur an die Adresse „localhost“ gebunden.

sudo vim /etc/ssh/sshd_config

GatewayPorts yes
ClientAliveInterval 60
ClientAliveCountMax 2

Nach der Änderung müssen die Einstellungen im SSH Dienst neu geladen werden.

sudo systemctl reload sshd

Auf dem vServer können wir uns alle offen Ports und Adressen mit Netstat ansehen.

watch -n 0.5 "netstat -tulpen"

Tunnel aufbauen

Die LTE Verbindung besteht und wir können unseren SSH Tunnel vom privaten zum öffentlichen vServer aufbauen.

Unser privater Web-Server läuft auf Port 80 und soll am vServer unter Port 8080 erreichbar sein. Mit Parameter -R wird eine Remote-Tunnel an allen IP Adressen (*) erstellt. Der Parameter -N öffnt die Verbindung ohne eine BASH am Ziel.

ssh -N -R *:8080:localhost:80 root@vserver.host

Parameter: (-N) No remote command, (-R) Remote host is to be forwarded

Jetzt haben wir einen SSH Tunnel und der private Server ist im Internet mit einer festen IPv4 und IPv6 Adresse erreichbar.

curl http://vserver.host:8080/

Hinweis: Soll der Webserver auf Port 80 oder 443 (SSL/TLS) erreichbar sein, so darf nur der Root einen Port < 1024 öffnen. Wenn man kein Login per Root erlauben möchte, kann man einen Reverse Proxy auf dem vServer verwenden.

Nach einiger Zeit wird unsere Verbindung getrennt. Mit dem Tool autossh können wir automatisch eine neue Verbindung aufbauen.

sudo apt install autossh

Vor die SSH Parameter schreiben wir jetzt diese Werte.

autossh -M 0 -f -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=2 ...

Parameter: (-M) Monitoring, (-f) Force to background, (-o) Option

Das vollständige Kommando sieht so aus:

autossh -M 0 -f -o ConnectTimeout=10 -o ServerAliveInterval=60 -o ServerAliveCountMax=2 -N -R *:8080:localhost:80 root@vserver.host

Die Sicherheit des vServer sollte durch weitere Maßnahmen verbessert werden. Aktionen: Firewall einrichten, SSH Port schützen durch IP Beschränkung, SSH Port 22 ändern, Keine SSH Authentifizierung per Passwort, kein Zugriff per Root