Poor Mans Webserver "ohne" öffentliche IP

2021-10-07

Dies ist das Setup mit dem ich meine Webseite betreibe. Schlüsselkomponente ist hier ein Webserver mit öffentlicher IP. Der Titel ist also nicht 100%ig korrekt ;-)

Vorteil dieser Konfiguration ist, dass meine Daten lokal bei mir zu Hause liegen und man einfach einen kleinen/günstigen vServer mieten kann. Was und wie viele Server dann von zu Hause zugeschaltet werden (Bei mir nur ein Raspberry PI Zero W) bleibt einem selbst überlassen.

Topologie

                     |
+--------------------+--------------------+
|                    |                    |
|                    v                    |
|          externer-server.de:80          |
|                                         |
|    +---------------^---------------+    |
|    | Nginx         |               |    |
|    |               |               |    |
|    |               |               |    |
|    +---------------v---------------+    |
|                                         |
|              localhost:8888             |
|                    ^                    |
|                    |                    |
+--------------------+--------------------+
                     |
                     |  Reverse SSH Tunnel
                     |
      +--------------+-------------+
      |              |             |
      |              v             |
      |        localhost:9999      |
      |              ^             |
      |              |             |
      | +------------+-----------+ |
      | | Apache 2   |           | |
      | |            v           | |
      | |                        | |
      | +------------------------+ |
      |                            |
      +----------------------------+

Konfiguration (FreeBSD - Nginx)

Den öffentlichen Server betreibe ich mit FreeBSD. Die Konfiguration unter Linux sollte aber fast identisch laufen.

Im nginx Verzeichnis wo auch die nginx.conf liegt, habe ich mir eine extra Datei angelegt.

/usr/local/etc/nginx/proxy-tunnel.conf

server {
    server_name externer-server.de;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://127.0.0.1:8888;
    }
}

Die Datei kann man dann einfach in der nginx.conf inkludieren. Der include kommt mit in den http Block der nginx.conf.

http {
    ...
    include       proxy-tunnel.conf;
    ...
}

Konfiguration (Home Server)

Auf dem Raspberry Pi läuft ein Raspbian Lite. Den Reverse SSH Tunnel habe ich wie hier bereits beschrieben per systemd eingerichtet.

Reverse SSH Tunnel mit systemd

Den Apache 2 Server läuft in Docker. Das Portmapping muss dann von intern 80 auf 9999 extern gehen.

sshnginxfreebsd

Freebsd Autostart Process

Reverse SSH Tunnel mit systemd