博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
知道创宇的一个rtcp分析,加上外面找到的一个tcp udp端口转发的
阅读量:3726 次
发布时间:2019-05-22

本文共 4736 字,大约阅读时间需要 15 分钟。

1. 在B服务器上运行:
lcx l:10001 l:10002
表示在本地监听了10001与10002两个端口,这样,这两个端口就可以互相传输数据了。
2. 在A服务器上运行:
./rtcp.py c:localhost:22 c:222.2.2.2:10001
表示连接本地的22端口与B服务器的10001端口,这两个端口也可以互相传输数据了。
3. 然后我们就可以这样来访问A服务器的22端口了:
ssh 222.2.2.2 -p 10002
s = targv[i]  # stream描述 c:ip:port 或 l:port
sl = s.split(':')
t = threading.Thread(target=_connect, args=(sl[1], int(sl[2]), i))
num=0
sl[1] = localhost
sl[2] = 22
num=1
sl[1] = 222.2.2.2
sl[2] = 10001
num -> 0先进入connect
连接ssh
streams[0] = conn
_get_another_stream,获取另外一端的数据;如果没有就等待. return streams[1]
.....
num -> 1 connect
streams[1] = conn
streams[1]有内容了到streams[0]操作了
......
_xstream(num, conn{这个就是连接ssh}, s2):
    连接到的ssh转发到streams[1]去.
......
_get_another_stream
_xstream
_connect
main-thread
#-* -coding: UTF-8 -* -
'''
Created on 2012-5-8
@author: qh
'''
import time,socket,threading
def log(strLog):
    strs=time.strftime("%Y-%m-%d %H:%M:%S")
    print strs+"->"+strLog
class pipethread(threading.Thread):
    '''
    classdocs
    '''
    def __init__(self,source,sink):
        '''
        Constructor
        '''
        threading.Thread.__init__(self)
        self.source=source
        self.sink=sink
        log("New Pipe create:%s->%s" % (self.source.getpeername(),self.sink.getpeername()))
    def run(self):
        while True:
            try:
                data=self.source.recv(1024)
                if not data: break
                self.sink.send(data)
            except Exception ,ex:
                log("redirect error:"+str(ex))
                break
        self.source.close()
        self.sink.close()
class portmap(threading.Thread):
    def __init__(self,port,newhost,newport,local_ip=''):
        threading.Thread.__init__(self)
        self.newhost=newhost
        self.newport=newport
        self.port=port
        self.local_ip=local_ip
        self.sock=None
        self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.sock.bind((self.local_ip,port))
        self.sock.listen(5)
        log("start listen protocol:%s,port:%d " % ('tcp',port))
    def run(self):
        while True:
            fwd=None
            newsock=None
            newsock,address=self.sock.accept()
            log("new connection->protocol:%s,local port:%d,remote address:%s" % ('tcp',self.port,address[0]))
            fwd=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            try:
                fwd.connect((self.newhost,self.newport))
            except Exception ,ex:
                log("connet newhost error:"+str(ex))
                break
            p1=pipethread(newsock,fwd,self.protocol)
            p1.start()
            p2=pipethread(fwd,newsock,self.protocol)
            p2.start()
class pipethreadUDP(threading.Thread):
    def __init__(self,connection,connectionTable,table_lock):
        threading.Thread.__init__(self)
        self.connection=connection
        self.connectionTable=connectionTable
        self.table_lock=table_lock
        log('new thread for new connction')
    def run(self):
        while True:
            try:
                data,addr=self.connection['socket'].recvfrom(4096)
                #log('recv from addr"%s' % str(addr))
            except Exception ,ex:
                log("recvfrom error:"+str(ex))
                break
            try:
                self.connection['lock'].acquire()
                self.connection['Serversocket'].sendto(data,self.connection['address'])
                #log('sendto address:%s' % str(self.connection['address']))
            except Exception ,ex:
                log("sendto error:"+str(ex))
                break
            finally:self.connection['lock'].release()
            self.connection['time']=time.time()
        self.connection['socket'].close()
        log("thread exit for: %s" % str(self.connection['address']))
        self.table_lock.acquire()
        self.connectionTable.pop(self.connection['address'])
        self.table_lock.release()
        log('Release udp connection for timeout:%s' % str(self.connection['address']))
class portmapUDP(threading.Thread):
    def __init__(self,port,newhost,newport,local_ip=''):
        threading.Thread.__init__(self)
        self.newhost=newhost
        self.newport=newport
        self.port=port
        self.local_ip=local_ip
        self.sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
        self.sock.bind((self.local_ip,port))
        self.connetcTable={}
        self.port_lock=threading.Lock()
        self.table_lock=threading.Lock()
        self.timeout=300
        #ScanUDP(self.connetcTable,self.table_lock).start()
        log('udp port redirect run->local_ip:%s,local_port:%d,remote_ip:%s,remote_port:%d' % (local_ip,port,newhost,newport))
    def run(self):
        while True:
            data,addr=self.sock.recvfrom(4096)
            connection=None
            newsock=None
            self.table_lock.acquire()
            connection=self.connetcTable.get(addr)
            newconn=False
            if connection is None:
                connection={}
                connection['address']=addr
                newsock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
                newsock.settimeout(self.timeout)
                connection['socket']=newsock
                connection['lock']=self.port_lock
                connection['Serversocket']=self.sock
                connection['time']=time.time()
                newconn=True
                log('new connection:%s' % str(addr))
            self.table_lock.release()
            try:
                connection['socket'].sendto(data,(self.newhost,self.newport))
            except Exception ,ex:
                log("sendto error:"+str(ex))
                #break
            if newconn:
                self.connetcTable[addr]=connection
                t1=pipethreadUDP(connection,self.connetcTable,self.table_lock)
                t1.start()
        log('main thread exit')
        for key in self.connetcTable.keys():
            self.connetcTable[key]['socket'].close()
if __name__=='__main__':
    myp=portmapUDP(10061,'10.0.1.29',161)
    myp.start()
    #myp.__stop()

转载地址:http://gnmnn.baihongyu.com/

你可能感兴趣的文章
Maven高级(配套入门教程)
查看>>
IDEA创建Maven工程(配图,超详细)
查看>>
Maven工程SSM的pom.xml文件内容(不要再浪费时间写依赖了)
查看>>
Maven工程运行本地的Tomcat
查看>>
一个简单的SSM整合教程目录,手把手教你(主要是简单的功能实现,适合初学者)
查看>>
SVN教程——01SVN介绍及下载基本使用
查看>>
SVN教程——02TortoiseSVN的使用
查看>>
SVN教程——03多人操作文件冲突解决
查看>>
SVN教程——04使用IDEA工具操作SVN
查看>>
SVN教程——05SVN规范
查看>>
SVN合并出现be ancestrally related to错误与解决方案
查看>>
LeedCode第60题——第K个排列(100%效率,看了绝不后悔的好文)
查看>>
Leedcode第62题——不同路径(100%击败率,动态规划解法)
查看>>
Leedcode第65题——有效数字(史上最详细的解决方案,每一步给您讲的细致入微)
查看>>
优先队列详解,你还不懂优先队列?
查看>>
Oracle使用教程——03Oracle的初步语法使用
查看>>
Oracle使用教程——04Oracle语法系统讲解
查看>>
Leedcode71——简化路径(栈解决)
查看>>
Oracle使用教程——05Oracle图形化界面的使用
查看>>
SpringSecurity入门使用(手把手创建项目带你入门)
查看>>