Python实现TCP协议下的端口映射功能的脚本程序示例


Posted in Python onJune 14, 2016

1 端口映射

举个例子来说明一下端口映射的作用。

有A、B、C三台计算机,A、B互通,B、C互通,但是A、C不通,这个时候在C上开了一个Web服务,如何让A访问C的Web服务?

最简单有效的办法就是在B上开一个端口映射服务,然后让A访问B的某个端口,B将这个端口上的所有流量全部转发到C的Web服务端口上,同时将C上Web服务返回的流量也全部转发给A。这样对A来说,以B为跳板,实现了间接访问C上Web服务的目的。

2 实现流程

端口映射的原理并不复杂,本文以TCP为例介绍一下实现过程,简单画了个时序图(如下),这里就不再用文字赘述了。

Python实现TCP协议下的端口映射功能的脚本程序示例

需要注意的是,由于端口映射只是单纯的流量转发,对应用层数据不进行处理,所以对于多通道协议是无法支持的(如FTP协议)。

3 代码示例

按照上面的流程,Python实现如下(建议从后向前看):

# -*- coding: utf-8 -*-
# tcp mapping created by hutaow(hutaow.com) at 2014-08-31

import socket
import threading

# 端口映射配置信息
CFG_REMOTE_IP = '192.168.0.10'
CFG_REMOTE_PORT = 22
CFG_LOCAL_IP = '0.0.0.0'
CFG_LOCAL_PORT = 10022

# 接收数据缓存大小
PKT_BUFF_SIZE = 2048

# 调试日志封装
def send_log(content):
  print content
  return

# 单向流数据传递
def tcp_mapping_worker(conn_receiver, conn_sender):
  while True:
    try:
      data = conn_receiver.recv(PKT_BUFF_SIZE)
    except Exception:
      send_log('Event: Connection closed.')
      break

    if not data:
      send_log('Info: No more data is received.')
      break

    try:
      conn_sender.sendall(data)
    except Exception:
      send_log('Error: Failed sending data.')
      break

    # send_log('Info: Mapping data > %s ' % repr(data))
    send_log('Info: Mapping > %s -> %s > %d bytes.' % (conn_receiver.getpeername(), conn_sender.getpeername(), len(data)))

  conn_receiver.close()
  conn_sender.close()

  return

# 端口映射请求处理
def tcp_mapping_request(local_conn, remote_ip, remote_port):
  remote_conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  try:
    remote_conn.connect((remote_ip, remote_port))
  except Exception:
    local_conn.close()
    send_log('Error: Unable to connect to the remote server.')
    return

  threading.Thread(target=tcp_mapping_worker, args=(local_conn, remote_conn)).start()
  threading.Thread(target=tcp_mapping_worker, args=(remote_conn, local_conn)).start()

  return

# 端口映射函数
def tcp_mapping(remote_ip, remote_port, local_ip, local_port):
  local_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  local_server.bind((local_ip, local_port))
  local_server.listen(5)

  send_log('Event: Starting mapping service on ' + local_ip + ':' + str(local_port) + ' ...')

  while True:
    try:
      (local_conn, local_addr) = local_server.accept()
    except KeyboardInterrupt, Exception:
      local_server.close()
      send_log('Event: Stop mapping service.')
      break

    threading.Thread(target=tcp_mapping_request, args=(local_conn, remote_ip, remote_port)).start()

    send_log('Event: Receive mapping request from %s:%d.' % local_addr)

  return

# 主函数
if __name__ == '__main__':
  tcp_mapping(CFG_REMOTE_IP, CFG_REMOTE_PORT, CFG_LOCAL_IP, CFG_LOCAL_PORT)

4 运行

运行效果如下,192.168.0.20通过连接映射服务器的10022端口,成功访问192.168.0.10的SSH服务(22端口):

Python实现TCP协议下的端口映射功能的脚本程序示例

Python 相关文章推荐
详解python实现读取邮件数据并下载附件的实例
Aug 03 Python
Python正确重载运算符的方法示例详解
Aug 27 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
python reduce 函数使用详解
Dec 05 Python
Python实现处理逆波兰表达式示例
Jul 30 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
使用python判断jpeg图片的完整性实例
Jun 10 Python
python打造爬虫代理池过程解析
Aug 15 Python
Python二次规划和线性规划使用实例
Dec 09 Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 Python
python交互模式基础知识点学习
Jun 18 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 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
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 #Python
You might like
laravel 获取当前url的别名方法
2019/10/11 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
js计算页面刷新的次数
2009/07/20 Javascript
JavaScript类和继承 prototype属性
2010/09/03 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
深入学习JavaScript 高阶函数
2019/06/11 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
python 生成不重复的随机数的代码
2011/05/15 Python
python实现调用其他python脚本的方法
2014/10/05 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
python实现简易数码时钟
2021/02/19 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
Python中常用的内置方法
2019/01/28 Python
浅谈pytorch grad_fn以及权重梯度不更新的问题
2019/08/20 Python
Python如何获取Win7,Win10系统缩放大小
2020/01/10 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
美国厨房和园艺工具网上商店:Nestneed
2019/08/24 全球购物
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2016/02/09 面试题
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
竞选团支书演讲稿
2014/04/28 职场文书
李开复演讲稿
2014/05/24 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
投标邀请书范本
2015/02/02 职场文书
高中物理教学反思
2016/02/19 职场文书