[Python] python实现的端口转发器 →→→→→进入此内容的聊天室

来自 , 2020-10-22, 写在 Python, 查看 103 次.
URL http://www.code666.cn/view/36165c62
  1. #-* -coding: UTF-8 -* -
  2. '''
  3. Created on 2012-5-8
  4. @author: qh
  5. '''
  6. import time,socket,threading
  7. def log(strLog):
  8.     strs=time.strftime("%Y-%m-%d %H:%M:%S")
  9.     print strs+"->"+strLog
  10. class pipethread(threading.Thread):
  11.     '''
  12.    classdocs
  13.    '''
  14.  
  15.     def __init__(self,source,sink):
  16.         '''
  17.        Constructor
  18.        '''
  19.         threading.Thread.__init__(self)
  20.         self.source=source
  21.         self.sink=sink
  22.         log("New Pipe create:%s->%s" % (self.source.getpeername(),self.sink.getpeername()))
  23.     def run(self):
  24.         while True:
  25.             try:
  26.                 data=self.source.recv(1024)
  27.                 if not data: break
  28.                 self.sink.send(data)
  29.             except Exception ,ex:
  30.                 log("redirect error:"+str(ex))
  31.                 break
  32.         self.source.close()
  33.         self.sink.close()
  34. class portmap(threading.Thread):
  35.     def __init__(self,port,newhost,newport,local_ip=''):
  36.         threading.Thread.__init__(self)
  37.         self.newhost=newhost
  38.         self.newport=newport
  39.         self.port=port
  40.         self.local_ip=local_ip
  41.         self.sock=None
  42.         self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  43.         self.sock.bind((self.local_ip,port))
  44.         self.sock.listen(5)
  45.         log("start listen protocol:%s,port:%d " % ('tcp',port))
  46.     def run(self):
  47.         while True:
  48.             fwd=None
  49.             newsock=None
  50.             newsock,address=self.sock.accept()
  51.             log("new connection->protocol:%s,local port:%d,remote address:%s" % ('tcp',self.port,address[0]))
  52.             fwd=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  53.             try:
  54.                 fwd.connect((self.newhost,self.newport))
  55.             except Exception ,ex:
  56.                 log("connet newhost error:"+str(ex))
  57.                 break
  58.             p1=pipethread(newsock,fwd,self.protocol)
  59.             p1.start()
  60.             p2=pipethread(fwd,newsock,self.protocol)
  61.             p2.start()
  62. class pipethreadUDP(threading.Thread):
  63.     def __init__(self,connection,connectionTable,table_lock):
  64.         threading.Thread.__init__(self)
  65.         self.connection=connection
  66.         self.connectionTable=connectionTable
  67.         self.table_lock=table_lock
  68.         log('new thread for new connction')
  69.     def run(self):
  70.         while True:
  71.             try:
  72.                 data,addr=self.connection['socket'].recvfrom(4096)
  73.                 #log('recv from addr"%s' % str(addr))
  74.             except Exception ,ex:
  75.                 log("recvfrom error:"+str(ex))
  76.                 break
  77.             try:
  78.                 self.connection['lock'].acquire()
  79.                 self.connection['Serversocket'].sendto(data,self.connection['address'])
  80.                 #log('sendto address:%s' % str(self.connection['address']))
  81.             except Exception ,ex:
  82.                 log("sendto error:"+str(ex))
  83.                 break
  84.             finally:self.connection['lock'].release()
  85.             self.connection['time']=time.time()
  86.         self.connection['socket'].close()
  87.         log("thread exit for: %s" % str(self.connection['address']))
  88.         self.table_lock.acquire()
  89.         self.connectionTable.pop(self.connection['address'])
  90.         self.table_lock.release()
  91.         log('Release udp connection for timeout:%s' % str(self.connection['address']))
  92. class portmapUDP(threading.Thread):
  93.     def __init__(self,port,newhost,newport,local_ip=''):
  94.         threading.Thread.__init__(self)
  95.         self.newhost=newhost
  96.         self.newport=newport
  97.         self.port=port
  98.         self.local_ip=local_ip
  99.         self.sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  100.         self.sock.bind((self.local_ip,port))
  101.         self.connetcTable={}
  102.         self.port_lock=threading.Lock()
  103.         self.table_lock=threading.Lock()
  104.         self.timeout=300
  105.         #ScanUDP(self.connetcTable,self.table_lock).start()
  106.         log('udp port redirect run->local_ip:%s,local_port:%d,remote_ip:%s,remote_port:%d' % (local_ip,port,newhost,newport))
  107.     def run(self):
  108.         while True:
  109.             data,addr=self.sock.recvfrom(4096)
  110.             connection=None
  111.             newsock=None
  112.             self.table_lock.acquire()
  113.             connection=self.connetcTable.get(addr)
  114.             newconn=False
  115.             if connection is None:
  116.                 connection={}
  117.                 connection['address']=addr
  118.                 newsock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  119.                 newsock.settimeout(self.timeout)
  120.                 connection['socket']=newsock
  121.                 connection['lock']=self.port_lock
  122.                 connection['Serversocket']=self.sock
  123.                 connection['time']=time.time()
  124.                 newconn=True
  125.                 log('new connection:%s' % str(addr))
  126.             self.table_lock.release()
  127.             try:
  128.                 connection['socket'].sendto(data,(self.newhost,self.newport))
  129.             except Exception ,ex:
  130.                 log("sendto error:"+str(ex))
  131.                 #break
  132.             if newconn:
  133.                 self.connetcTable[addr]=connection
  134.                 t1=pipethreadUDP(connection,self.connetcTable,self.table_lock)
  135.                 t1.start()
  136.         log('main thread exit')
  137.         for key in self.connetcTable.keys():
  138.             self.connetcTable[key]['socket'].close()
  139. if __name__=='__main__':
  140.     myp=portmapUDP(10061,'10.0.1.29',161)
  141.     myp.start()
  142.     #myp.__stop()
  143. #//python/8936

回复 "python实现的端口转发器"

这儿你可以回复上面这条便签

captcha