Sshuttle is a good program for global proxy via SSH. However, in unstable network you need to restart manually. Now here is a kit for auto.
This is the code:
#!/usr/bin/env python import subprocess import os import sys import time import traceback import urllib import psutil import shelve import requests import random import re # Enter some websites. Make sure you can see the website in your # country without any secured connection. servers = ['http://ip.cn/', 'http://ip.42.pl/raw', 'http://jsonip.com', 'http://httpbin.org/ip', 'https://api.ipify.org/?format=json'] def get_ip(): try: page = requests.get(random.choice(servers), timeout=5).text ip = re.search('(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)', page) except: ip = None if ip is not None and ip.group is not None: return ip.group(0) else: return "nothing" def main(): try: gateway = sys.argv[1] subnets = sys.argv[2:] except Exception: print traceback.format_exc() usage() orn_ip = get_ip() command = 'sshuttle -r %s %s' % (gateway, ' '.join(subnets)) print '-' * 10, command proc = subprocess.Popen(['/bin/bash', '-c', command]) crn_ip = get_ip() wc = 0 while True: time0 = time.time() net_rcv0 = psutil.net_io_counters()[1] time.sleep(1) time1 = time.time() net_rcv1 = psutil.net_io_counters()[1] net_spd = ((net_rcv1 - net_rcv0) * 0.001) / (time1 - time0) print ("---- Download speed: %d Kb/s" %(net_spd)) print ("---- Your ip is: " + crn_ip) if wc % 5 == 0: if crn_ip == orn_ip: crn_ip = get_ip() if net_spd < 1 and proc is not None: crn_ip = get_ip(); if crn_ip == "nothing": print "---- Killed the sshuttle for restart." proc.kill() proc = None if proc is not None: if proc.returncode is not None: print "---- Killed the sshuttle for restart." proc.kill() proc = None else: crn_ip = get_ip() if crn_ip == "nothing": print "---- Waiting for Internet." elif crn_ip == orn_ip: print "---- Restarting the sshuttle." proc = subprocess.Popen(['/bin/bash', '-c', command]) wc = wc + 1 if wc >= 65532: wc = 0 def usage(): print """ ./sshuttle-ar.py... """ if __name__ == "__main__": main()
You have to have sshuttle to use this kit. The usage is very simple, and it is similar to the original sshuttle. For example:
python sshuttle-ar.py [email protected] 0/0 --dns --no-latency-control
That is it.
Have fun. Be free.