python实现端口转发器的方法

本文实例讲述了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程序设计有所帮助。

(0)

相关推荐

  • Python的Asyncore异步Socket模块及实现端口转发的例子

    Asyncore模块提供了以异步的方式写入套接字服务客户端和服务器的基础结构. 只有两种方式使一个程序在单处理器上实现"同时做不止一件事".多线程编程是最简单和最流行的方式,但是有另一种很不一样的技术,可以使得我们保持多线程的几乎所有优势,却不用真正使用多线程. 如果你的程序主要是受I/O限制的,这是唯一可行的方式.如果你的程序是受处理器限制的,则先发制人的调度线程可能是你真正需要的.但是,很少网络服务器是受处理器限制的. 如果您的操作系统支持在其I / O库的 select() 系统

  • python实现超简单端口转发的方法

    本文实例讲述了python实现超简单端口转发的方法.分享给大家供大家参考.具体如下: 代码非常简单,实现了简单的端口数据转发功能,用于真实环境还需要再修改一下. 复制代码 代码如下: #tcp server import socket host = '127.0.0.1'          #Local Server IP host2 = '127.0.0.1'   #Real Server IP port = 6001 #Local Server Port port2 = 7001 #Real

  • Python实现网络端口转发和重定向的方法

    本文实例讲述了Python实现网络端口转发和重定向的方法.分享给大家供大家参考,具体如下: [任务] 需要将某个网络端口转发到另一个主机(forwarding),但可能会是不同的端口(redirecting). [解决方案] 两个使用threading和socket模块的类就能完成我们需要的端口转发和重定向. #encoding=utf8 #author: walker摘自<Python Cookbook(2rd)> #date: 2015-06-11 #function: 网络端口的转发和重

  • python实现socket端口重定向示例

    可以很轻松的在端口12345开启共享,效果如下: 要实现我想要的功能,只需要将端口重定向就行了,代码如下: 复制代码 代码如下: #! /usr/bin/python'''      File      : redirect.py      Author    : Mike''' import socket,osbufLen = 4*1024 sock1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  sock1.bind(('192.1

  • python套接字流重定向实例汇总

    将套接字流重定向到标准输入或输出流 #!/usr/bin/env python3 """ 测试socket-stream 重定向模式 """ import sys,os,time from multiprocessing import Process from socket import * def initListenerSocket(port=50008,host=''): """ 初始化在服务器模式下调用者用于

  • Python实现TCP/IP协议下的端口转发及重定向示例

    首先,我们用webpy写一个简单的网站,监听8080端口,返回"Hello, EverET.org"的页面. 然后我们使用我们的forwarding.py,在80端口和8080端口中间建立两条通信管道用于双向通信. 此时,我们通过80端口访问我们的服务器. 浏览器得到: 然后,我们在forwarding.py的输出结果中可以看到浏览器和webpy之间的通信内容. 代码: #!/usr/bin/env python import sys, socket, time, threading

  • 详解python的几种标准输出重定向方式

    一. 背景 在Python中,文件对象sys.stdin.sys.stdout和sys.stderr分别对应解释器的标准输入.标准输出和标准出错流.在程序启动时,这些对象的初值由sys.__stdin__.sys.__stdout__和sys.__stderr__保存,以便用于收尾(finalization)时恢复标准流对象. Windows系统中IDLE(Python GUI)由pythonw.exe,该GUI没有控制台.因此,IDLE将标准输出句柄替换为特殊的PseudoOutputFile

  • python实现端口转发器的方法

    本文实例讲述了python实现端口转发器的方法.分享给大家供大家参考.具体如下: 下面的python代码实现端口转发器,支持udp端口转发 由于工作需要用到一个端口转发器,并且要求支持TCP和UDP协议.在网上找了蛮久,但没有中意的.于是就自己写了一个.这个转发器是基于python cookbook的一个示例改写的,原先的这个示例只支持TCP协议,我这里增加了UDP协议的支持,程序写的不怎么好,不过它确实能用! portmap.py代码如下: 复制代码 代码如下: #-* -coding: UT

  • Python实现端口检测的方法

    一.背景: 在平时工作中有遇到端口检测,查看服务端特定端口是否对外开放,常用nmap,tcping,telnet等,同时也可以利用站长工具等web扫描端口等. 但是在使用站长工具发现: 每次只能输入一个检测的地址: 虽然可以输入多个端口,但是不能指定一个端口范围来进行批量检测: 没有批量任务记录日志等: 因避免由于局域网检测发起端网络限制而导致的端口检测异常,未使用python-nmap 想通过调用站长工具,实现 单次可多个地址或域名检测 单词可指定端口范围,批量检测 记录日志 二.代码: 2.

  • python通过邮件服务器端口发送邮件的方法

    本文实例讲述了python通过邮件服务器端口发送邮件的方法.分享给大家供大家参考.具体实现方法如下: fromAddress = 'sender@example.com' toAddress = 'me@my.domain' msg = "Subject: Hello\n\nThis is the body of the message." import smtplib server = smtplib.SMTP("localhost", 25) server.se

  • Python根据服务获取端口号的方法

    根据服务获取端口号 首先需要下载一个psutil库 然后根据服务名找到PID 找到PID之后,通过pid获取端口号 # -*- encoding=utf8 -*- import psutil import re## 标题 import os def processinfo(x): '''根据服务名找到PID''' procs = list(psutil.process_iter()) # 获取所有服务列表 print(procs) for r in procs: aa = str(r) f =

  • 用Python编写一个高效的端口扫描器的方法

    PyPortScanner python多线程端口扫描器. 输出示例: Github 此端口扫描器的源码,文档及详细调用方法见Github PythonPortScanner by Yaokai. 背景 有时候,在进行网络相关的研究的时候,我们需要执行一些有目的的参数测量.而端口扫描就是其中比较普遍也比较重要的一项.所谓的端口扫描,就是指通过TCP握手或者别的方式来判别一个给定主机上的某些端口是否处理开放,或者说监听的状态.现有的使用比较广泛的端口扫描工具是nmap.毋庸置疑,nmap是一款非常

  • 使用python根据端口号关闭进程的方法

    我们知道,做web开发,在调试时需要反复启动整个工程,那么上一个工程占用的端口,在下一次工程启动时就不能用了,因为占用的端口没有释放,但是手动关闭方法是: lsof -i:12345 得到pid后再kill -9 pid 十分麻烦,所以能否在启动python的web工程时顺便把上一次占用的端口给关闭了呢? 当然是有的,下面以flask为例(注意,复制下面的代码时,不要直接鼠标复制,而是使用左上角的view plain来复制,因为csdn博客会把'''+str(port)+'''的右侧显示成5个单

  • 实例探究Python以并发方式编写高性能端口扫描器的方法

    关于端口扫描器 端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具.常被计算机管理员用于确认安全策略,同时被攻击者用于识别目标主机上的可运作的网络服务. 端口扫描定义是客户端向一定范围的服务器端口发送对应请求,以此确认可使用的端口.虽然其本身并不是恶意的网络活动,但也是网络攻击者探测目标主机服务,以利用该服务的已知漏洞的重要手段.端口扫描的主要用途仍然只是确认远程机器某个服务的可用性. 扫描多个主机以获取特定的某个端口被称为端口清扫(Portsweep),以此获取特

  • python杀死一个线程的方法

    最近在项目中遇到这一需求: 我需要一个函数工作,比如远程连接一个端口,远程读取文件等,但是我给的时间有限,比如,4秒钟如果你还没有读取完成或者连接成功,我就不等了,很可能对方已经宕机或者拒绝了.这样可以批量做一些事情而不需要一直等,浪费时间. 结合我的需求,我想到这种办法: 1.在主进程执行,调用一个进程执行函数,然后主进程sleep,等时间到了,就kill 执行函数的进程. 测试一个例子: import time import threading def p(i): print i class

  • python+Django+apache的配置方法详解

    本文实例讲述了python+Django+apache的配置方法.分享给大家供大家参考,具体如下: 下载安装xampp套件 下载mod_python-3.3.1.win32-py2.5-Apache2.2.exe 下载python-2.5.4.msi 下载Django 下载MySQL-python-1.2.2.win32-py2.5.exe 1.先安装Python-2.5.4.msi 2.安装 Django-1.1.1-final.tar.gz 解压开,然后解压到某个目录如:(D:/Dev) 在

随机推荐