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()