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 10 Python
python监控网站运行异常并发送邮件的方法
Mar 13 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
numpy matrix和array的乘和加实例
Jun 28 Python
Python把对应格式的csv文件转换成字典类型存储脚本的方法
Feb 12 Python
详解python实现交叉验证法与留出法
Jul 11 Python
Python 项目转化为so文件实例
Dec 23 Python
详解Python 重学requests发起请求的基本方式
Feb 07 Python
利用python绘制数据曲线图的实现
Apr 09 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
Pycharm安装python库的方法
Nov 24 Python
python基于opencv 实现图像时钟
Jan 04 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
《星际争霸》各版本雷兽特点图文解析 雷兽不同形态一览
2020/03/02 星际争霸
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
文本框的字数限制功能jquery插件
2009/11/24 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
jquery next nextAll nextUntil siblings的区别介绍
2013/10/05 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
vue下跨域设置的相关介绍
2017/08/26 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
从零学Python之入门(四)运算
2014/05/27 Python
讲解Python中运算符使用时的优先级
2015/05/14 Python
剖析Python的Twisted框架的核心特性
2016/05/25 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
某公司C#程序员面试题笔试题
2014/05/26 面试题
大学生求职简历的自我评价范文
2013/10/12 职场文书
秘书岗位职责
2013/11/18 职场文书
学习演讲稿范文
2014/05/10 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
个人总结怎么写
2015/02/26 职场文书
python - timeit 时间模块
2021/04/06 Python
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
通过Qt连接OpenGauss数据库的详细教程
2021/06/23 PostgreSQL
MySQL系列之六 用户与授权
2021/07/02 MySQL
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript