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爬虫之抓取糗事百科代码分享
Nov 06 Python
深入Python函数编程的一些特性
Apr 13 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
Python解析、提取url关键字的实例详解
Dec 17 Python
Python minidom模块用法示例【DOM写入和解析XML】
Mar 25 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
使用 Python 处理 JSON 格式的数据
Jul 22 Python
Python assert关键字原理及实例解析
Dec 13 Python
Django更新models数据库结构步骤
Apr 01 Python
Python APScheduler执行使用方法详解
Dec 10 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 Python
Python爬虫中urllib3与urllib的区别是什么
Jul 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 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
php微信开发之百度天气预报
2016/11/18 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
php实现页面纯静态的实例代码
2017/06/21 PHP
Gambit vs CL BO3 第一场 2.13
2021/03/10 DOTA
javawscript 三级菜单的实现原理
2009/07/01 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
Vue响应式原理详解
2017/04/18 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
Python 高级专用类方法的实例详解
2017/09/11 Python
对Python实现简单的API接口实例讲解
2018/12/10 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
游戏商店:Eneba
2020/04/25 全球购物
办公室经理岗位职责
2014/01/01 职场文书
幼儿园亲子活动总结
2014/04/26 职场文书
产品推广策划方案
2014/05/10 职场文书
体育节口号
2014/06/19 职场文书
学校元旦晚会开场白
2014/12/14 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
2015年驾驶员工作总结
2015/04/29 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
开网店计划分析
2019/07/30 职场文书
MySQL连接查询你真的学会了吗?
2021/06/02 MySQL
go语言中http超时引发的事故解决
2021/06/02 Golang
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技