Port 443 für verschiedene Services parallel nutzen

Bei Firewalls in Firmen und teilweise auch in Hotels und an manch öffentlichem WLAN-Hotspot sind oft nicht alle Port geöffnet. D.h. dass eine Verbindung ins Internet an diesen Punkten oft nur über die Standard-Web-Port 80 und 443 sowie manchmal noch einige VPN-Ports möglich ist.

Jedoch ist es nicht möglich, mehrere Services auf einem Server gleichzeitig am gleichen Port (und gleichem Netzwerkinterface) lauschen zu lassen

Wie nun kann man dann aber an diesen Punkten sowohl seine https-Webseiten erreichen als auch eine SSH-Verbindung zum Server aufbauen. Oder eine Verbindung zum eigenen openVPN-Server (dessen Port meist nicht bei den verfügbaren sind, diese beschränken sich meist auf PPTP und LSEC). Oder aber einen XMPP-Server? Die reguläre Lösung dafür wäre der Einsatz mehrerer Server bzw. zumindest einer eigener IP-Adresse pro Service. Das jedoch kann kostspielieg werden. Außerdem werden IPv4-Adressen aufgrund ihrer Knappheit auch nicht mehr so leichtfertig vergeben.

SSLH

Eine andere Lösung ist sslh. sslh ist ein Port-Multiplexer. D.h. es lauscht an einem Port (bei uns jetzt 443) und verteilt die Daten an die jeweiligen Services.

Tatsächlich läuft das so, dass nur mehr sslh am externen Netwerkinterface auf Port 443 lauscht. Die anderen Services (inkl. Webserver) lauschen nur am internen Interface (127.0.0.1) dafür jedoch alle an ihrem eigenen Port. sslh erkennt anhand der (auch verschlüsselten) Daten um welchen Dienst es sich dabei handelt und leitet die dann an das entsprechende Service weiter.

Die Entschlüsselung der Daten erfolgt dabei erst direkt beim Dienst selbst. sslh ist nicht der Endpunkt der Verschlüsselung sondern kann die verschiedenen verschlüsselten daten unterscheiden. Nachteile

Das ganze hat natürlich auch einige Nachteile: * Erreichbarkeit: Hat sslh ein Problem sind alle Services dahinter nicht erreichbar. Gerade ssh sollte also immer noch über einen anderen externen Port erreichbar sein. * Logging und Fehleranalyse: Im Log der einzelnen Services stehen alle externen Aufrufe nur noch unter der 127.0.0.1. Ein identifizieren von unberechtigten Zugriffen oder eine Fehleranalyse wird dadurch erschwert. * Unterstützte Dienste: Es werden nicht alle Dienst generell unterstützt sondern nur jene, welche anhand des verschlüsselten Datenstromes unterschieden werden können. diese beinhalten dzt. ssl, xmpp, openvpn und ssh.

Installation und Konfiguration

Die Installation erfolg erwartungsgemäß mittels

sudo apt-get install sslh

Im Anschluss daran muss die Konfiguration angepasst werden. Dies geschieht durch Editieren von /etc/default/sslh.

Dort setzen wir folgende Paramter:

RUN=yes
DAEMON_OPTS="--user sslh --listen <ext_IP>:443 --ssh 127.0.0.1:<ssh_port> --ssl 127.0.0.1:443 --openvpn 127.0.0.1:<openvpn_port> --xmpp 127.0.0.1:5222 --pidfile /var/run/sslh/sslh.pid"

Natürlich sind hier nur jene Services anzuführen, welche auch am Server laufen.

Außerdem sind die einzelnen Services entsprechend zu konfigurieren, dass sie nicht das externe Netzwerkinterface auf Port 443 blockieren und am internen auf ihrem Port lauschen.

Ist das erledigt (siehe auch Kapitel "Apache konfigurieren") kann sslh gestartet werden:

sudo service sslh start

Nun sollten die konfigurierten Services alle über Port 443 erreichbar sein.

Apache konfigurieren

Im Besonderen ist hier der Apache webserver zu beachten. Dieser lauscht standardmäßig am ext. Interface und muss nun umgestellt werden. Dazu ändern wir in der /ets/apache2/ports.conf folgende Abschnitte von "Listen 443" auf "Listen 127.0.0.1:443":

<IfModule mod_ssl.c>
    NameVirtualHost *:443
    Listen 127.0.0.1:443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 127.0.0.1:443
</IfModule>

Anschließend muss Apache neugestartet werden (und ist somit über ssl erst wieder erreichbar, wenn sslh läuft):

sudo service apache2 restart