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在不同层级目录import模块的方法
Jan 31 Python
Django Admin实现上传图片校验功能
Mar 06 Python
Python yield 使用方法浅析
May 20 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
Jan 02 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
Python3并发写文件与Python对比
Nov 20 Python
详解python中各种文件打开模式
Jan 19 Python
python求一个字符串的所有排列的实现方法
Feb 04 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
python跨文件使用全局变量的实现
Nov 17 Python
基于Python实现射击小游戏的制作
Apr 06 Python
使用Python拟合函数曲线
Apr 14 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
PHP无限分类的类
2007/01/02 PHP
php中动态变量用法实例
2015/06/10 PHP
php实现头像上传预览功能
2017/04/27 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
jQuery Pagination Ajax分页插件(分页切换时无刷新与延迟)中文翻译版
2013/01/11 Javascript
js通过八个点 拖动改变div大小的实现方法
2014/03/05 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
python之import机制详解
2014/07/03 Python
浅谈Python中数据解析
2015/05/05 Python
Python自动调用IE打开某个网站的方法
2015/06/03 Python
详解Python中的静态方法与类成员方法
2017/02/28 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Python解析json时提示“string indices must be integers”问题解决方法
2019/07/31 Python
PyTorch预训练的实现
2019/09/18 Python
flask实现验证码并验证功能
2019/12/05 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
Myholidays美国:在线旅游网站
2019/08/16 全球购物
四年级评语大全
2014/04/21 职场文书
护士工作失误检讨书
2014/09/14 职场文书
教师先进事迹材料
2014/12/16 职场文书
投资意向协议书
2015/01/29 职场文书
建议书范文
2015/02/05 职场文书
吧主申请感言怎么写
2015/08/03 职场文书
Django显示可视化图表的实践
2021/05/10 Python
基于Python实现射击小游戏的制作
2022/04/06 Python