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实现建立SSH连接的方法
Jun 03 Python
Django自定义插件实现网站登录验证码功能
Apr 19 Python
Python3计算三角形的面积代码
Dec 18 Python
python3使用scrapy生成csv文件代码示例
Dec 28 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
在Python中使用turtle绘制多个同心圆示例
Nov 23 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
Jan 20 Python
使用 pytorch 创建神经网络拟合sin函数的实现
Feb 24 Python
python MultipartEncoder传输zip文件实例
Apr 07 Python
Python基于requests实现模拟上传文件
Apr 21 Python
python+requests实现接口测试的完整步骤
Oct 27 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
初步介绍PHP扩展开发经验分享
2012/09/06 PHP
Yii隐藏URL中index.php的方法
2016/07/12 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
js检测用户输入密码强度
2015/10/22 Javascript
关于JS 预解释的相关理解
2016/06/28 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
vue-cli脚手架的安装教程图解
2018/09/02 Javascript
ant-design-vue中的select选择器,对输入值的进行筛选操作
2020/10/24 Javascript
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python实现发送和获取手机短信验证码
2016/01/15 Python
Python的Flask框架及Nginx实现静态文件访问限制功能
2016/06/27 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
使用python3构建文件传输的方法
2019/02/13 Python
python实现大学人员管理系统
2019/10/25 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
python with (as)语句实例详解
2020/02/04 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
详解Python 中的 defaultdict 数据类型
2021/02/22 Python
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
高三自我鉴定怎么写
2013/10/19 职场文书
公司行政专员岗位职责
2014/08/24 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
学生自我评语
2015/01/04 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python