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中is与==判断的区别
Mar 28 Python
django定期执行任务(实例讲解)
Nov 03 Python
tensorflow: variable的值与variable.read_value()的值区别详解
Jul 30 Python
Python编写合并字典并实现敏感目录的小脚本
Feb 26 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
Django基础三之视图函数的使用方法
Jul 18 Python
windows下Pycharm安装opencv的多种方法
Mar 05 Python
TensorFlow2.1.0最新版本安装详细教程
Apr 08 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
BeautifulSoup中find和find_all的使用详解
Dec 07 Python
Python创建简单的神经网络实例讲解
Jan 04 Python
python实现简易名片管理系统
Apr 11 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
人族 Terran 魔法与科技
2020/03/14 星际争霸
在普通HTTP上安全地传输密码
2007/07/21 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
PHP实现的简单缓存类
2015/07/29 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
Jquery 弹出层插件实现代码
2009/10/24 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
JS简单获取客户端IP地址的方法【调用搜狐接口】
2016/09/05 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
[01:04:30]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
Python  连接字符串(join %)
2008/09/06 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
深入浅析Python代码规范性检测
2020/07/31 Python
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
香蕉共和国加拿大官网:Banana Republic加拿大
2018/08/06 全球购物
新西兰Bookabach:查找全球度假屋
2020/12/03 全球购物
新员工试用期自我鉴定
2014/04/17 职场文书
企业活动策划方案
2014/06/02 职场文书
销售人员工作自我评价
2014/09/21 职场文书
告诉你一个秘密:富人致富的五大优点
2019/07/11 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
python 爬取吉首大学网站成绩单
2021/06/02 Python