当前位置: 首页 > article >正文

如何快速又安全的实现端口转发【Windows MAC linux通用】

背景

有很多程序是在虚拟机上运行的,返回的url 又是127.0.0.1。在个人电脑上调试需要解决这个问题。端口转发是一个不错的方法

可能的解决办法:

1.修改程序,返回虚拟机的ip (要改代码,换虚拟机还要再改代码)

2.在中间加个nginx(需要额外部署服务)

3.在个人电脑上用本文的脚本,快速开启一个端口转发。把访问127.0.0.1的流量转发到虚拟机上(本文)

本文方法的优势:

1.快速,转发的目的ip和端口方便修改

2.代码公开,安全干净

3.只依赖python3 ,无python三方包依赖

4.windows linux MAC 通用,国产系统国产CPU也能用

本文的不足:

1.需要安装python3

2.本脚本只实现了tcp,未实现udp

正文
依赖:python3

请在电脑上提前安装好python3

适用范围

Windows,MAC,linux都通用

运行此脚本快速实现端口转发

执行如下命令即可实现

python   本脚本.py
或
python3  本脚本.py

脚本正文

import socket
import threading

# 转发数据的函数
def forward_data(source, destination):
    while True:
        try:
            data = source.recv(4096)  # 从源读取数据
            if not data:
                break
            destination.sendall(data)  # 将数据发送到目标
        except Exception as e:
            print(f"Error forwarding data: {e}")
            break

# 处理客户端连接的函数
def handle_client(client_socket, target_host, target_port):
    try:
        # 连接到目标地址
        target_socket = socket.create_connection((target_host, target_port))
        print(f"Connected to target {target_host}:{target_port}")

        # 创建两个线程分别转发数据
        thread1 = threading.Thread(target=forward_data, args=(client_socket, target_socket))
        thread2 = threading.Thread(target=forward_data, args=(target_socket, client_socket))
        thread1.start()
        thread2.start()

        # 等待线程结束
        thread1.join()
        thread2.join()
    except Exception as e:
        print(f"Connection error: {e}")
    finally:
        client_socket.close()
        target_socket.close()
        print("Connection closed")

# 主程序
def start_proxy(listen_port, target_host, target_port):
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 也可改为 127.0.0.1
    server.bind(("0.0.0.0", listen_port))
    server.listen(5)
    print(f"Listening on port {listen_port} and forwarding to {target_host}:{target_port}")

    while True:
        client_socket, addr = server.accept()
        print(f"Accepted connection from {addr}")
        client_handler = threading.Thread(target=handle_client, args=(client_socket, target_host, target_port))
        client_handler.start()

if __name__ == "__main__":
    #  本地127.0.01监听的端口(TCP)
    LISTEN_PORT = 8090
    #  目标地址和目标端口(TCP)
    TARGET_HOST = "10.9.0.8"
    TARGET_PORT = 8081

    start_proxy(LISTEN_PORT, TARGET_HOST, TARGET_PORT)


http://www.kler.cn/a/457279.html

相关文章:

  • 深入浅出 Spring (二)| 依赖注入(DI)、自动装配
  • 纯前端实现将pdf转为图片(插件pdfjs)
  • Postman测试big-event
  • 操作系统的用户空间与内核空间
  • html5css3
  • 打印进度条
  • yolov8算法及其改进
  • Golang的文件加密工具
  • Word批量更改题注
  • Pytorch | 利用DTA针对CIFAR10上的ResNet分类器进行对抗攻击
  • 问题-01
  • 学习C++:数据类型
  • Jmeter录制https请求
  • 在asp.net webapi项目中 将数据库连接字符串写在配置文件中,及Program配置Serilog存放路径以及设置
  • JavaWeb期末复习
  • Wordly Wise 3000 国际背单词01 介绍 + 测词汇量
  • 【Beats01】企业级日志分析系统ELK之Metricbeat与Heartbeat 监控
  • Python 占位符详细笔记
  • C语言的数据结构
  • vue3 video 播放rtmp视频?(360浏览器支持)
  • mysql系列7—Innodb的redolog
  • 分布式版本管理工具——git中分支的相关知识
  • Webpack在Vue CLI中的应用
  • 7.即时通讯
  • 深度学习中batch_size
  • MySQL并发问题区别-MVCC如何解决的