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 13 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
python如何爬取个性签名
Jun 19 Python
python opencv人脸检测提取及保存方法
Aug 03 Python
python正则爬取某段子网站前20页段子(request库)过程解析
Aug 10 Python
Flask之pipenv虚拟环境的实现
Nov 26 Python
python3爬取torrent种子链接实例
Jan 16 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
python如何将图片转换素描画
Sep 08 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
python 多线程爬取壁纸网站的示例
Feb 20 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+oracle 分页类
2006/10/09 PHP
php根据日期判断星座的函数分享
2014/02/13 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
PHP copy函数使用案例代码解析
2020/09/01 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
7个JS基础知识总结
2014/03/05 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
vue自定义指令实现v-tap插件
2016/11/03 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
vue脚手架搭建项目的兼容性配置详解
2018/07/17 Javascript
vue debug 二种方法
2018/09/16 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
[05:59]带你看看DPC的台前幕后
2021/03/11 DOTA
python使用pil生成图片验证码的方法
2015/05/08 Python
PyQt5每天必学之单行文本框
2018/04/19 Python
详解【python】str与json类型转换
2019/04/29 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
Python利用matplotlib绘制散点图的新手教程
2020/11/05 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
2020/12/21 Python
HTML5 常见面试题之PC端和移动端区别介绍
2018/01/22 HTML / CSS
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
中专自我鉴定范文
2013/10/16 职场文书
路政管理专业推荐信
2013/11/11 职场文书
班主任工作经验材料
2014/02/02 职场文书
大学生应聘求职信
2014/05/26 职场文书
观看建国大业观后感
2015/06/01 职场文书
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js