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之开始真正编程
Sep 12 Python
深入讲解Java编程中类的生命周期
Feb 05 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
selenium+python自动化测试之页面元素定位
Jan 23 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
使用python实现希尔、计数、基数基础排序的代码
Dec 25 Python
python实现在一个画布上画多个子图
Jan 19 Python
解决pycharm不能自动补全第三方库的函数和属性问题
Mar 12 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
Apr 01 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
keras之权重初始化方式
May 21 Python
Keras loss函数剖析
Jul 06 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
php中的比较运算符详解
2013/10/28 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
Yii开启片段缓存的方法
2016/03/28 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
js实时获取系统当前时间实例代码
2013/06/28 Javascript
使用delegate方法为一个tr标签加一个链接
2014/06/27 Javascript
javascript比较两个日期相差天数的方法
2015/07/24 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
vue移动端屏幕适配详解
2019/04/30 Javascript
javascript合并两个数组最简单的实现方法
2019/09/14 Javascript
[01:10:58]KG vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python3.x上post发送json数据
2018/03/04 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
公司庆典邀请函范文
2014/01/13 职场文书
精彩广告词大全
2014/03/19 职场文书
关于环保的标语
2014/06/13 职场文书
标准单位租车协议书
2014/09/23 职场文书
党员作风建设自查报告
2014/10/23 职场文书
2015员工年度考核评语
2015/03/25 职场文书
大学入学感言
2015/08/01 职场文书
三下乡活动心得体会
2016/01/23 职场文书