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概率计算器实例分析
Mar 25 Python
python根据出生年份简单计算生肖的方法
Mar 27 Python
Python 专题一 函数的基础知识
Mar 16 Python
python基本语法练习实例
Sep 19 Python
python 读取文件并替换字段的实例
Jul 12 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
基于Python打造账号共享浏览器功能
May 30 Python
使用python 写一个静态服务(实战)
Jun 28 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
Django rest framework分页接口实现原理解析
Aug 21 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遍历文件夹和文件列表示例分享
2014/03/11 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
简单的JS多重继承示例
2008/03/13 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
2011/03/12 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
JavaScript中的数组操作介绍
2014/12/30 Javascript
JavaScript中Cookies的相关使用教程
2015/06/04 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
python解析xml文件实例分享
2013/12/04 Python
利用python求相邻数的方法示例
2017/08/18 Python
轻松理解Python 中的 descriptor
2017/09/15 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
python 表格打印代码实例解析
2019/10/12 Python
利用Python脚本实现自动刷网课
2020/02/03 Python
Python基于numpy模块实现回归预测
2020/05/14 Python
python音频处理的示例详解
2020/12/23 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
成人继续教育实施方案
2014/03/01 职场文书
节约电力资源的建议书
2014/03/12 职场文书
学校对教师的评语
2014/04/28 职场文书
课外访万家心得体会
2014/09/03 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL