Webserver als Reverse Proxy

Einrichtung eines Gateways für Websites, die auf einem Arbeitsplatzrechner gehostet werden

Ein Webserver im Internet kann als Reverse Proxy konfiguriert werden, um auf diese Weise Websites, die auf einem beliebigen Arbeitsplatzrechner gehostet werden, im Internet zur Verfügung zu stellen. Der Zugriff funktioniert auch auf einen Rechner im Heimnetzwerk.

In einem anderen Artikel dieses Blog wurde beschrieben, wie man mit einer Remote Port Weiterleitung Dienste im Heimnetzwerk für den Zugriff aus dem Internet verfügbar machen kann. Die dort beschriebene Lösung funktioniert allerdings nur, wenn sich der erforderliche SSH-Server im Internet als offenes Gateway konfigurieren lässt.

Ist das nicht der Fall, gäbe es mit einer Kombination aus Remote und Local Port Weiterleitung eine mögliche Alternative, die wiederum allerdings nur dann funktioniert, wenn der aus dem Internet zugreifende Client selbst einen Zugang zum SSH-Server besitzt.

Dies ist normalerweise aber nicht der Fall, wenn es sich beim Client zum Beispiel um einen Kunden handelt, für den man eine Website entwickelt, und der nur sporadisch den aktuellen Stand der Entwicklung sehen möchte. Dem Kunden will oder kann man normalerweise keinen SSH-Zugang zum eigenen Server im Internet zur Verfügung stellen und man kann auch nicht davon ausgehen, dass dieser mit der Einrichtung einer Local Port Weiterleitung auf seinem Rechner vertraut ist.

Es ist also nach einer Lösung gefragt, die für beliebige externe Clients ohne großen Aufwand verwendet werden kann und diese besteht in der Kombination einer Remote Port Weiterleitung und eines Reverse Proxy.

Voraussetzungen

Es wird ein Server im Internet benötigt, auf den man mit SSH zugreifen kann und auf dem ein Webserver läuft, der sich als Proxy konfigurieren lässt. Bei dem in diesem Beispiel verwendeten Apache Webserver müssen dafür die Module mod_proxy und mod_proxy_http bereits aktiviert oder aktivierbar sein.

Zum Verständnis dieses Artikels sind Kenntnisse in der bash und in der Konfiguration des Apache Webserver hilfreich. Außerdem wird auf die drei oben angegebenen Artikel dieses Blog verwiesen, was die Einrichtung einer Port Weiterleitung angeht.

Arbeitsumgebung

Im nachfolgenden wird ein Laptop namens Caboto verwendet, auf dem eine Website für einen Kunden entwickelt wird. Die Website soll unter der Adresse http://customer1.mydomain.de/ sowohl auf dem Laptop als auch vom Rechner des Kunden aufrufbar sein.

Meistens befindet man sich mit diesem Rechner im Heimnetzwerk, manchmal ist man damit aber auch unterwegs und in einem anderen Netzwerk angemeldet oder man verbindet sich über seinen Mobilfunkprovider mit dem Internet. Egal von wo man arbeitet, die in Entwicklung befindliche Website soll auf Bedarf für den Kunden aufrufbar sein.

Auf Caboto läuft neben einer Entwicklungsumgebung auch ein Webserver (auf Port 80) mit dessen Hilfe die in Entwicklung befindliche Website lokal betrachtet und getestet werden kann.

Des weiteren wird ein Server im Internet - ein sogenannter VPS - namens Cayenne verwendet, auf den man selbst mit SSH zugreifen kann und auf dem ebenfalls ein Webserver läuft. Dieser Server soll den Hostnamen server.example.com haben.

Einrichtung der Namensauflösung

Damit die Website mit dem Namen http://customer1.mydomain.de/ in einem Browser angezeigt werden kann, muss dafür gesorgt werden, dass dieser Name sowohl vom lokalen Rechner als auch von einem beliebigen Rechner außerhalb des Heimnetzwerks aufgelöst und in eine IP-Adresse umgewandelt werden kann. Dazu muss der Name customer1.mydomain.de mit der IP-Adresse des VPS Cayenne im DNS eingetragen werden.

Sobald dies erledigt ist wird allerdings auch auf dem Rechner Caboto, auf dem die Website gehostet wird, beim Aufruf von http://customer1.mydomain.de/ der Rechner Cayenne kontaktiert werden. Dies ist allerdings nicht wünschenswert, denn der Aufruf der Website soll ja lokal auch dann möglich sein, wenn der Rechner Caboto aus irgendwelchen Gründen keine Verbindung ins Internet hat oder wenn der Zugriff aus dem Internet nicht aktiviert ist.

Die Namensauflösung auf Caboto macht man daher am besten in der Datei /etc/hosts. Diese hat Vorrang vor der Auflösung über das DNS und würde dann wie folgt aussehen:

127.0.0.1	localhost
127.0.0.1	customer1.mydomain.de

Während der Name customer1.mydomain.de jetzt von jedem Rechner der Welt auf die IP-Adresse des VPS Cayenne auflöst, wird auf Caboto die lokale Netzwerkschnittstelle mit der IP 127.0.0.1 angesprochen.

Konfiguration des lokalen Webservers

Der Webserver auf Caboto bzw. ein virtueller Host muss Anfragen auf der Adresse 127.0.0.1:80 für den Namen customer1.mydomain.de entgegennehmen und beantworten:

<VirtualHost 127.0.0.1:80>
  ServerName customer1.mydomain.de

  DocumentRoot "/srv/vhosts/customer1/htdocs"

  <Directory "/srv/vhosts/customer1/htdocs">
    AllowOverride All
  </Directory>
</VirtualHost>

Nach einem Neustart des Webservers ist dieser virtuelle Host aktiv.

Die Port Weiterleitung aktivieren

Auf Caboto muss des weiteren die Möglichkeit bestehen, mit Hilfe von SSH eine Remote Port Weiterleitung einzurichten. Dazu bedient man sich am besten dem in diesem Artikel vorgestellten Bash-Skript ReverseTunnel, in dem man für den jetzigen Anwendungsfall nur den Wert der Variablen RPORT auf 8881 ändern muss, denn wir gehen davon aus, dass der Webserver auf Cayenne bereits andere Websites auf Port 80 zur Verfügung stellt:

#!/bin/bash
...
RPORT="8881" # Remote Port on Remote Host
...

Alle anderen Variablenwerte aus dem o.a. Skript können beibehalten werden.

Die Aktivierung der Remote Port Weiterleitung würde dann wie folgt aussehen:

uwe@Caboto:~$ ReverseTunnel start
Reverse tunnel from server.example.com:8881 -> localhost:80 established
PID 11266
uwe@Caboto:~$

Somit ist der Port 80 auf dem lokalen Rechner Caboto vom Server Cayenne auf Port 8881 erreichbar. Mit ReverseTunnel stop kann die Weiterleitung beendet werden.

Zwischenergebnis

  1. Der Webserver bzw. ein virtueller Host auf Caboto hört auf die Adresse 127.0.0.1 und Port 80 und nimmt Anfragen für den Namen customer1.mydomain.de entgegen.
  2. Auf dem Laptop Caboto ist die in Entwicklung befindliche Website in einem Browser mit der URL http://customer1.mydomain.de/ zu sehen.
  3. Im Hintergrund ist auf Caboto eine Reverse Port Weiterleitung aktiviert, die Netzwerkanfragen auf dem VPS Cayenne vom dortigen localhost Port 8881 auf den Port 80 des Rechners Caboto leitet.

Ein Aufruf der URL http://customer1.mydomain.de/ von einem anderen Rechner als Caboto - egal ob im gleichen Netzwerk oder von woanders - führt aber noch zu einer Fehlermeldung, da der Webserver auf Cayenne bzw. der virtuelle Host für die Adresse customer1.mydomain.de noch nicht konfiguriert ist.

Konfiguration des Reverse Proxy

Die Aufgabe des Webservers auf Cayenne ist es nun, Anfragen auf dessen externe Netzwerkschnittstelle (der IP) auf Port 80 an Caboto weiterzuleiten. Dies funktioniert jedoch nicht einfach so, da die Remote Port Weiterleitung ja nur Anfragen, die auf die lokale Netzwerkschnittstelle von Cayenne und auf Port 8881 eingehen, an Caboto weiterleitet.

Was auf Cayenne fehlt, ist die Verbindung zwischen der Anfrage auf die externe Netzwerkschnittstelle auf Port 80 zur lokalen Netzwerkschnittstelle auf Port 8881.

Hier kommt nun der Reverse Proxy ins Spiel. Er macht genau diese Weiterleitung von einer Anfrage an die externe Netzwerkschnittstelle auf die interne Netzwerkschnittstelle. Für den externen Besucher der Website ist dies vollkommen transparent, d.h. er sieht nicht, ob die Website auf Cayenne bereitgestellt wird oder von woanders kommt.

Die Konfiguration des Webservers bzw. des virtuellen Hosts hat nur wenige Anweisungen:

<VirtualHost <IP>:80>
 ServerName customer1.mydomain.de

 ProxyRequests Off
 ProxyPass / http://localhost:8881/
 ProxyPassReverse / http://localhost:8881/
 ProxyPreserveHost On

</VirtualHost>

Die Konfiguration muss berücksichtigen, dass die Anfrage über die IP des Rechners Cayenne auf Port 80 aber mit dem Namen customer1.mydomain.de kommt. Der Platzhalter <IP> ist natürlich mit der richtigen IP des Rechners Cayenne zu ersetzen.

Die Anweisungen sind im einzelnen:

  • ProxyRequests Off schaltet die Funktionalität eines Forward Proxy ab. Das ist wichtig, damit der Proxy nicht dazu missbraucht werden kann, beliebige Inhalte zwischenzuspeichern und weiterzuverbreiten. ProxyRequests Off schaltet dabei nicht die Funktionalität eines Reverse Proxy ab.
  • ProxyPass / http://localhost:8881/ aktiviert den Proxy. Alle eingehenden Anfragen (/) werden zur angegebenen Adresse (http://localhost:8881/) weitergeleitet. Da dies die Adresse des SSH-Tunnels zum Webserver auf Caboto ist, werden die Anfragen dorthin weitergeleitet und und beantwortet.
  • ProxyPassReverse / http://localhost:8881/ sorgt dafür, dass URLs, die vom Webserver auf Caboto in die HTTP Response Header Location, Content-Location und URI geschrieben werden, vom Proxy umgeschrieben werden, so dass diese die auf dem Proxy gültige Adresse beinhalten, bevor sie an den anfragenden Client zurückgereicht werden.
  • ProxyPreserveHost On leitet den auf Cayenne angefragten Namen customer1.mydomain.de zu Caboto weiter, da dieser gegebenenfalls ja auch mehrere virtuelle Hosts bedient und ansonsten nicht wüsste, für welchen virtuellen Host die Anfrage ist.

Nach einem Neustart des Webservers auf Cayenne kann die Website, die auf dem Rechner Caboto gehostet wird, vom Kunden mit der Adresse http://customer1.mydomain.de aufgerufen werden, unabhängig davon, in welchen Netzwerken sich der Rechner Caboto und der Kunde befinden.

Zusammenfassung und Ausblick

Mit Hilfe eines Servers im Internet ist es relativ einfach, in Entwicklung befindliche Websites, die auf einem Arbeitsplatzrechner bereitgestellt werden, für externe Besucher zugänglich zu machen. Dafür wird nur das Programm SSH und ein Webserver wie z.B. Apache benötigt. Der Zugriff kann dabei vom Arbeitsplatzrechner nach Bedarf ein- und ausgeschaltet werden.

Dieses relativ einfache Setup soll in späteren Artikeln noch erweitert werden. Themen sind u.a.:

  • Authentifizierung und SSL-Verschlüsselung der Verbindung
  • Mehrere Websites zur Verfügung stellen
  • Zwischenspeichern von Inhalten auf dem Reverse Proxy
  • Content-Filter für komplexe Websites
Top