Python实现TCP协议下的端口映射功能的脚本程序示例
作者:hutaow 发布时间:2021-07-26 13:59:01
标签:Python,端口
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
# 调试日志封装
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端口):
0
投稿
猜你喜欢
- python常见的错误有1.NameError变量名错误2.IndentationError代码缩进错误3.AttributeError对象
- 分页一般和表格一起用,分页链接作为表格的一部分,将分页链接封装成一个独立的组件,然后作为子组件嵌入到表格组件中,这样比较合理。效果:代码:1
- 第一次写文章,也当作工作中遇到问题的一次分享。由于Vuex在浏览器刷新是会丢失数据,所以我在项目里使用了Vuex持久化存储的功能,我这边实现
- 之前有个程序,里面有个时间部分是按照国内时区,也就是东八区,来写的,程序中定义了北京时间2点到八点进行检查;后面程序在国外机器上,例如说韩国
- 作业备份,不是备份数据库,是备份作业。 我的方法是把作业导出成文件备份起来,因为当你服务器维护的多了的时候很多你的作业 就很成问题,很麻烦。
- 一、is_numberic函数简介国内一部分CMS程序里面有用到过is_numberic函数,我们先看看这个函数的结构bool is_num
- 1、opencc-python首先介绍opencc中的Python实现库,它具有安装简单,翻译准确,使用方便等优点。对于我们日常的需求完全能
- 本文实例讲述了python生成IP段的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/local/bin/python#-*-
- 以前用Ubuntu的时候感觉很简单的事到ContOS上却变得很头痛,在执行以下命令安装python-pip居然什么也没执行。yum inst
- Pygame的Draw绘图Pygame 中提供了一个draw模块用来绘制一些简单的图形状,比如矩形、多边形、圆形、直线、弧线等。pygame
- 支付宝lab的意思是支付宝实验室,也就是概念产品聚集地,可以让用户快速试用这些新产品。本次支付宝lab logo设计历时一个星期,视觉设计组
- 如下所示:from osgeo import gdalimport numpy as npdef read_tiff(inpath): &n
- 用来批量切割视频的开头部分,比如去掉一部电视剧的序幕,看着难受不说数量还很多,很菜鸟的一篇,毕竟我也是一个菜鸟,首先要有ffmpeg这个软件
- 你需要添加两个按钮:一个按钮使所有英雄都可以死亡,而另一个按钮使所有英雄永生。由于它会影响所有英雄,而与选择无关,因此这需要一个单独的按钮,
- 前言在前几天的文章中我们讲解了如何从Word表格中提取指定数据并按照格式保存到Excel中,今天我们将再次以一位读者提出的真实需求来讲解如何
- CSS Type set是一款在线字体调整工具。你可以使用它来对字型进行排版调整并实时的看到CSS代码。在下图中,其中,你可以设置文本的字体
- 前言本篇文章要使用OpenCV、Numpy 和Math这3个工具包实现一个简单的滤镜编辑器。在这个滤镜编辑器中,包含了3种滤镜效果,它们分别
- 一、 安装tensorboard直接pip即可:pip install tensorboard这里注意,使用pytorch,并不需要额外安装
- 一、最长回文子串问题描述🪐大家已经熟悉了AABCC、AABBCC这种类型的字符串是回文串。也就是说,排除掉字符串中的各种字符,字母不区分大小
- 一个简单的车牌输入组件(vue),供大家参考,具体内容如下代码:vue代码:<template> &l