python实现端口转发器的方法


Posted in Python onMarch 13, 2015

本文实例讲述了python实现端口转发器的方法。分享给大家供大家参考。具体如下:

下面的python代码实现端口转发器,支持udp端口转发

由于工作需要用到一个端口转发器,并且要求支持TCP和UDP协议。在网上找了蛮久,但没有中意的。于是就自己写了一个。这个转发器是基于python cookbook的一个示例改写的,原先的这个示例只支持TCP协议,我这里增加了UDP协议的支持,程序写的不怎么好,不过它确实能用!

portmap.py代码如下:

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

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python的Django框架中的表单处理示例
Jul 17 Python
python开发中range()函数用法实例分析
Nov 12 Python
Python heapq使用详解及实例代码
Jan 25 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
解决Shell执行python文件,传参空格引起的问题
Oct 30 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
flask框架单元测试原理与用法实例分析
Jul 23 Python
pytorch 实现在预训练模型的 input上增减通道
Jan 06 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
Apr 01 Python
初学者学习Python好还是Java好
May 26 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
python中lower函数实现方法及用法讲解
Dec 23 Python
python实现超简单端口转发的方法
Mar 13 #Python
python简单程序读取串口信息的方法
Mar 13 #Python
python通过BF算法实现关键词匹配的方法
Mar 13 #Python
python通过装饰器检查函数参数数据类型的方法
Mar 13 #Python
python实现简单温度转换的方法
Mar 13 #Python
python实现简单socket程序在两台电脑之间传输消息的方法
Mar 13 #Python
Python比较两个图片相似度的方法
Mar 13 #Python
You might like
url decode problem 解决方法
2011/12/26 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
PHP数组去重比较快的实现方式
2016/01/19 PHP
javascript与cookie 的问题详解
2013/11/11 Javascript
JQuery文字列表向上滚动的代码
2013/11/13 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
setinterval()与clearInterval()JS函数的调用方法
2015/01/21 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
使用JavaScript实现连续滚动字幕效果的方法
2015/07/07 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
AngularJs基本特性解析(一)
2016/07/21 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
React组件中的this的具体使用
2018/02/28 Javascript
vue项目中jsonp跨域获取qq音乐首页推荐问题
2018/05/30 Javascript
微信小程序与公众号实现数据互通的方法
2019/07/25 Javascript
linux 下以二进制的方式安装 nodejs
2020/02/12 NodeJs
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
Python中bisect的使用方法
2019/12/31 Python
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
锐步英国官网:Reebok英国
2019/11/29 全球购物
自我评价的正确写法
2013/09/19 职场文书
公司成本主管岗位责任制
2014/02/21 职场文书
2015年三八妇女节活动总结
2015/02/06 职场文书
求职简历自我评价怎么写
2015/03/10 职场文书
2015年团支书工作总结
2015/04/03 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
浅谈Java父子类加载顺序
2021/08/04 Java/Android