转自: http://www.tuicool.com/articles/VRNzaq

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为例介绍一下实现过程,简单画了个时序图(如下),这里就不再用文字赘述了。

需要注意的是,由于端口映射只是单纯的流量转发,对应用层数据不进行处理,所以对于多通道协议是无法支持的(如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

# 调试日志封装

defsend_log(content):

print content

return

# 单向流数据传递

deftcp_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>%dbytes.' % (conn_receiver.getpeername(), conn_sender.getpeername(), len(data)))

conn_receiver.close()

conn_sender.close()

return

# 端口映射请求处理

deftcp_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

# 端口映射函数

deftcp_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 通过连接映射服务器的 端口,成功访问192.168.0.10 的SSH服务( 端口):

TCP Mapping: 创建监听线程 Alice->TCP Mapping: 连接请求 TCP Mapping->Alice: 建立连接 TCP Mapping->TCP Mapping: 创建到Bob的连接线程 TCP Mapping->Bob: 连接请求 Bob->TCP Mapping: 建立连接 TCP Mapping->TCP Mapping: 创建Alice->Bob转发线程 TCP Mapping->TCP Mapping: 创建Bob->Alice转发线程 loop Alice->Bob转发线程 Alice->TCP Mapping: 请求数据 note right of TCP Mapping: 将Alice的流量转发给Bob TCP Mapping->Bob: 请求数据 end loop Bob->Alice转发线程 Bob->TCP Mapping: 响应数据 note left of TCP Mapping: 将Bob的流量转发给Alice TCP Mapping->Alice: 响应数据 end ]]> -->

python 映射使用_使用Python实现端口映射相关推荐

  1. 磊科762虚拟服务器静态,路由器端口映射教程_磊科NW717路由器端口映射设置教程...

    端口映射在磊科NW717路由器中,叫做虚拟服务器;端口映射的作用是把访问路由器WAN口IP地址的请求,映射(转发)到内网中的某台计算机上网,具体请看下面小编介绍的操作方法! 磊科NW717端口映射设置 ...

  2. Ubuntu系统下python opencv视频采集:使用USB端口映射指定要读取的相机设备

    Ubuntu16.04 下 python opencv 视频采集:使用USB端口映射指定要读取的相机设备 有时我们需要读取指定设备的视频流,但笔记本电脑通常自带相机,同时可能连接多个USB相机,每次插 ...

  3. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  4. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  5. 端口映射软件大-比较|内网端口映射器使用方法

    [转载]端口映射软件大-比较|内网端口映射器使用方法 2010-05-15 13:34 功能多少作为顺序: PortTunnel 2.0.13 简体中文版 优点:功能最为强大,默认为服务模式. 缺点: ...

  6. python希腊字母字符串_#10 Python字符串

    前言 通过上一节可知,Python6个序列的内置类型中,最常见的是列表和元组,但在Python中,最常用的数据类型却不是列表和元组,而是字符串.要想深入了解字符串,必须先掌握字符编码问题.因此本篇博文 ...

  7. python 创意项目_针对python开发人员的10个很棒的python项目创意

    python 创意项目 The joy of coding Python should be in seeing short, concise, readable classes that expre ...

  8. python集群_使用Python集群文档

    python集群 Natural Language Processing has made huge advancements in the last years. Currently, variou ...

  9. python 网页编程_通过Python编程检索网页

    python 网页编程 The internet and the World Wide Web (WWW), is probably the most prominent source of info ...

最新文章

  1. 104.全排列(深搜)搜索与回溯
  2. JavaScript实现单词首字母大写的方法集锦
  3. Chrome 自动填充的表单是淡黄色的背景怎么办!
  4. JAVA虚拟机 安全区域_Java虚拟机的内存区域
  5. 图形验证码校验php,ThinkPHP实现生成和校验验证码功能
  6. OpenGL ES入门(使用指南)
  7. Express-start
  8. 判断数据是增量分区全量分区
  9. 计算机应用基础论坛发帖,计算机应用基础串讲冲刺讲义(一)_IT教育论坛_计算机学习论坛_学赛网_IT在线教育平台...
  10. intellij 关闭自动保存和标志修改文件为星号dxl
  11. 安卓扫描文字识别软件
  12. 禁止电脑屏幕旋转快捷键
  13. 天地孤影任我行(东邪西毒电影原声曲)铃声 天地孤影任我行(...
  14. 女生玩游戏什么款式蓝牙耳机好用?小清新高颜值游戏蓝牙耳机推荐
  15. red5安装 (for flash server) 与fms 功能类同。
  16. 小型直播系统系列-乐聊TV的开发(四)
  17. 【Spring实战】----Spring事务管理配置解析
  18. vba给服务器发送消息,我如何发送一个HTTP POST请求使用VBA从Excel服务器?我如何发送一个HTTP POST请...
  19. png的计算机储存图片的格式吗,我电脑打不开png格式的图片,如何解决?
  20. java语言基础知识笔记

热门文章

  1. 开源两大阵营告诉你开源License的根本区别
  2. 使用开源安装包制作工具Inno Setup制作软件安装包
  3. 解决ubuntu开启启动 : A start job is running for wait for nerwork to be configured 过慢
  4. [转]怎样关闭windows系统端口
  5. 字符串的indexOf用法
  6. DO280OpenShift安装与部署--安装部署与验证
  7. java提取屏幕颜色,各种颜色的rgb值-Mac中怎么使用自带的数码测色计提取屏幕颜色RGB值?...
  8. MySQL性能调优(MySQL高性能第三版)
  9. Android 数据共享机制!
  10. 2022-2028全球与中国独立触控板市场现状及未来发展趋势