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分析git log日志示例
Feb 27 Python
最基础的Python的socket编程入门教程
Apr 23 Python
Python中函数参数调用方式分析
Aug 09 Python
python3实现点餐系统
Jan 24 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 Python
Django如何与Ajax交互
Apr 29 Python
python process模块的使用简介
May 14 Python
Python一行代码实现自动发邮件功能
May 30 Python
Python极值整数的边界探讨分析
Sep 15 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中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
php+xml实现在线英文词典之添加词条的方法
2015/01/23 PHP
PHP asXML()函数讲解
2019/02/03 PHP
javascript当中的代码嗅探扩展原生对象和原型(prototype)
2013/01/11 Javascript
js中生成map对象的方法
2014/01/09 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
js脚本实现数据去重
2014/11/27 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
js自定义select下拉框美化特效
2016/05/12 Javascript
AngularJs自定义服务之实现签名和加密
2016/08/02 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
浅谈关于iview表单验证的问题
2018/09/29 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
vue实现表格合并功能
2020/12/01 Vue.js
[50:38]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第二场 3月7日
2021/03/11 DOTA
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
Python通过future处理并发问题
2017/10/17 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
Doyoueven官网:澳大利亚健身服饰和配饰品牌
2019/03/24 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
国旗下的讲话演讲稿
2014/05/08 职场文书
领导欢迎词范文
2015/01/26 职场文书
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技