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 27 Python
python对html代码进行escape编码的方法
May 04 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
python用户管理系统的实例讲解
Dec 23 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
Jan 31 Python
python http基本验证方法
Dec 26 Python
Python 中Django安装和使用教程详解
Jul 03 Python
python里运用私有属性和方法总结
Jul 08 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 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
php5 mysql分页实例代码
2008/04/10 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
简单的php购物车代码
2020/06/05 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
javascript内置对象arguments详解
2014/03/16 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
js实现搜索栏效果
2018/11/16 Javascript
JS中使用new Option()实现时间联动效果
2018/12/10 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
Python Web框架Flask中使用七牛云存储实例
2015/02/08 Python
Python输出9*9乘法表的方法
2015/05/25 Python
python中os模块详解
2016/10/14 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
python实现发送邮件
2021/03/02 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
管理信息系学生的自我评价
2014/01/11 职场文书
教师演讲稿开场白
2014/08/25 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
2014年党员干部四风问题自我剖析材料
2014/09/29 职场文书
个人债务授权委托书
2014/10/17 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
巴黎圣母院观后感
2015/06/10 职场文书
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL