Neue Antwort schreiben 
 
Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Socket Server über SSH
chessboi Offline
Erfahrener Benutzer

Beiträge: 250
Registriert seit: Jul 2008
Beitrag #1
Socket Server über SSH
Leider wird dieses Thema wohl nicht besonders viele interessieren. Doch statt ich mich die ganze Zeit aufrege, dass hier aus technischer Sicht tote Hose ist, versuche ich etwas Input zu liefern. Natürlich mit der Hoffnung, dass andere welche zur Zeit mehr nur passiv unterwegs sind über die Feiertage auch etwas Zeit finden und es mir nachtun.

SSH ist ein verschlüsseltes Protokoll um per Remote eine Netzwerkverbindung herzustellen. ssh um eine Remoteshell zu erhalten und scp um Dateien zu kopieren sind für Linux und Unix Admins wohl etwa die meistgebrauchten Tools. Natürlich gibt es auch Tools für Windows: z.B. Putty und winscp.

Wenn ich nun einen ssh Server habe, kann ich relativ einfach einen Socket zu diesem einrichten, welchen ich für eine gesicherte Verbindung gebrauchen kann:

ssh -D $port -N -f $user@$host

Als $port ist nicht der Remoteport sondern ein lokaler Port gemeint, welcher noch frei ist, dies kann Beispielsweise 4444 sein. Paramet -N steht dafür, dass auf der Gegenstelle nichts ausgeführt wird, -f damit das ganze im Background verläuft. $user und $host dürfte klar sein.

Mit ps -ef | grep ssh sehen wir nun, dass eine Verbindung besteht:
tux@main:~$ ps -ef | grep ssh
root 6409 1 0 12:20 ? 00:00:01 ssh -D 666 tux@lap -N -f
tux 6593 6576 0 13:39 pts/1 00:00:00 grep ssh

Nun kann man im Browser localhost auf dem eingestellten Port als Proxy verwenden. Der macht dann jegliche Verbindungen über diesen Server.

Stellt man im Firefox in about:config network.proxy.socks_remote_dns auf true um, geschiet auch die Namensauflösung über den Proxy.

Selbstverständlich funktioniert das ganze auch mit Windows (Putty): YouTube - SSH Tunneling

Das bringt es:
Man hat eine abhörsichere Verbindung.
Es ist schneller eingerichtet als ein üblicher Proxy, VPN oder ein forwarding mittels einer Firewall.
Man ruft eine Webseite vom Server her aus an. (Steht mein ssh-Server in Russland, habe ich eine russische IP-Adresse).

Einsatzzweck:
Wenn man zum Bleistift ans 25C3 geht und man annehmen muss, dass alle unverschlüsselten Passwörter welche man auf irgendwelchen Webforen oder sonstigem eingibt mitgeschnitten werden.
Wenn man einen Hardwaredefekt hat und der lokale Computer über das Wlan des Laptops ins Internet muss.
Wenn man einer Webseite vorgaukeln möchte, dass man aus dem Land des ssh-Servers kommt.
Wenn man aus anderen Gründen (wie eine ausgereifte Paranoia) eine gesichterte Verbindung haben möchte.

Leider habe ich noch nicht herausgefunden, wie man Systemweit den Socket benutzen kann. Evtl geht das mit iptables, da bin ich aber noch am suchen.
23.12.2008 12:50
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
bobe Offline
muh sager

Beiträge: 141
Registriert seit: Jul 2008
Beitrag #2
Socket Server über SSH
chessboi schrieb:  Leider habe ich noch nicht herausgefunden, wie man Systemweit den Socket benutzen kann. Evtl geht das mit iptables, da bin ich aber noch am suchen.
Unter Linux gibt es dafür tsocks.
Einfach installieren, in die /etc/tsocks.conf schreiben:
Code:
server = 127.0.0.1
server_port = 4444
Dann vor jeden Befehl der den SSH Tunnel nutzen soll, tsocks schreiben, also zb "tsocks firefox".
Wenn man für alle Programme den Tunnel nutzen will, einfach "tsocks bash" starten, dann nutzen alle Programme, die aus der bash gestartet werden, den Tunnel ;)
23.12.2008 13:32
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
chiaki Offline
Die Pommesfee

Beiträge: 12.554
Registriert seit: Jul 2008
Beitrag #3
Socket Server über SSH
Wenn man zum Bleistift ans 25C3 geht und man annehmen muss, dass alle unverschlüsselten Passwörter welche man auf irgendwelchen Webforen oder sonstigem eingibt mitgeschnitten werden.

hum ich dachte die sind selber gegen vorratsspeicherung und mitschnüffeln?
23.12.2008 13:33
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.951
Registriert seit: Jul 2008
Beitrag #4
Socket Server über SSH
bobe schrieb:  Wenn man für alle Programme den Tunnel nutzen will, einfach "tsocks bash" starten, dann nutzen alle Programme, die aus der bash gestartet werden, den Tunnel ;)
Hm.. interessant. Danke für den Tipp

Ich hab mich jetzt kurz über tsocks schlau gemacht. Der Befehl tsocks ist nichts weiter als ein Shellscript, was die Umgebungsvariable LD_PRELOAD setzt.

Das heisst, man kann via tsocks on|off das ganze für die aktuelle Shell aktivieren bzw. deaktiveren.

Will man das ganze systemweit, muss man nur die Variable LD_PRELOAD in die /etc/profile (oder die distributionsabhängige Variante) schreiben. tsocks muss natürlich installiert sein.

Code:
export LD_PRELOAD="/usr/lib/libtsocks.so $LD_PRELOAD"
Mit "tsocks off" kann man es dann für ein bestimmtes Terminal wieder deaktivieren.

Wenn man ssh als SOCKS-Server verwendet, lohnt es sich in der /etc/tsocks.conf noch die Option server_type = 5 zu setzen, damit SOCKS5 verwendet und auch UDP und IPv6 weitergeleitet wird.

@chiaki: Da wird auch nichts mitgeschnitten von den Betreibern.
Wohl aber kann ein gelangweiltes Scriptkiddie dort ein bisschen mitschneiden.
23.12.2008 14:06
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
chessboi Offline
Erfahrener Benutzer

Beiträge: 250
Registriert seit: Jul 2008
Beitrag #5
Socket Server über SSH
tsocks ist zwar interessant, aber so ganz funktionieren tut es bei mir nicht:

Die Tools wie ping, nslookup usw gehen nicht über den Socket.
Die Namensauflösung funktioniert ebenfalls nicht mit dem Socket.
23.12.2008 14:59
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.951
Registriert seit: Jul 2008
Beitrag #6
Socket Server über SSH
Nunja, tiefer als mit tsocks kannst du SOCKS kaum verankern. Dann muss schon OpenVPN ran :fresse:

die libtsocks.so überschreibt die üblichen C-Funktionen zum erstellen einer TCP oder UDP Verbindung, ist ein Binary statisch gelinkt oder verwendet weder TCP oder UDP (ping bentuzt ja IMCP und nslookup DNS), dann geht das nunmal nicht.

Zwar soll tsocks DNS über TCP umleiten können, aber so ganz funktionieren tut das nicht. Das SOCKS Protokoll sieht das auch nicht vor.

Von daher, selbst wenn es möglich wäre, SOCKS als virtuelles Interface (tun0 oder so) anzubieten, müsste ein Hack für IMCP und DNS her, und dafür hat man dann ja VPN. Und das wiederum haben wir ja nicht hingekriegt.

Nachtrag: Die einige Möglichkeit, DNS-Requests zu verschlüsseln, ist via SOCKS5. Der Firefox kann das über die oben genannte Option - dann wird der Hostname dem SOCKS-Proxy übergeben und dieser löst ihn dann auf.
Mit tsocks geht das nicht, weil dieses wie gesagt die C-Funktionen überschreibt und dort gibt es getrennte Funktionen für das auflösen Hosts und das öffnen einer TCP-Verbindung.

Nachtrag 16.07.09: Natürlich ist DNS keine eigene Transportschicht, das war Unsinn. Das Problem ist, dass SOCKS nur Sockets umleitet, und tsocks sich vor die Socket-Funktionen des Betriebsystems stellt und so die Sockets umleitet. Die DNS-Auflösung verwendet offenbar andere Funktionen und lässt sich damit nicht umleiten.
(Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2009 14:42 von gandro.)
23.12.2008 15:09
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
chessboi Offline
Erfahrener Benutzer

Beiträge: 250
Registriert seit: Jul 2008
Beitrag #7
Socket Server über SSH
Nunja ... wenigstens ist mir jetzt der Unterschied zwischen einem SSH-Tunnel und einem VPN klar.
23.12.2008 15:41
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.951
Registriert seit: Jul 2008
Beitrag #8
Socket Server über SSH
Woohoo, habs rausgekriegt wie man DNS doch umleitet.

Nach mehreren gescheiterten Versuchen, DNS Requests abzufangen und irgendwie erst ab den SSH-Server abzusenden, habe ich eine Lösung gefunden:

ttdnsd : The TOR TCP DNS Daemon

Ein Daemon, der eigentlich für TOR konzipiert ist - doch weil TOR ebenfalls auf SOCKS und tsocks zurückgreift macht es keinen Unterschied. Das Programm macht eigentlich nichts, als auf localhost nach DNS-Anfragen zu warten und diese an echte DNS-Server weiterzuleiten.

Alles was man tun muss, ist 127.0.0.1 als Nameserver einzutragen und ttdnsd via tsocks starten. Der voreingestellte OpenDNS-Nameserver tut bei mir seinen Dienst, die meines ISP leider nicht (ich habe das Gefühl, die kommen mit TCP nicht so ganz zurecht)

Nachtrag: ttdnsd benötigt ohne TOR den Parameter -c. Warum auch immer.
(Dieser Beitrag wurde zuletzt bearbeitet: 23.12.2008 21:17 von gandro.)
23.12.2008 20:23
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
chessboi Offline
Erfahrener Benutzer

Beiträge: 250
Registriert seit: Jul 2008
Beitrag #9
Socket Server über SSH
Hab das ganze nochmal angeschaut und herausgefunden wie einfach sich doch ein VPN mit ssh einrichten lässt:

Eine einfache Socketverbindung kann mit ssh -D 5000 -N -f $user@$host eingerichtet werden. Auf Server sowie Client reicht dazu ein normales Benuzterkonto ohne spezielle Rechte aus. Die meisten Programme welche auf das Internet zugreifen lassen sich über diesen Socket tunneln, wie etwa Firefox und Pidgin. Für die anderen gibt es das Programm tsocks welches die TCP-Verbindungen umleiten kann. Das funktioniert allerdings nicht mit allen Programmen (etwa wget weigert sich da mitzumachen) und ist zudem nicht besonders Komfortabel.

Hat man nun ein Root-Login auf Server sowie Client bietet ssh die Möglichkeit ein richtiges VPN einzurichten. Bedingung ist, dass man sich am Server mit root über ssh einloggen kann. Da manche Distributionen (wie etwa Ubuntu) ziemlich restriktive Berechtigungen haben muss in der /etc/ssh/sshd_config PermitRootLogin auf yes gesetzt sein. In der /etc/security/access.conf muss das Rootlogin auch erlaubt sein (Beispielzeile "+ : root : ALL" - dies kann allerdings auch auf gewisse Hosts eingeschränkt werden), dazu noch die Zeile "account required pam_access.so" in /etc/pam.d/sshd. Setzt man nun das root-Passwort neu (damit die Einstellungen übernommen werden) sollte das Login mit root per ssh funktionieren und wir können loslegen:

--- Einrichten eines VPN mittels SSH ---
ssh -NTCf -w 0:0 root@server
Nach dem Ausführen dieses Befehls sollte man auf dem Client sowie auf dem Server ein Netzwerkinterface mit dem Namen tun0 haben. Nun muss dies noch konfiguriert werden:
ifconfig tun0 192.168.2.90 pointopoint 192.168.2.80
Respektive auf dem Server:
ifconfig tun0 192.168.2.80 pointopoint 192.168.2.90
(IP-Adressen sind frei wählbar)
Auf dem Client noch die Defaultroute anpassen:
route add default gw 192.168.2.80 netmask 0.0.0.0
Nun kann der Client über den Server ins Netzwerk / Internet zugreiffen. Allerdings weiss der Server noch nichts mit den Paketen anzufangen. Einerseits muss TCP-Forwarding eingeschaltet sein:
echo "1" /proc/sys/net/ipv4/ip_forward
Nun noch ein NAT einrichten, damit die Pakete auch den Rückweg wiederfinden:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
(wlan0 ist Interface vom Netzwerk auf dem man sich den Zugriff wünscht)



Informationsquelle:
http://www.cyberciti.biz/tips/openssh-ro…-revisited.html
https://help.ubuntu.com/community/SSH_VPN
ip forward - Ubuntu Forums

Und schon steht das VPN!
Script welcher das ganze automatisiert folgt ...
13.07.2009 22:12
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
gandro Offline
Quälgeist

Beiträge: 8.951
Registriert seit: Jul 2008
Beitrag #10
Socket Server über SSH
Tausend Dank!

Grad das mit VPN war ja bisher für mich nicht so transparent und trivial, aber das hier macht die Sache einiges klarer.
13.07.2009 22:20
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Neue Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste