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 15 Python
Python实现矩阵转置的方法分析
Nov 24 Python
python3利用venv配置虚拟环境及过程中的小问题小结
Aug 01 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
在python shell中运行python文件的实现
Dec 21 Python
Python文件操作方法详解
Feb 09 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
Mar 02 Python
解决django FileFIELD的编码问题
Mar 30 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 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
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
php使用Cookie实现和用户会话的方法
2015/01/21 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
defer属性导致引用JQuery的页面报“浏览器无法打开网站xxx,操作被中止”错误的解决方法
2010/04/27 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
jQuery实现table隔行换色和鼠标经过变色的两种方法
2014/06/15 Javascript
使用Meteor配合Node.js编写实时聊天应用的范例
2015/06/23 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
微信小程序页面间通信的5种方式
2017/03/31 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
微信小程序实现滚动消息通知
2018/02/02 Javascript
vue实现前端分页完整代码
2020/06/17 Javascript
Python实现的tab文件操作类分享
2014/11/20 Python
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
Python将string转换到float的实例方法
2019/07/29 Python
numpy 声明空数组详解
2019/12/05 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
UNIX文件系统分类
2014/11/11 面试题
庆中秋节主题活动方案
2014/02/03 职场文书
《我为你骄傲》教学反思
2014/02/20 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
生物科学专业毕业生求职信
2014/06/02 职场文书
警察群众路线对照检查材料思想汇报
2014/10/01 职场文书
如何利用js在两个html窗口间通信
2021/04/27 Javascript
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技