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


Posted in Python onSeptember 19, 2016

本文实例讲述了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 相关文章推荐
python开发之list操作实例分析
Feb 22 Python
使用Python & Flask 实现RESTful Web API的实例
Sep 19 Python
用matplotlib画等高线图详解
Dec 14 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
在python中实现强制关闭线程的示例
Jan 22 Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 Python
pyqt5 获取显示器的分辨率的方法
Jun 18 Python
python用什么编辑器进行项目开发
Jun 17 Python
Python如何实现机器人聊天
Sep 10 Python
python 中[0]*2与0*2的区别说明
May 10 Python
python保存图片的四个常用方法
Feb 28 Python
Python 全局空间和局部空间
Apr 06 Python
Python中__init__.py文件的作用详解
Sep 18 #Python
Python简单遍历字典及删除元素的方法
Sep 18 #Python
Python实现压缩与解压gzip大文件的方法
Sep 18 #Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 #Python
Python简单格式化时间的方法【strftime函数】
Sep 18 #Python
Python简单获取自身外网IP的方法
Sep 18 #Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 #Python
You might like
PHP判断远程url是否有效的几种方法小结
2011/10/08 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
php通过各种函数判断0和空
2020/07/04 PHP
锋利的jQuery 要点归纳(一) jQuery选择器
2010/03/21 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
javascript 模拟坦克大战游戏(html5版)附源码下载
2014/04/08 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
node.js基于mongodb的搜索分页示例
2017/01/22 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
基于JavaScript实现选项卡效果
2017/07/21 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
2018/05/27 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
Vue-Router基础学习笔记(小结)
2018/10/15 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
简单介绍Python中的struct模块
2015/04/28 Python
django实现分页的方法
2015/05/26 Python
python机器学习实战之K均值聚类
2017/12/20 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Python3 中文文件读写方法
2018/01/23 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
Python基于callable函数检测对象是否可被调用
2020/10/16 Python
Java软件工程师综合面试题笔试题
2013/09/08 面试题
毕业生的自我鉴定
2013/10/29 职场文书
肯尼迪就职演说稿
2013/12/31 职场文书
保护环境建议书100字
2014/05/13 职场文书
工商干部先进事迹
2014/05/14 职场文书
2014年教学工作总结
2014/11/13 职场文书
2014年小学工作总结
2014/11/26 职场文书
优秀团支部申报材料
2014/12/26 职场文书
Go各时间字符串使用解析
2021/04/02 Golang