z6c - personal blog about topics

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

TKInter basierte 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!

Kommentare / Diskussion: