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 ip正则式
May 07 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
详解Python装饰器
Mar 25 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
Django自带日志 settings.py文件配置方法
Aug 30 Python
opencv3/C++图像像素操作详解
Dec 10 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
Numpy中ndim、shape、dtype、astype的用法详解
Jun 14 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
在终端启动Python时报错的解决方案
Nov 20 Python
python 实时调取摄像头的示例代码
Nov 25 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
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
javascrip关于继承的小例子
2013/05/10 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
JavaScript中DOM详解
2015/04/13 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
js实现图片360度旋转
2017/01/22 Javascript
浅谈ECMAScript6新特性之let、const
2017/08/02 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
小程序云开发教程如何使用云函数实现点赞功能
2019/05/18 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
python实现解数独程序代码
2017/04/12 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
树莓派安装OpenCV3完整过程的实现
2019/10/10 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
Trip.com香港网站:Ctrip携程旗下,全球最大的网上旅游社之一
2016/08/01 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
优秀德育工作者事迹材料
2014/05/07 职场文书
关于学习的演讲稿
2014/05/10 职场文书
党的群众路线教育实践活动总结
2014/10/30 职场文书
六年级学生期末评语
2014/12/26 职场文书
新员工试用期自我评价
2015/03/10 职场文书
财务稽核岗位职责
2015/04/13 职场文书
车间统计员岗位职责
2015/04/14 职场文书
开业典礼致辞
2015/07/29 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
python中if和elif的区别介绍
2021/11/07 Python
详解SQL报错盲注
2022/07/23 SQL Server