more output and error handling in socks.py

This commit is contained in:
Arvid Norberg 2014-01-14 09:07:39 +00:00
parent d7be4659c8
commit 67219409a4
1 changed files with 17 additions and 13 deletions

View File

@ -2,8 +2,6 @@
"""Minimal non-feature complete socks proxy""" """Minimal non-feature complete socks proxy"""
import logging
from logging import error, info, debug
import random import random
import socket import socket
from SocketServer import StreamRequestHandler, ThreadingTCPServer from SocketServer import StreamRequestHandler, ThreadingTCPServer
@ -11,6 +9,9 @@ from struct import pack, unpack
import threading import threading
import sys import sys
def debug(s):
print >>sys.stderr, 'socks.py: ', s
class MyTCPServer(ThreadingTCPServer): class MyTCPServer(ThreadingTCPServer):
allow_reuse_address = True allow_reuse_address = True
@ -19,8 +20,6 @@ class MyTCPServer(ThreadingTCPServer):
CLOSE = object() CLOSE = object()
logging.basicConfig(stream=sys.stderr, level=logging.INFO)
VERSION = '\x05' VERSION = '\x05'
NOAUTH = '\x00' NOAUTH = '\x00'
USERPASS = '\x02' USERPASS = '\x02'
@ -55,7 +54,7 @@ def forward(source, dest, name):
data = recv(source, 4000) data = recv(source, 4000)
if data == CLOSE: if data == CLOSE:
send(dest, CLOSE) send(dest, CLOSE)
info('%s hung up' % name) debug('%s hung up' % name)
return return
debug('Sending (%d) %r' % (len(data), data)) debug('Sending (%d) %r' % (len(data), data))
send(dest, data) send(dest, data)
@ -83,7 +82,7 @@ class SocksHandler(StreamRequestHandler):
def handle(self): def handle(self):
# IMRPOVEMENT: Report who requests are from in logging # IMRPOVEMENT: Report who requests are from in logging
# IMPROVEMENT: Timeout on client # IMPROVEMENT: Timeout on client
info('Connection - authenticating') debug('Connection - authenticating')
version = self.read(1) version = self.read(1)
if allow_v4 and version == '\x04': if allow_v4 and version == '\x04':
@ -129,7 +128,7 @@ class SocksHandler(StreamRequestHandler):
if password == None and NOAUTH in method_list: if password == None and NOAUTH in method_list:
self.send_no_auth_method() self.send_no_auth_method()
info('Authenticated (no-auth)') debug('Authenticated (no-auth)')
elif USERPASS in method_list: elif USERPASS in method_list:
self.send_user_pass_auth_method() self.send_user_pass_auth_method()
auth_version = self.read(1) auth_version = self.read(1)
@ -146,7 +145,7 @@ class SocksHandler(StreamRequestHandler):
error('Invalid username or password') error('Invalid username or password')
self.close_request() self.close_request()
return return
info('Authenticated (user/password)') debug('Authenticated (user/password)')
self.send_authenticated() self.send_authenticated()
else: else:
error('Server only supports NOAUTH and user/pass') error('Server only supports NOAUTH and user/pass')
@ -192,7 +191,12 @@ class SocksHandler(StreamRequestHandler):
print e print e
return return
debug("Creating forwarder connection to %r", out_address) debug("Creating forwarder connection to %r", out_address)
outbound_sock.connect(out_address)
try:
outbound_sock.connect(out_address)
except Exception, e:
print e
return
if address_type == IPV6: if address_type == IPV6:
self.send_reply6(outbound_sock.getsockname()) self.send_reply6(outbound_sock.getsockname())
@ -209,14 +213,14 @@ class SocksHandler(StreamRequestHandler):
def send_reply(self, (bind_addr, bind_port)): def send_reply(self, (bind_addr, bind_port)):
bind_tuple = tuple(map(int, bind_addr.split('.'))) bind_tuple = tuple(map(int, bind_addr.split('.')))
full_address = bind_tuple + (bind_port,) full_address = bind_tuple + (bind_port,)
info('Setting up forwarding port %r' % (full_address,)) debug('Setting up forwarding port %r' % (full_address,))
msg = pack('>cccc4BH', VERSION, SUCCESS, '\x00', IPV4, *full_address) msg = pack('>cccc4BH', VERSION, SUCCESS, '\x00', IPV4, *full_address)
self.wfile.write(msg) self.wfile.write(msg)
def send_reply6(self, (bind_addr, bind_port, unused1, unused2)): def send_reply6(self, (bind_addr, bind_port, unused1, unused2)):
bind_tuple = tuple(map(lambda x: int(x,16), bind_addr.split(':'))) bind_tuple = tuple(map(lambda x: int(x,16), bind_addr.split(':')))
full_address = bind_tuple + (bind_port,) full_address = bind_tuple + (bind_port,)
info('Setting up forwarding port %r' % (full_address,)) debug('Setting up forwarding port %r' % (full_address,))
msg = pack('>cccc8HH', VERSION, SUCCESS, '\x00', IPV6, *full_address) msg = pack('>cccc8HH', VERSION, SUCCESS, '\x00', IPV6, *full_address)
self.wfile.write(msg) self.wfile.write(msg)
@ -253,12 +257,12 @@ if __name__ == '__main__':
elif sys.argv[i] == '--allow-v4': elif sys.argv[i] == '--allow-v4':
allow_v4 = True allow_v4 = True
else: else:
if sys.argv[i] != '--help': info('unknown option "%s"' % sys.argv[i]) if sys.argv[i] != '--help': debug('unknown option "%s"' % sys.argv[i])
print('usage: socks.py [--username <user> --password <password>] [--port <listen-port>]') print('usage: socks.py [--username <user> --password <password>] [--port <listen-port>]')
sys.exit(1) sys.exit(1)
i += 1 i += 1
info('Listening on port %d...' % listen_port) debug('Listening on port %d...' % listen_port)
server = MyTCPServer(('localhost', listen_port), SocksHandler) server = MyTCPServer(('localhost', listen_port), SocksHandler)
server.timeout = 120 server.timeout = 120
while True: while True: