Python写的Socks5协议代理服务器
直接上代码:
#!/usr/bin/python
#Filenames5.py
#PythonDynamicSocks5Proxy
#Usage:pythons5.py1080
#BackgroundRun:nohuppythons5.py1080&
importsocket,sys,select,SocketServer,struct,time
classThreadingTCPServer(SocketServer.ThreadingMixIn,SocketServer.TCPServer):pass
classSocks5Server(SocketServer.StreamRequestHandler):
defhandle_tcp(self,sock,remote):
fdset=[sock,remote]
whileTrue:
r,w,e=select.select(fdset,[],[])
ifsockinr:
ifremote.send(sock.recv(4096))<=0:break
ifremoteinr:
ifsock.send(remote.recv(4096))<=0:break
defhandle(self):
try:
pass#print'from',self.client_addressnothingtodo.
sock=self.connection
#1.Version
sock.recv(262)
sock.send("\x05\x00");
#2.Request
data=self.rfile.read(4)
mode=ord(data[1])
addrtype=ord(data[3])
ifaddrtype==1:#IPv4
addr=socket.inet_ntoa(self.rfile.read(4))
elifaddrtype==3:#Domainname
addr=self.rfile.read(ord(sock.recv(1)[0]))
port=struct.unpack('>H',self.rfile.read(2))
reply="\x05\x00\x00\x01"
try:
ifmode==1:#1.Tcpconnect
remote=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
remote.connect((addr,port[0]))
pass#print'To',addr,port[0]nothingdoto.
else:
reply="\x05\x07\x00\x01"#Commandnotsupported
local=remote.getsockname()
reply+=socket.inet_aton(local[0])+struct.pack(">H",local[1])
exceptsocket.error:
#Connectionrefused
reply='\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00'
sock.send(reply)
#3.Transfering
ifreply[1]=='\x00':#Success
ifmode==1:#1.Tcpconnect
self.handle_tcp(sock,remote)
exceptsocket.error:
pass#print'error'nothingtodo.
exceptIndexError:
pass
defmain():
filename=sys.argv[0];
iflen(sys.argv)<2:
print'usage:'+filename+'port'
sys.exit()
socks_port=int(sys.argv[1]);
server=ThreadingTCPServer(('',socks_port),Socks5Server)
print'bindport:%d'%socks_port+'ok!'
server.serve_forever()
if__name__=='__main__':
main()