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


Posted in Python onJune 14, 2016

首先,我们用webpy写一个简单的网站,监听8080端口,返回“Hello, EverET.org”的页面。

然后我们使用我们的forwarding.py,在80端口和8080端口中间建立两条通信管道用于双向通信。

此时,我们通过80端口访问我们的服务器。

浏览器得到:

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

然后,我们在forwarding.py的输出结果中可以看到浏览器和webpy之间的通信内容。

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

代码:

#!/usr/bin/env python
import sys, socket, time, threading

loglock = threading.Lock()
def log(msg):
  loglock.acquire()
  try:
    print '[%s]: \n%s\n' % (time.ctime(), msg.strip())
    sys.stdout.flush()
  finally:
    loglock.release()

class PipeThread(threading.Thread):
  def __init__(self, source, target):
    threading.Thread.__init__(self)
    self.source = source
    self.target = target

  def run(self):
    while True:
      try:
        data = self.source.recv(1024)
        log(data)
        if not data: break
        self.target.send(data)
      except:
        break
    log('PipeThread done')

class Forwarding(threading.Thread):
  def __init__(self, port, targethost, targetport):
    threading.Thread.__init__(self)
    self.targethost = targethost
    self.targetport = targetport
    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.bind(('0.0.0.0', port))
    self.sock.listen(10)
  def run(self):
    while True:
      client_fd, client_addr = self.sock.accept()
      target_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      target_fd.connect((self.targethost, self.targetport))
      log('new connect')
      # two direct pipe
      PipeThread(target_fd, client_fd).start()
      PipeThread(client_fd, target_fd).start()


if __name__ == '__main__':
  print 'Starting'
  import sys
  try:
    port = int(sys.argv[1])
    targethost = sys.argv[2]
    try: targetport = int(sys.argv[3])
    except IndexError: targetport = port
  except (ValueError, IndexError):
    print 'Usage: %s port targethost [targetport]' % sys.argv[0]
    sys.exit(1)

  #sys.stdout = open('forwaring.log', 'w')
  Forwarding(port, targethost, targetport).start()
Python 相关文章推荐
在Python中处理列表之reverse()方法的使用教程
May 21 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
Feb 13 Python
在django view中给form传入参数的例子
Jul 19 Python
PyTorch的Optimizer训练工具的实现
Aug 18 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
python绘制分布折线图的示例
Sep 24 Python
简单且有用的Python数据分析和机器学习代码
Jul 02 Python
一些让Python代码简洁的实用技巧总结
Aug 23 Python
python​格式化字符串
Apr 20 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 #Python
浅谈python新手中常见的疑惑及解答
Jun 14 #Python
Python中死锁的形成示例及死锁情况的防止
Jun 14 #Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 #Python
Python使用dis模块把Python反编译为字节码的用法详解
Jun 14 #Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 #Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 #Python
You might like
使用PHP socke 向指定页面提交数据
2008/07/23 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
jQuery入门知识简介
2010/03/04 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
扩展JS Date对象时间格式化功能的小例子
2013/12/02 Javascript
Js 正则表达式知识汇总
2014/12/02 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
Vue 单文件中的数据传递示例
2017/03/21 Javascript
JS排序之选择排序详解
2017/04/08 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
js实现无缝轮播图插件封装
2020/07/31 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
利用pandas进行大文件计数处理的方法
2018/07/25 Python
基于python的Paxos算法实现
2019/07/03 Python
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
西班牙手机之家:Phone House
2018/10/18 全球购物
State Cashmere官网:半零售价可持续蒙古羊绒
2020/02/26 全球购物
奖学金自我鉴定范文
2013/10/03 职场文书
大学生的应聘自我评价
2013/12/13 职场文书
信息技术教学反思
2014/02/12 职场文书
出纳员岗位职责
2014/03/13 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
党员自评材料范文
2014/12/17 职场文书
同意报考证明
2015/06/17 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
在Java中Collection的一些常用方法总结
2021/06/13 Java/Android
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS
Python如何将list中的string转换为int
2022/07/15 Ruby