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正则分组的应用
Nov 10 Python
Python读取图片属性信息的实现方法
Sep 11 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
详解Python3注释知识点
Feb 19 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
python实现opencv+scoket网络实时图传
Mar 20 Python
Python多线程Threading、子线程与守护线程实例详解
Mar 24 Python
Python3爬虫里关于Splash负载均衡配置详解
Jul 10 Python
详解python中的lambda与sorted函数
Sep 04 Python
python实现简单遗传算法
Sep 18 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 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数字格式化
2006/12/06 PHP
php调用Google translate_tts api实现代码
2013/08/07 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
js实时监听文本框状态的方法
2011/04/26 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
Bootstrap基础学习
2015/06/16 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
jQuery实现的表格展开伸缩效果实例
2016/09/07 Javascript
移动端点击态处理的三种实现方式
2017/01/12 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
VUE中v-model和v-for指令详解
2017/06/23 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
Django获取应用下的所有models的例子
2019/08/30 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
在keras中实现查看其训练loss值
2020/06/16 Python
使用Nibabel库对nii格式图像的读写操作
2020/07/01 Python
教师实习自我鉴定
2013/12/11 职场文书
竞选班委演讲稿
2014/04/28 职场文书
火锅店的活动方案
2014/08/15 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
动视暴雪取消疫苗禁令 让所有员工返回线下工作
2022/04/03 其他游戏