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斗牛游戏的概率
Feb 12 Python
Python多线程、异步+多进程爬虫实现代码
Feb 17 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
python实现贪吃蛇小游戏
Mar 21 Python
python多线程扫描端口(线程池)
Sep 04 Python
Python FFT合成波形的实例
Dec 04 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
Mar 09 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 Python
Python 批量下载阴阳师网站壁纸
May 19 Python
利用For循环遍历Python字典的三种方法实例
Mar 25 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/10/09 PHP
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
简单实用的PHP防注入类实例
2014/12/05 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
2016/07/07 PHP
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
python 自动去除空行的实例
2018/07/24 Python
python 提取tuple类型值中json格式的key值方法
2018/12/31 Python
Python和Go语言的区别总结
2019/02/20 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
python压包的概念及实例详解
2021/02/17 Python
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
枚举与#define宏的区别
2014/04/30 面试题
外国人聘用意向书
2014/04/01 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
公务员检讨书
2014/11/01 职场文书
团代会开幕词
2015/01/28 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
村官个人总结范文
2015/03/03 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
预防艾滋病宣传活动总结
2015/05/09 职场文书
毕业证明模板
2015/06/19 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL