Gratis Internet (3): DNS Tunnel unter Windows
Aus NOBAQ
Der letzte Teil des Beitrags beschäftigt sich mit dem Clientzugriff unter Windows. Während ich im Artikel Gratis Internet (1): Australien, DNS- und ICMP-Tunnel bzw. Gratis Internet (2): DNS Tunnel und auth. NS mit einer statischen IP ausführlich erklärt habe, wie man einen DNS Tunnel unter Linux aufbauen kann erkläre ich hier nun die Vorgehensweise für Windows. Wieso? Wenn man unterwegs ist und in die Situation kommen sollte, einen DNS Tunnel zu benötigen ist die Wahrscheinlichkeit sehr hoch, dass man einfach nur ein Windows zu Verfügung hat. Deswegen erweitere ich hier gleich meine Anforderungen:
- Der Client soll unter Windows (ab NT) funktionieren
- Der Client soll keine Administratorrechte benötigen
- Der Client soll nicht installiert werden müssen
- Der Client soll nicht unnötig viele Libraries erfordern
- Der Client soll möglichst klein sein (wenige MB), sodass man ihn bequem auf einem USB Stick mitnehmen kann
Obwohl ich nicht mehr geglaubt habe dass ich alle diese Anforderungen erfüllen kann, ist es mir dann doch gelungen...
Inhaltsverzeichnis |
Aufgabenteilung
Prinzipiell erfordert der DNS Tunnel zwei Programme: droute.pl von Ozymandns und ein weiteres Programm, das die Daten irgendwie verarbeitet. Problematisch genug dabei ist, dass Ozymandns mit Perl geschrieben ist. Denn Windows bringen standardmäßig kein Perl mit und Cygwin bzw. ActiveState bedeuten zu viel Aufwand für “ad-hoc”-Lösungen unterwegs. Ich habe bereits mit dem Gedanken gespielt, das Programm nach plain Win-API zu portieren….
Der zweite Teil ist der ssh-Client. Auch hier gibt es das Problem, dass PuTTY, plink & Co die ProxyCommand Option von Openssh nicht kennen. Alle OpenSSH Portierungen die ich gefunden habe benötigten eine Installation mit Administratorrechten und basierten auf cygwin, was mehrere Anforderungen nicht erfüllt hat.
Die Lösung für ssh
Ich habe viel überlegt, welche einfachen Möglichkeiten es unter Windows als Alternative zu ssh geben könnte. Statt auf dem Server ssh zu starten, könnte ich z.B. mit dante einen SOCKS Proxy (mit Authentifizierung) installieren. Auf Clientseite (Windows) bräuchte es dann noch ein Programm, das STDIN/STDOUT von droute.pl (für das es noch keine Lösung gab!) in ein Socket zu konvertieren.
Aber alle diese Lösungen waren mir zu aufwendig und zu wenig erfolgversprechend. Ich habe das ganze Internet nach SSH Clients für Windows abgesucht die eine ProxyCommand-Option bieten könnten, aber nichts gefunden.
Niemals aber hätte ich gedacht, dass ich bei der Entwicklungsversion von PuTTY nachschauen könnte! Darauf bin ich erst zufällig in einem Forum gestoßen, in dem Simon Tatham selbst auf die Developerversion von PuTTY verwiesen hat. Und tatsächlich: Diese Version (z.Z. http://www.tartarus.org/~simon/putty-snapshots/x86/putty.exe) hat das benötigte Kommando tatsächlich eingebaut!
Das vereint nun alle Vorteile: SSH unterstützt Kompression, Tunneling mit SOCKS. PuTTY ist klein, kompakt, läuft überall, braucht nicht installiert werden und erfordert keine Administratorrechte.
Die Lösung für Ozymandns
Da nun das ssh-Problem gelöst war, war klar, dass ich eine Lösung für droute.pl finden musste. ActiveState Perl oder Cygwin zu installieren war einfach keine Lösung.
Eine lange Recherche brachte mich auf eine Windows Portierung: http://presence.irev.net/hacks/ozymandns_win_0.1.zip. Doch diese funktionierte nicht, da eine cygperl-DLL benötigt wurde. Nach nochmaliger langer Recherche habe ich dann diese gefunden aber auch dann funktionierte es nicht. Die Anwendung wurde offenbar mit CYGWIN’s Perl und PAR gebaut…
Zuerst aber musste ich die Funktion sowieso so überprüfen. Cygwin hatte ich zwar sowieso installiert aber irgendwie funktionierte das gerade nicht. Ausserdem war mir das zu mühsam. Also habe ich ActiveState Perl installiert und versucht das Programm damit zum Laufen zu bekommen. Mit dem eingebauten Package Manager sind die benötigten Perlmodule schnell installiert. Obwohl droute.pl offenbar nach der Installation der benötigten Module funktionierte, tat es das nicht mehr, wenn man als Parameter die Tunneldomain nimmt (dort müsste dann normalerweise die ssh-Meldung erscheinen):
Your vendor has not defined Fcntl macro F_GETFL, used at D:\DNS-Tunnel\test\droute.pl line 64.
Das Problem ist folgender Code:
# set STDIN to nonblock $flags=''; fcntl($infile, F_GETFL, $flags) or die "1\n"; $flags |= O_NONBLOCK; fcntl($infile, F_SETFL, $flags) or die "2\n";
Er sorgt dafür, dass STDIN nonblocking gemacht wird, d.h. jede Operation auf STDIN soll nicht blockieren. Da aber die Kommandozeile/Terminalemulation unter Windows komplett anders funktioniert als in UNIX geht das mit Windows nicht. Cygwin würde es aber hingegen simulieren, trotzdem wollte ich die Änderungen für ActiveState Perl machen, da mir das eleganter schien.
Die einzige Stelle, wo auf STDIN zugegriffen wird, ist der Lesethread:
$read_queue = Thread::Queue->new; $read_thread = threads->new(\&reader); sub reader { while(1){ if($read_queue->pending < 32){ my $data=""; $error=sysread(STDIN, $data, 110); if(length($data)){ $read_queue->enqueue($data);} if(undef $error) {exit(1);} } usleep(50 * 1000); } }
Hier fällt sofort auf, dass es komplett unsinnig ist, STDIN nonblocking zu setzen, da man nur einen höheren Resourcenverbrauch hat. Dass sysread blockiert ist nicht weiter schlimm, da der Lesevorgang ohnehin in einem eigenen Thread abläuft. Vermutlich ist das Nonblockingsetzen ein Relikt, bevor der Entwickler von ozymandns den Thread hinzugefügt hat. Also habe ich den Code einfach auskommentiert und, siehe da: BINGO:
D:\DNS-Tunnel>perl droute.pl -r 195.3.96.67 sshdns.passwort.tunnel.nobaq.net. SSH-1.99-OpenSSH_4.3p2 Debian-9
Es erscheint der SSH Prompt! Wichtig ist hier anzumerken dass man explizit einen DNS Server (hier den der TU Graz) angeben muss, sonst funktioniert es nicht.
Wie wird aus der Perl Datei eine exe?
Jetzt bleibt noch das große Problem dass das komplette ActiveState Perl nebst Modulen installiert sein muss. Eine kleine google Recherche brachte sofort das Ergebnis: Das kommerzielle http://www.indigostar.com/perl2exe.htm kann Perl Dateien in exe Dateien compilieren. Problem: Es funktionierte mit der aktuellen ActiveState Perl Version nicht. Also nahm ich den anderen Weg: PAR. Dieses Perlmodul macht das gleiche, nur packt zusätzlich alle abhängigen Module mit ein. Es funktioniert wie jar-Dateien unter Java. Das PAR Modul selbst war schnell installiert. Aber um eine exe-Datei erstellen zu können braucht man den PAR Packer “pp” der natürlich nicht bei ActiveState dabei ist. Nach ein bisschen google-Recherche hab ichs dann gefunden: Das Repository auf http://www.bribes.org/perl/ppm/package.xml bietet das gesuchte Paket an und installiert “pp.pl”. Mit dem einfachen pp Befehl habe ich dann aus der geänderten droute.pl eine droute.exe erstellt:
pp droute.pl -o droute.exe
Die resultierende Datei ist 2.7MB groß und beinhaltet in einer ZIP File den Perl Interpreter und alle benötigten Module. Zusätzlich hab ich noch dig incl. der benötigten Libraries eingebaut was unterwegs das Debugging vereinfachen könnte. Ich stelle hier alles was benötigt wird zum Download zu Verfügung: Media:dns-tunnel.zip
Download
HIER: Media:dns-tunnel.zip
Anleitung zur Verwendung
Zuerst das PuTTY aufrufen, zu Connection –> Proxy gehen und folgende Einstellungen machen:

Danach wird der lokale SOCKS5 Proxy aktiviert, um beliebige Programme tunneln zu können (”dynamisches Forwarding”). Als Alternative können auch statische Portforwardings gewählt werden. Das Ergebnis sieht man hier:

Da die Verbindung über DNS sehr langsam ist lohnt sich das Einschalten der DNS Komprimierung:

Zu guter Letzt stellt man die Verbindung her indem man als Host “domain.invalid.” eingibt. Damit stellt man sicher dass der Host ungültig ist. Und der ist ja für die Verbindung egal, da diese ja sowieso über droute.exe geht:

Nach einem Klick auf “Open” stellt man die Verbindung her, gibt Benutzernamen und Passwort ein und man ist per SSH am Remoteserver.
Nun kann man in eine beliebige Anwendung, z.B. Firefox gehen und den lokalen SOCKS5 Proxy als Proxyserver einstellen:
...und schon surft man - sehr langsam aber doch - gratis am jedem WLAN Hotspot :-)
Kommentare
Dennis said ...
User said ...
In der aktuellen CHIP 06/2009 in der DNS-Trick für kostenloses Surfen via HotSpots auf Seite 144 zu finden, auch der Name Nikolaus Hammler ist dort erwehnt im zusammenhang mit der Nutzung vonb Windows.
Der Artikel ist SUPER und freut mich sehr, dass ich jetzt vor deren Abzockerei gewappnet bin :-) .
--User 05:03, 9. Mai 2009 (MSD)
Chris said ...
Hallo, ich glaube ich bin zu dumm um das einzurichten...
Die Abfrage ./droute.pl -r *IP_VON_MEINSERVER* sshdns.*MEINSERVER.MEINEDOMAIN.TLD*
führt in der Konsole zu der fortlaufenden Ausgabe:
- (Ʋ×]·ç}DÛM=#(Ʋ×]·ç}DÛM=#(Ʋ×]·ç}DÛM=#(Ʋ×]·ç}DÛM=#(Ʋ×]·ç}DÛM=#(Ʋ×]·ç}DÛM=#(Ʋ×]·ç}DÛM=#(Ʋ×]·ç}DÛM=
Scheint eine Endlosschlaufe zu sein....
Und auf dem Server wird auf der Konsole folgendes ausgegeben:
UDP connection from *MEINE_PRIVATEIP*:1300 query 7887: (54-19184.id-8560.down.sshdns.*MEINSERVER.MEINEDOMAIN.TLD*, IN, TXT) - 54-19184.id-8560.down.sshdns.*MEINSERVER.MEINEDOMAIN.TLD*. 0 IN TXT "Hi: Mon May 11 23:53:35 CEST 2009" NOERROR
- id = 7887
- qr = 1 opcode = QUERY aa = 1 tc = 0 rd = 1
- ra = 0 ad = 0 cd = 0 rcode = NOERROR
- qdcount = 1 ancount = 1 nscount = 0 arcount = 0
Bei dig erhalte ich die richtige IP Adresse zurück, welche ich mit -i angegeben habe. Kann mir jemand helfen?
--Chris 01:40, 12. Mai 2009 (MSD)
Niki said ...
Hi Chris,
Was steht bei dir am Server (droute.pl) in der Zeile
$opts{forward}
?
Dieser SSH Server muss von dem Punkt an dem nomde läuft erreichbar sein, z.B. sshdns:127.0.0.1:22
lg Niki
--Niki 13:19, 12. Mai 2009 (MSD)
Berniebaer said ...
Hmm, irgendwie scheinen die Informationen aus dem Artikel in der Chip nicht mit den Informationen hier auf der Webseite übereinzustimmen. Brauche ich denn nun einen Server auf dem der SSH-Tunnel läuft?
Vielen Dank Bernd
--Berniebaer 14:05, 19. Mai 2009 (MSD)
Niki said ...
Hi Berniebaer,
Doch, im großen und ganzen stimmen sie überein.
Was nun stimmt: Ein Tunnel ist immer ein Konstrukt zwischen zwei PCs, das "rennt" nicht auf einem.
Du brauchst:
- Einen Rechner/Server/Computer/vServer/... auf dem du die Möglichkeit hast ein Programm zu starten. Ausserdem muss ein UNIX System (z.B. Linux) drauf laufen.
- Es muss perl installiert sein samt benötigter Module (z.B. Net::DNS)
- Port 53 (DNS) muss frei sein und du musst ihn verwenden dürfen.
- Du brauchst entweder root-Rechte oder Rechte, dein Programm an Port 53 lauschen zu lassen.
Also in Summe: Entweder einen eigenen Linux-Server zu Hause oder einen vServer.
Was du nun über den *DNS-Tunnel* laufen lässt bleibt dir überlassen. Am geschicktesten ist aber sicher SSH, d.h. über den DNS-Tunnel läuft dann eine SSH Verbindung, z.B. zum SSH Server auf dem gleichen Rechner. Erst über SSH werden dann mit Hilfe von Socks die restlichen Protokolle (www, Mail etc) getunnelt.
--Niki 21:23, 19. Mai 2009 (MSD)
Berniebaer said ...
Vielen Dank für die rasche Antwort, habe einfach nicht genau gelesen.
LG BB
--Berniebaer 23:05, 19. Mai 2009 (MSD)
Faustus said ...
Moin Ich hab mal eine Frage, ich habe es in der Praxis getestet funktioniert wirklich 1 A. Da kam mir nur eine Idee, ich benutze Proxifier um mit dem localen Socks5 alle Programme zu tunneln. Da kam mir folgende Idee : Warum machen wir nicht 3,4,5.... DNS Connections auf über droute (mir Putty), und binded alle geöffnetet Socks5 in ein proxychain mit ein, so sollte die Verbindung doch einigermassen schneller von statten gehen, falls mehrere Verbindungen angefordert werden. In der Praxis funktioniert das leider nicht, ich öffne mit Putty zwar einen neuen TunnelPort, aber wenn ich dann beide localen proxys in Proxifier eintrage, geht keine Verbindung mehr raus. Woran könnte das liegen? . Liege ich falsch mit meiner behauptung das dies funktionieren könnte auf einem Host ? Oder bräuchte ich dann mehrere Server ?
--Faustus 16:22, 27. Mai 2009 (MSD)
Niki said ...
@Faustus: Sorry, dazu kann ich dir nichts sagen. Ich habe das Ding eigentlich "für den Notfall" gebastelt. Aber normalerweise müsste es gehen, das Ding verwendet ja Sequenznummern. Unter Linux hab ich es gerade getestet: Zwei parallele SSH Sessions sind möglich, also muss das gleiche auch für Windows funktionieren. Probier zuerstmal parallel die droute.exe auszuführen. Normalerweise sollte das gehen. In weiterer Folge zweimal eine SSH Verbindung per PuTTY - jeweils über ein eigenes droute. Müsste eigentlich auch gehn. Ansonsten liegt der Fehler vielleicht bei Proxyfier (kenn das Programm nicht).
--Niki 20:00, 29. Mai 2009 (MSD)
onkelarnie said ...
Hi, ich habe jetzt auch einmal einen Tunnel aufgesetzt und versuche gerade diesen mit einem Win Client anzusteuern. mit #dig @<ip-des-servers> www.nobaq.net escheint auch schon eine Ausgabe auf der Cleint und Serverseite, daß der NS antwortet. Doch leider funktioniert der Proxy über Putty nicht. Wie aknn man die Clientseite testen ?
Danke Arne
--onkelarnie 14:27, 15. Jun. 2009 (MSD)
Niki said ...
@onkelarnie: Steht eh oben im Artikel:
droute -r <DNS-des-Providers-oder-lokaler> sshdns.<DNS-Eintrag-zum-Tunnel>
z.B.:
droute -r 195.3.96.67 sshdns.tunnel.nobaq.net.
Dann müsste der Banner des SSH Servers erscheinen, z.B.:
SSH-1.99-OpenSSH_4.3p2 Debian-9
--Niki 14:37, 15. Jun. 2009 (MSD)
onkelarnie said ...
hi, ich bekomme keinerlei ausgabe:
linux-server mit laufendem nomde.pl:
./nomde.pl -i 0.0.0.0 into.<domain1>.org port 53 TCP/UDP vom router ist weitergeleitet über dyndns ist ne subdomain weitergeleitet: into.<domain3>.org > ip_des_routers
nameserverconfig: into.<domain1>.org IN NS into.<domain2>.org into.<domain2>.org CNAME into.<domain3>.org
wenn ich jetzt eingebe:
droute -r <mein_DNS_SERVER> sshdns.into.<domain1>.org
dann passiert gar nichts.
mit der eingabe: dig @into.<domain3>.org www.nobaq.net antwortet der server.
--onkelarnie 15:11, 15. Jun. 2009 (MSD)
Maël said ...
Hallo Zusammen. Beschäftige mich gerade mit der erstellung eines DNS Tunnels. Erstmals riiesen Danke für diese Anleitung. Leiter habe ich keine Kentnisse von Perl.
Deshalb nun meine Frage: Die droute.exe welche hier heruntergeladen werden kann. auf welchem Port läuft diese? Das heisst was muss forgewarded sein? SSH und DNS?
Danke und Gruss
--Maël 10:34, 17. Jun. 2009 (MSD)
Niki said ...
@onkelarnie: Wenn du willst dass ich dir helfe, schreib bitte deine echten Daten rein (kannst mir auch ein E-Mail schicken), aber raten fange ich jetzt sicher nicht an ;-) Was mir auf den ersten Blick auffällt: Was soll das sein?
dig @into.<domain3>.org www.nobaq.net
Damit fragst du den Server auf into.<domain3>.org rekursiv nach den Daten für www.nobaq.net. Du willst doch wohl eher was wie:
NS_SERVER=`grep '^nameserver' /etc/resolv.conf | awk '{print $2}'`
dig @$NS_SERVER into.<domainX>.org
@Maël: Nein, die droute.exe ist der Clientteil, der braucht gar kein Portforwarding. Genau das ist ja der Clou daran wieso es auch hinter Firewalls funktioniert: Weil DNS meistens immer durchgeht. Den Server (nomde) wirst du wohl auf einem UNIX System installieren müssen. Hast du eine öffentliche IP am Rechner passt alles, sonst musst du nur Port 53 (vor allem UDP aber auch TCP) weiterleiten.
--Niki 01:20, 18. Jun. 2009 (MSD)

Hey, das aktuelle Putty hat’s auch schon drin. Mir fehlte wohl echt die nötige Perl-Kenntnis… Applaus!!! Hoffentlich finden das nicht zu viele Leute, sonst wirds bald das Netz überlasten und dann abgestellt werden, also nicht mehr lange funktionieren... Liebe Grüße, Dennis
--Dennis 00:48, 13. Jan 2008 (MSD)