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

本文实例讲述了Python实现网络端口转发和重定向的方法。分享给大家供大家参考,具体如下:

【任务】

需要将某个网络端口转发到另一个主机(forwarding),但可能会是不同的端口(redirecting)。

【解决方案】

两个使用threading和socket模块的类就能完成我们需要的端口转发和重定向。

#encoding=utf8
#author: walker摘自《Python Cookbook(2rd)》
#date: 2015-06-11
#function: 网络端口的转发和重定向(适用于python2/python3)
import sys, socket, time, threading
LOGGING = True
loglock = threading.Lock()
#打印日志到标准输出
def log(s, *a):
  if LOGGING:
    loglock.acquire()
    try:
      print('%s:%s' % (time.ctime(), (s % a)))
      sys.stdout.flush()
    finally:
      loglock.release()
class PipeThread(threading.Thread):
  pipes = []   #静态成员变量,存储通讯的线程编号
  pipeslock = threading.Lock()
  def __init__(self, source, sink):
    #Thread.__init__(self) #python2.2之前版本适用
    super(PipeThread, self).__init__()
    self.source = source
    self.sink = sink
    log('Creating new pipe thread %s (%s -> %s)',
        self, source.getpeername(), sink.getpeername())
    self.pipeslock.acquire()
    try:
      self.pipes.append(self)
    finally:
      self.pipeslock.release()
    self.pipeslock.acquire()
    try:
      pipes_now = len(self.pipes)
    finally:
      self.pipeslock.release()
    log('%s pipes now active', pipes_now)
  def run(self):
    while True:
      try:
        data = self.source.recv(1024)
        if not data:
          break
        self.sink.send(data)
      except:
        break
    log('%s terminating', self)
    self.pipeslock.acquire()
    try:
      self.pipes.remove(self)
    finally:
      self.pipeslock.release()
    self.pipeslock.acquire()
    try:
      pipes_left = len(self.pipes)
    finally:
      self.pipeslock.release()
    log('%s pipes still active', pipes_left)
class Pinhole(threading.Thread):
  def __init__(self, port, newhost, newport):
    #Thread.__init__(self) #python2.2之前版本适用
    super(Pinhole, self).__init__()
    log('Redirecting: localhost: %s->%s:%s', port, newhost, newport)
    self.newhost = newhost
    self.newport = newport
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.bind(('', port))
    self.sock.listen(5) #参数为timeout,单位为秒
  def run(self):
    while True:
      newsock, address = self.sock.accept()
      log('Creating new session for %s:%s', *address)
      fwd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      fwd.connect((self.newhost, self.newport))
      PipeThread(newsock, fwd).start() #正向传送
      PipeThread(fwd, newsock).start() #逆向传送
if __name__ == '__main__':
  print('Starting Pinhole port fowarder/redirector')
  try:
    port = int(sys.argv[1])
    newhost = sys.argv[2]
    try:
      newport = int(sys.argv[3])
    except IndexError:
      newport = port
  except (ValueError, IndexError):
    print('Usage: %s port newhost [newport]' % sys.argv[0])
    sys.exit(1)
  #sys.stdout = open('pinhole.log', 'w') #将日志写入文件
  Pinhole(port, newhost, newport).start()

【讨论】

当你在管理一个网络时,即使是一个很小的网络,端口转发和重定向的功能有时也能给你很大的帮助。一些不在你的控制之下的应用或者服务可能是以硬连接的方式接入到某个特定的服务器的地址或端口。通过插入转发和重定向,你就能将对应用的连接请求发送到其他更合适的主机或端口上。

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python URL操作技巧总结》、《Python Socket编程技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

(0)

相关推荐

  • 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的几种标准输出重定向方式

    一. 背景 在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实现超简单端口转发的方法.分享给大家供大家参考.具体如下: 代码非常简单,实现了简单的端口数据转发功能,用于真实环境还需要再修改一下. 复制代码 代码如下: #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实现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的Asyncore异步Socket模块及实现端口转发的例子

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

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

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

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

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

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

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

  • Mac下开启与关闭端口转发的脚本配置方法

    一.依次运行以下命令: cd /etc ls | grep pf.conf sudo cp pf.conf pf.conf.normal.bak sudo cp pf.conf pf.conf.transmit.bak ls | grep pf.conf 二.修改 pf.conf pf.conf.transmit.bak sudo gedit pf.conf.transmit.bak OR: sudo vim pf.conf.transmit.bak 修改的内容参照上一篇配置端口转发的博文,我这

  • 使用Docker安装Nginx并配置端口转发问题及解决方法

    使用docker安装并运行nginx命令: docker run --name=nginx -p 80:80 -d docker.io/nginx 使用命令: docker exec -it nginx /bin/bash 进入容器可查看到几个重要的文件 配置文件:nginx.conf 在 /etc/nginx/nginx.conf 日志文件: /var/log/nginx/access.log /var/log/nginx/error.log 使用cat命令打开nginx.conf root@

  • Windows自带的端口转发工具netsh使用方法

    下面的代码在windows下运行后可以讲172.20.53.1的14941端口转发到172.20.53.2的3389端口上 复制代码 代码如下: netsh interface ipv6 install netsh interface portproxy add v4tov4 listenaddress=172.20.53.1 listenport=14941 connectaddress=172.20.53.2 connectport=3389 如果要取消上面的端口转发,使用下面的代码 复制代

  • python基于socket进行端口转发实现后门隐藏的示例

    思想: 用户正常浏览器访问请求通过8080端口,请求若为http请求,则正常转发到80端口保证网站正常运行.否则转发到8888端口执行系统命令. 8888端口监听代码: #!/usr/bin/env python from socket import * import os HOST='127.0.0.1' PORT=8888 BUFSIZE=1024 ADDR=(HOST,PORT) tcpSerSock = socket(AF_INET,SOCK_STREAM) tcpSerSock.set

  • 利用virtualbox虚拟机实现端口转发

    virtualbox虚拟机实现端口转发,具体内容如下 1.应用场景 突破上网限制(如在公司内部限制访问外部网络,但是开放了某些端口,可以利用开放的某些端口实现端口重定向) 远程桌面重定向 NC重定向获得Shell 2.实验环境 virtualbox虚拟机 Windows XP(作为防火墙子网客户机,Host-Only,ip:1.1.1.10) 防火墙(虚拟两块网卡,一块使用桥接到物理网络,一块使用Host-Only,ip:1.1.1.1) Kali Linux(安装rinetd作为流量转发中转站

  • python Socket网络编程实现C/S模式和P2P

    C/S模式 由于网络课需要实现Socket网络编程,所以简单实现了一下,C/S模式分别用TCP/IP协议与UDP协议实现,下面将分别讲解. TCP/IP协议 TCP/IP协议是面向连接的,即客户端与服务器需要先建立连接后才能传输数据,以下是服务器端的代码实现. 服务端: import socket from threading import Thread def deal(sock,addr): print('Accept new connection from {}:{}'.format(ad

随机推荐