Mit httptunnel kann man TCP-Verbindungen über http-Protokoll tunneln.
Homepage: http://www.nocrew.org/software/httptunnel.html
Lizenz: GPL
Tipps & Tricks
Mini-Howto
Einleitung
Vor einiger Zeit hat meine Schule uns mit einem Portfilter den Saft abgedreht, der nur noch Port 80 (HTTP) durch lässt. Ich dachte mir, dass es doch da irgendwas geben muss, um diese sinnlose Einschränkung zu umgehen - und so bin ich auf httptunnel gestoßen, eine Software, die es für Linux und Windows gibt, und die den Datenverkehr von jedem auf jeden anderen gewünschten Port umleitet und in das http-Protokoll verpackt.
Prinzip
Das Prinzip ist simpel. Um es einfach zu erklären bediene ich mich einem Beispiel. Nehmen wir also an, ich will von einem Rechner (localhost), der sich hinter einer restriktiven Firmenfirewall befindet, welche dem ausgehenden Verkehr nur Zugriff auf die ports 80 (http) und 443 (https) gestattet, eine Verbindung mit meinem zu Hause laufenden Rechner mit laufendem ssh-Server (192.168.0.103) aufbauen.
Eine normale tcp Verbindung ohne die Firewall liefe so ab:
- Der ssh-Client auf localhost schickt Daten an 192.168.0.103 an Port 22.
- Der ssh-Server auf 192.168.0.103 lauscht auf Port 22 nach Daten, und verarbeitet sie.
Diese Methode funktioniert natürlich nur, wenn man von Außen auf Port 22 des Heimcomputers Zugriff hat. Da uns dieser aber verwehrt ist, und wir den ssh-Server aus gewissen Gründen nicht auf einem der oben genannten Ports laufen lassen können, bedienen wir uns httptunnel.
Eine Verbindung über httptunnel sieht wie folgt aus:
- Der ssh-Client auf localhost schickt Daten an den lokalen Port 12345 (frei wählbar).
- Der httptunnel-Client htc lauscht auf localhost auf Port 12345 nach Daten und leitet diese weiter an 192.168.0.103 an Port 443, verpackt in das http-Protokoll.
- so gehen die Daten über einen Port, auf den wir zugreifen dürfen, und sind so gut wie nicht vom normalen http Datenverkehr zu unterscheiden.
- Der httptunnel-Server hts lauscht auf 192.168.0.103 auf Port 443 nach eingehenden Daten und schickt diese, vom http-Protokoll befreit, weiter an Port 22.
- Der ssh-Server auf 192.168.0.103 lauscht auf Port 22 nach Daten, und verarbeitet sie.
Einrichtung
Bedingungen
Damit httptunnel funktioniert, müssen einige Bedingungen zutreffen:
- hts (der server) läuft auf dem System, auf dem sich der Zielserver befindet (z.B. ein ssh-Server)
- htc (der client) läuft auf dem System, das auf den Zielserver zugreifen will und kennt den Port auf dem hts dort läuft
Da das Programm recht benutzerunfreundlich geschrieben ist, habe ich lange gebraucht, um heraus zu finden, wie man es zu bedienen hat - es gibt keine Fehlermeldungen auf STDOUT oder STDERR aus und beendet sich selbst bei Fehlern mit Errorcode 0
Starten des Servers
Die man page für hts gibt Anhaltspunkte, wie man den Server startet, jedoch gibt es einige Dinge, die man beachten muss.
Um auf dem Zielsystem den httptunnel-Server hts zu starten, verwendet man: hts -F localhost:22 443
Das öffnet den Port 443. Alles, was vom Client an diesen Port geschickt wird, wird von den http-Requests befreit und an Port 22 an den ssh-Server weiter geleitet.
Beachtet werden muss, dass man die Rechte hat, Port 443 (oder für welchen man sich auch entscheidet) zu öffnen. Man muss auch sicher sein, dass der Port nicht bereits von einem anderen Prozess geöffnet wurde.
Ob der Server läuft sieht man, wenn man ps auxw | grep "[h]ts" eingibt ("[h]ts" statt hts deshalb, damit grep sich nicht selbst findet).
Starten des Clients
Auch für htc gibt die man page wieder Anhaltspunkte, wie man vorgehen kann. Im Prinzip gelten auch hier die selben Regeln.
Will man zum Zielsystem verbinden, startet man den httptunnel-Client htc mit: htc -F 12345 192.168.0.103:443
192.168.0.103 ist hier die IP des Zielsystems, 12345 ist ein beliebig gewählter Port. Wieder sollte dieser nicht besetzt sein und man sollte die Rechte besitzen, diesen öffnen zu dürfen.
Um zu schauen, ob der Client einwandfrei gestartet ist, verwendet man wieder: ps auxw | grep "[h]tc"
Hätte die Firma zusätzlich zur Firewall einen http-Proxy mit der IP 10.0.0.9 und dem non-standard Port von 7898, sähe das Kommando für htc so aus: htc -P 10.0.0.9:7898 -F 12345 192.168.0.103:443
Die Verbindung
Nachdem alles eingerichtet ist, geht es an die Verbindung - in diesem Fall mit einem ssh-Client, über den man übrigens dann prima weitere Verbindungen tunneln kann. Die Prozedur läuft allerdings etwas anders ab, als gewöhnlich.
Normal würde man ssh username@192.168.0.103 verwenden
Mit htc benutzt man allerding ssh -p 12345 username@localhost, da ja der Datenfluss über den lokalen Port 12345 dann von htc verarbeitet und schließlich weitergeleitet wird.
Ende gut...
...und so kam es, dass ich in meiner Schule mit relativ wenig Aufwand wieder auf meinen Rechner zu Hause zugreifen konnte, um Unterrichtsmaterial rohlingsparend über ssh hin und her zu kopieren.
Fragen
Frage: Lässt sich das auch über einen ProxyServer wie Squid nutzen?
Ja, man kann es über Proxies mit oder ohne Autorisierung verwenden, ich habe dazu noch etwas in dem Teil zum Client geschrieben. Die man page gibt noch mehr Auskunft über die möglichen Optionen -- PeterMarquardt