如何快速又安全的实现端口转发【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)