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返回真假值(True or False)小技巧
Apr 10 Python
Python编程之序列操作实例详解
Jul 22 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
python实现两个文件夹的同步
Aug 29 Python
Python中*args和**kwargs的区别详解
Sep 17 Python
基于python实现从尾到头打印链表
Nov 02 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
python 实现全球IP归属地查询工具
Dec 18 Python
python中HTMLParser模块知识点总结
Jan 25 Python
Python中npy和mat文件的保存与读取
Apr 24 Python
Python如何利用pandas读取csv数据并绘图
Jul 07 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
做一个有下拉功能的留言版
2006/10/09 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
浅谈php中变量的数据类型判断函数
2017/03/04 PHP
jQuery实现的输入框选择时间插件用法实例
2015/02/28 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
基于vue+echarts 数据可视化大屏展示的方法示例
2020/03/09 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
Python使用微信SDK实现的微信支付功能示例
2017/06/30 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
Python如何实现FTP功能
2020/05/28 Python
使用Html5中的cavas画一面国旗
2019/09/25 HTML / CSS
地球上最先进的胡子和头发修剪器:Bevel
2018/01/23 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
成考报名单位证明范本
2014/01/16 职场文书
关于保护环境的建议书
2014/08/26 职场文书
工资收入证明样本(5篇)
2014/09/16 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
2015年行政助理工作总结
2015/04/30 职场文书
山楂树之恋观后感
2015/06/11 职场文书
运动员加油词
2015/07/18 职场文书
心理健康教育主题班会
2015/08/13 职场文书
Python Pandas模块实现数据的统计分析的方法
2021/06/24 Python
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers