From 833bd3de41024a70fe5be4c5480ae6fbce7fc0fa Mon Sep 17 00:00:00 2001 From: clowwindy Date: Fri, 20 Apr 2012 22:26:00 +0800 Subject: [PATCH] init --- README.md | 28 ++++++++++++- local.py | 106 +++++++++++++++++++++++++++++++++++++++++++++++++ server.py | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 248 insertions(+), 1 deletion(-) mode change 100644 => 100755 README.md create mode 100755 local.py create mode 100755 server.py diff --git a/README.md b/README.md old mode 100644 new mode 100755 index c1df1f5..f36d3cc --- a/README.md +++ b/README.md @@ -1,2 +1,28 @@ shadowsocks -=========== \ No newline at end of file +=========== + +shadowsocks is a lightweight tunnel proxy which can help you get through firewalls + +usage +----------- + +Put `server.py` on your server. Edit `server.py`, change the following values: + + PORT server port + KEY a password to identify clients + +Run `python server.py` on your server. To run it in the background, run `setsid python server.py`. + +Put `local.py` on your client machine. Edit `local.py`, change these values: + + SERVER your your server ip or hostname + REMOTE_PORT server port + PORT local port + KEY a password, it must be the same as the password of your server + +Run `python local.py` on your client machine. + +Change proxy settings of your browser into + + SOCKS5 127.0.0.1:PORT + diff --git a/local.py b/local.py new file mode 100755 index 0000000..6e64b6f --- /dev/null +++ b/local.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python + +# Copyright (c) 2012 clowwindy +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +SERVER = 'myserver_ip_or_hostname' +REMOTE_PORT = 8499 +PORT = 1080 +KEY = "foobar!" + +import socket +import select +import string +import struct +import hashlib +import threading +import time +import SocketServer + +def get_table(key): + m = hashlib.md5.new() + m.update(key) + s = m.digest() + (a, b) = struct.unpack('H', self.decrypt(self.rfile.read(2))) + reply = "\x05\x00\x00\x01" + try: + if mode == 1: + remote = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + remote.connect((addr, port[0])) + local = remote.getsockname() + reply += socket.inet_aton(local[0]) + struct.pack(">H", local[1]) + print 'Tcp connect to', addr, port[0] + else: + reply = "\x05\x07\x00\x01" # Command not supported + print 'command not supported' + except socket.error: + # Connection refused + reply = '\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00' + self.send_encrpyt(sock, reply) + if reply[1] == '\x00': + if mode == 1: + self.handle_tcp(sock, remote) + except socket.error: + print 'socket error' + + +def main(): + server = ThreadingTCPServer(('', PORT), Socks5Server) + server.allow_reuse_address = True + print "starting server at port %d ..." % PORT + server.serve_forever() + +if __name__ == '__main__': + encrypt_table = ''.join(get_table(KEY)) + decrypt_table = string.maketrans(encrypt_table, string.maketrans('', '')) + main()