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之用Python计算
Sep 12 Python
python3.5 email实现发送邮件功能
May 22 Python
python os用法总结
Jun 08 Python
在Python中定义一个常量的方法
Nov 10 Python
python opencv实现图像边缘检测
Apr 29 Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 Python
在notepad++中实现直接运行python代码
Dec 18 Python
python自动识别文本编码格式代码
Dec 26 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
Mar 10 Python
如何表示python中的相对路径
Jul 08 Python
python的html标准库
Apr 29 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实现登陆验证码(类似条行码状)
2006/10/09 PHP
第四节--构造函数和析构函数
2006/11/16 PHP
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
获取客户端网卡MAC地址和IP地址实现JS代码
2013/03/17 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
javascript常用的方法分享
2015/07/01 Javascript
基于jQuery实现二级下拉菜单效果
2016/02/01 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
微信小程序 页面传值详解
2017/03/10 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
Element-ui table中过滤条件变更表格内容的方法
2018/03/02 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
OpenLayer学习之自定义测量控件
2020/09/28 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
python机器学习之神经网络(一)
2017/12/20 Python
Python import与from import使用及区别介绍
2018/09/06 Python
实例介绍Python中整型
2019/02/11 Python
解决使用export_graphviz可视化树报错的问题
2019/08/09 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
成品仓管员岗位职责
2013/12/11 职场文书
搬家公司的创业计划书
2014/01/01 职场文书
优秀教师事迹简介
2014/02/02 职场文书
大学生自我鉴定书
2014/03/24 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
综合素质评价自我评价
2015/03/06 职场文书
会议主持词开场白
2015/05/28 职场文书
致接力运动员加油稿
2015/07/21 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
Tomcat配置访问日志和线程数
2022/05/06 Servers