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 相关文章推荐
python3访问sina首页中文的处理方法
Feb 24 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
Python实现的redis分布式锁功能示例
May 29 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
基于python 等频分箱qcut问题的解决
Mar 03 Python
解决django FileFIELD的编码问题
Mar 30 Python
Python基于stuck实现scoket文件传输
Apr 02 Python
spyder 在控制台(console)执行python文件,debug python程序方式
Apr 20 Python
Python爬取豆瓣数据实现过程解析
Oct 27 Python
Python批量删除mysql中千万级大量数据的脚本分享
Dec 03 Python
PO模式在selenium自动化测试框架的优势
Mar 20 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 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
PHP 变量的定义方法
2010/01/26 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
使用Curl进行抓取远程内容时url中文编码问题示例探讨
2013/10/29 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
asm.js使用示例代码
2013/11/28 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
jQuery版本升级踩坑大全
2016/01/12 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
2017/01/05 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
vue实现pdf文档在线预览功能
2019/11/26 Javascript
基于JQuery和DWR实现异步数据传递
2020/10/16 jQuery
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
Python解决鸡兔同笼问题的方法
2014/12/20 Python
详解python3实现的web端json通信协议
2016/12/29 Python
利用python如何处理nc数据详解
2018/05/23 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
selenium处理元素定位点击无效问题
2019/06/12 Python
Python脚本利用adb进行手机控制的方法
2019/07/08 Python
浅析Python语言自带的数据结构有哪些
2019/08/27 Python
Python正则表达式如何匹配中文
2020/05/27 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
金融专业银行实习证明模板
2014/11/28 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
十大最强奥特曼武器:怪兽战斗仪在榜,第五奥特之父只使用过一次
2022/03/18 日漫