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中处理字符串之endswith()方法的使用简介
May 18 Python
Python中http请求方法库汇总
Jan 06 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
Jun 28 Python
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
Dec 14 Python
Pandas中把dataframe转成array的方法
Apr 13 Python
python实现剪切功能
Jan 23 Python
Python pandas用法最全整理
Aug 04 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
python爬不同图片分别保存在不同文件夹中的实现
Apr 02 Python
Python基础之常用库常用方法整理
Apr 30 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中使用foreach和引用导致程序BUG的问题介绍
2012/09/05 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法
2016/10/25 Javascript
Jquery根据浏览器窗口改变调整大小的方法
2017/02/07 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
vue中将网页打印成pdf实例代码
2017/06/15 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
使用mixins实现elementUI表单全局验证的解决方法
2019/04/02 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
vue如何使用外部特殊字体的操作
2020/07/30 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
Python Flask基础教程示例代码
2018/02/07 Python
python pyheatmap包绘制热力图
2018/11/09 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
租赁意向书范本
2014/04/01 职场文书
小学生环保倡议书
2014/05/15 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python