Christian Müller – Letzte Änderung: 05.12.2015 22:35 Uhr
SShuttle - MiniVPN per SSH - mit eigener GUI
SShuttle - Überblick
Mit SShuttle routet man Traffic durch eine (fast) beliebige SSH Verbindung.
Transparent proxy server that works as a poor man's VPN. Forwards over ssh. Doesn't require admin. Works with Linux and MacOS. Supports DNS tunneling.
SShuttle baut dafür eine SSH Verbindung auf, startet einen SOCKS Proxy und konfiguriert die lokale Firewall so um, daß der gewünschte Traffic durch den SOCKS geleitet wird.
SShuttle ist eine Python Scriptsammlung und nutzt den Systemseitig vorinstallierten SSH Client.
Installation per
git clone git://github.com/apenwarr/sshuttle
Ausführung mit
./sshuttle -r username@sshserver 0.0.0.0/0 -vv
Um die Firewall umbiegen zu können wird bei dem Start das Root / Sudo Passwort benötigt.
Meine GUI
Achtung! Ab hier kommt purer Knaup. Natürlich ist diese Codequalität nicht mein Ernst. Aber es funktioniert für mich und ich sehe keinen Sinn in der Optimierung :-)
Das Script
#!/usr/bin/python
import Tkinter
import tkMessageBox
import os
import sys
top = Tkinter.Tk()
try:
top.tk.call('console','hide')
except Tkinter.TclError:
pass
HOSTS = {
's1': ["root@server1", "0.0.0.0/0", "10.42.42.0/24"],
's2': ["root@server2", "0.0.0.0/0", "10.42.42.0/24"],
's3': ["user@freeshell.org", "0.0.0.0/0", "10.42.42.0/24"],
's4': ["user@shell.xshellz.com", "0.0.0.0/0", "10.42.42.0/24"],
's5': ["root@server5", "0.0.0.0/0", "10.42.42.0/24"],
}
def startsshuttle(id):
helloCallBack()
options = HOSTS[id]
host=options[0]
targetnet=options[1]
exclude=options[2]
command = "/usr/local/bin/sshuttle --dns --pidfile /Users/cm/sshuttle.pid -r %s %s -x %s -D #>/dev/null &" % ( host, targetnet, exclude)
os.system(command)
titlestring = "ONLINE %s" % id
top.title(titlestring)
def s1():
startsshuttle("s1")
def s2():
startsshuttle("s2")
def s3():
startsshuttle("s3")
def s4():
startsshuttle("s4")
def s5():
startsshuttle("s5")
def offline():
os.system("kill `cat /Users/user/sshuttle.pid` >/dev/null 2>/dev/null")
top.title("offline")
def ende():
offline()
sys.exit(0)
A1 = Tkinter.Button(top, text ="Online gehen Server1", command = s1)
A2 = Tkinter.Button(top, text ="Online gehen Server2", command = s2)
A3 = Tkinter.Button(top, text ="Online gehen Server3", command = s3)
A4 = Tkinter.Button(top, text ="Online gehen Server4", command = s4)
A5 = Tkinter.Button(top, text ="Online gehen Server5", command = s5)
B = Tkinter.Button(top, text ="Offline gehen", command = offline)
C = Tkinter.Button(top, text ="Ende", command = ende)
A1.pack()
A2.pack()
A3.pack()
A4.pack()
A5.pack()
B.pack()
C.pack()
top.title("offline")
top.mainloop()
Automator
Dieses Script nutzt tkinter, sieht hässlich aus, muss per Automator gestartet werden, damit es keine Konsole öffnet, startet im Hintergrund und muss nach vorne geholt werden, funktioniert aber zuverlässig und erwartungsgemäß und war außerdem in wenigen Minuten zusammengestrickt.
Viel Spass damit!