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字符串排序方法
Aug 29 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 Python
python 检查文件mime类型的方法
Dec 08 Python
详解用python写网络爬虫-爬取新浪微博评论
May 10 Python
Python实现一个数组除以一个数的例子
Jul 20 Python
TensorFlow实现保存训练模型为pd文件并恢复
Feb 06 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
Feb 20 Python
Python 如何创建一个线程池
Jul 28 Python
Cpython解释器中的GIL全局解释器锁
Nov 09 Python
Python实现给PDF添加水印的方法
Jan 25 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
基于php-fpm的配置详解
2013/06/03 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
Javascript 解疑
2009/11/11 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
javascript使用正则实现去掉字符串前面的所有0
2018/07/23 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
如何解决.vue文件url引用文件的问题
2019/01/18 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
Python自动化运维和部署项目工具Fabric使用实例
2016/09/18 Python
python学习教程之使用py2exe打包
2017/09/24 Python
python筛选出两个文件中重复行的方法
2018/05/31 Python
python计算两个数的百分比方法
2018/06/29 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
python创建学生管理系统
2019/11/22 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
基础的CSS3弹性盒Flexbox布局使用实例
2016/04/08 HTML / CSS
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
日期和时间问题
2015/01/04 面试题
技校个人求职信范文
2014/01/25 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
会计师事务所实习证明
2014/11/16 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
JavaScript 事件捕获冒泡与捕获详情
2021/11/11 Javascript