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获取linux主机ip的简单实现方法
Apr 18 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
Python 多线程Threading初学教程
Aug 22 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
Python实现京东秒杀功能代码
May 16 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
python线程join方法原理解析
Feb 11 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
Mar 23 Python
django rest framework serializers序列化实例
May 13 Python
Python 如何实现访问者模式
Jul 28 Python
django中cookiecutter的使用教程
Dec 03 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 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下对字符串的递增运算代码
2010/08/21 PHP
Laravel模板引擎Blade中section的一些标签的区别介绍
2015/02/10 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
jquery入门—选择器实现隔行变色实例代码
2013/01/04 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
js简单实现用户注册信息的校验代码
2013/11/15 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
2014/11/06 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
微信小程序通过api接口将json数据展现到小程序示例
2017/01/20 Javascript
详解webpack+es6+angular1.x项目构建
2017/05/02 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
2017/12/08 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
解决layui批量传值到后台操作时出现传值为空的问题
2019/09/28 Javascript
js实现div色块碰撞
2020/01/16 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
VUE中setTimeout和setInterval自动销毁案例
2020/09/07 Javascript
Python运算符重载用法实例分析
2015/06/01 Python
浅析Python中的for 循环
2016/06/09 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
印尼购物网站:iLOTTE
2019/10/16 全球购物
六一儿童节主持词
2014/03/21 职场文书
房产委托公证书样本
2014/04/04 职场文书
党员目标管理责任书
2014/07/25 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
药店采购员岗位职责
2014/09/30 职场文书
银行授权委托书范本
2014/10/04 职场文书
上课说话检讨书500字
2014/11/01 职场文书
团结主题班会
2015/08/13 职场文书
Python竟然能剪辑视频
2021/05/25 Python
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL
MySQL中datetime时间字段的四舍五入操作
2021/10/05 MySQL