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可跨平台实现获取按键的方法
Mar 05 Python
python中base64加密解密方法实例分析
May 16 Python
Python中类型检查的详细介绍
Feb 13 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
Nov 23 Python
Pandas标记删除重复记录的方法
Apr 08 Python
django DRF图片路径问题的解决方法
Sep 10 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
深入了解python中元类的相关知识
Aug 29 Python
Python写出新冠状病毒确诊人数地图的方法
Feb 12 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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
咖啡常见的种类
2021/03/03 新手入门
咖啡豆要不要放冰箱的原因
2021/03/04 冲泡冲煮
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
一个PHP+MSSQL分页的例子
2006/10/09 PHP
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
2016/08/01 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
详解Vue2.x-directive的学习笔记
2017/07/17 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
Vue中的混入的使用(vue mixins)
2018/06/01 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
python执行get提交的方法
2015/04/29 Python
python通过ftplib登录到ftp服务器的方法
2015/05/08 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
python 切换root 执行命令的方法
2019/01/19 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
猫咪家具:CatsPlay
2018/11/03 全球购物
主键(Primary Key)约束和唯一性(UNIQUE)约束的区别
2013/05/29 面试题
财务主管岗位职责
2014/02/28 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
资产移交协议书
2016/03/24 职场文书
Python入门学习之类的相关知识总结
2021/05/25 Python
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
Python图片验证码降噪和8邻域降噪
2021/08/30 Python