首页 > 编程语言 >21.13 Python 实现端口流量转发

21.13 Python 实现端口流量转发

时间:2023-11-01 11:25:02浏览次数:39  
标签:remote socket Python 端口 21.13 local 远程 conn

端口流量转发(Port Forwarding)是一种网络通信技术,用于将特定的网络流量从一个端口或网络地址转发到另一个端口或地址。它在网络中扮演着一个非常重要的角色,在Python语言中实现端口转发非常容易。

如下这段代码实现了一个基本的TCP端口映射,将本地指定端口的流量转发到指定的远程IP和端口。实现方式是在接收到本地客户端连接请求后,创建一个线程,将本地连接和远程连接之间的数据传输通过线程分别实现,这样就实现了数据在本地和远程之间的单向流动,从而实现了TCP端口映射。

具体实现方式如下:

  • 1.定义tcp_mapping_worker()函数,接收本地客户端连接和远程服务器连接作为参数,通过while循环监听本地连接,当接收到本地连接的数据时,将数据发送到远程服务器连接,实现本地到远程的单向流动。当本地连接关闭时,结束该线程。

  • 2.定义tcp_mapping_request()函数,接收本地客户端连接、远程服务器IP和端口作为参数,创建远程连接,然后使用两个线程分别将本地连接和远程连接之间的数据传输进行处理,从而实现本地与远程之间的单向流动。当本地连接关闭时,结束该函数。

  • 3.在主函数中,首先指定远程服务器的IP和端口,然后使用socket创建一个本地服务器监听指定端口,当接收到本地客户端的连接请求时,将其传递给tcp_mapping_request()函数,创建线程进行数据传输。

import socket,threading

# 单向流数据传递
def tcp_mapping_worker(conn_receiver, conn_sender):
    while True:
        try:
            # 接收数据缓存大小
            data = conn_receiver.recv(2048)
        except Exception:
            print("[-] 关闭: 映射请求已关闭.")
            break
        if not data:
            break
        try:
            conn_sender.sendall(data)
        except Exception:
            print("[-] 错误: 发送数据时出错.")
            break
        print("[+] 映射请求: {} ---> 传输到: {} ---> {} bytes"
        .format(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()
        print("[x] 错误: 无法连接到 {}:{} 远程服务器".format(remote_ip,remote_port))
        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

if __name__ == "__main__":
    remote_ip = "8.141.58.64"     # 对端地址
    remote_port = 3389            # 对端端口
    local_ip = "0.0.0.0"          # 本机地址
    local_port = 10050            # 本机端口
    
    local_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    local_server.bind((local_ip, local_port))
    local_server.listen(5)
    print("[*] 本地端口监听 {}:{}".format(local_ip,local_port))
    while True:
        try:
            (local_conn, local_addr) = local_server.accept()
        except Exception:
            local_server.close()
            break
        threading.Thread(target=tcp_mapping_request, args=(local_conn, remote_ip, remote_port)).start()

读者可自行运行上述代码片段,则当用户访问本机地址127.0.0.1:10050则会将数据包自动转发到8.141.58.64:3389端口上,此时如果用户使用远程链接等工具,则可以实现远程桌面链接功能,如下图所示;

标签:remote,socket,Python,端口,21.13,local,远程,conn
From: https://www.cnblogs.com/LyShark/p/17802594.html

相关文章

  • Python学习笔记(一)蒙特卡罗算法求圆周率π
    绪论\(\pi\)(圆周率)是数学和物理学普遍存在的常数之一,可以被定义为圆周长和直径之比或者圆的面积与半径平方之比(\(l=2\pir\)和\(S=\pir^2\))。\(\pi\)是一个无理数,下面将用蒙特卡罗算法求\(\pi\)的数值近似。要求1.要求能算到小数点后面越多越好‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫......
  • 【python基础】repr函数
     描述repr()函数将对象转化为供解释器读取的形式。语法以下是repr()方法的语法:repr(object)参数object--对象。返回值返回一个对象的string格式。实例#coding=UTF-8s="物品\t单价\t数量\n包子\t1\t2"print(s)print(repr(s))output:物品单价数量包子1......
  • 阿基米德螺线和花瓣曲线的Python绘制
    frommatplotlibimportpyplotaspltimportnumpyasnpdefplt_draw_dynamic(x,y):foriinrange(x.shape[0]):plt.pause(0.001)plt.cla()plt.xlim((-200,200))plt.ylim((-200,200))plt.plot(x[:i],y[:i])......
  • python深浅拷贝学习
    copy的原文链接(仅供自己学习查看):python浅析格式化输出和深浅copy-战争热诚-博客园(cnblogs.com) 首先我们从切片技术说起。它应用于所有的序列,包括:列表,字符串,元祖。但是切片不能应用于字典,对于字典只能使用D.copy()和D.deepcopy()方法。下面具体说一下深......
  • Windows根据端口号查询pid并杀死进程
    1、例如现在要查杀8080端口netstat-aon|findstr"8080"可以看到pid是141242、查看该pid进程tasklist|findstr"14124"3、杀死进程taskkill-pid14124-f4、其它方式杀死进程上面找到pid则可以直接通过任务管理器看到进程,在这里更直观吧,然后右键结束就行了。......
  • 带有最小间隔时间的队列读取实现 —— Python异步编程
     (注:照片源自免费网站,地址:https://www.freepik.com/photos/angry-panda/13)  ==================================================   ==================================================......
  • Python求Π
    fromrandomimportrandomfrommathimportsqrtfromtimeimportperf_counterimporttime#进度条print("2022310143117")foriinrange(1,101):print("\r",end="")print("进度:{}%:".format(i),"▓"*(i//......
  • 如何在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1
    安装python3.8.1步骤1:检查Python版本在终端中输入以下命令来检查当前安装的Python版本:python--version步骤2:安装编译Python所需的依赖项更新系统软件包,并安装构建Python所需的一些工具和库。在终端中运行以下命令:sudoaptupdatesudoapt-getinstall-ybuild-essen......
  • 【爬虫实战】用Python采集任意小红书笔记下的评论,爬了10000多条,含二级评论!
    目录一、爬取目标二、爬虫代码讲解2.1分析过程2.2爬虫代码三、演示视频一、爬取目标您好!我是@马哥python说,一名10年程序猿。我们继续分享Python爬虫的案例,今天爬取小红书上指定笔记("巴勒斯坦"相关笔记)下的评论数据。老规矩,先展示结果:截图1:截图2:截图3:共爬取了1w多条"......
  • python求Π
    fromrandomimportrandomfromtimeimportperf_counterpi=0N=100start=perf_counter()forkinrange(N):pi+=1/pow(16,k)*(4/(8*k+1)-2/(8*k+4)-1/(8*k+5)-1/(8*k+6))print('公式法:')print("圆周率值是{}......