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

如何用Python实现带认证的多端口代理转发服务?

本地带认证转发代理实现方案(Linux环境)

方案一:基于proxy.py实现轻量转发代理

proxy.py是高性能Python代理框架,支持HTTP/HTTPS/SOCKS代理转发,仅做流量中转不解密HTTPS,无需额外安装证书,适合快速搭建带认证的中转代理。

步骤1:安装依赖

pip install proxy.py

步骤2:自定义转发脚本

创建proxy_forward.py,自动给请求添加外部代理认证信息:

from proxy.http.proxy import HttpProxyBasePlugin
from proxy.http.parser import HttpParser
import base64

class AuthForwardPlugin(HttpProxyBasePlugin):
    def before_upstream_connection(self, request: HttpParser) -> HttpParser:
        # 替换为你的外部代理信息
        PROXY_USER = "your-proxy-username"
        PROXY_PASS = "your-proxy-password"
        self.upstream_host = "proxy.example.com"  # 外部代理IP/域名
        self.upstream_port = 8080  # 外部代理端口

        # 添加Basic认证头
        auth_encoded = base64.b64encode(f"{PROXY_USER}:{PROXY_PASS}".encode()).decode()
        request.add_header(b"Proxy-Authorization", f"Basic {auth_encoded}".encode())
        return request

    def handle_upstream_response(self, response: HttpParser) -> HttpParser:
        return response

if __name__ == "__main__":
    from proxy.http.server import HttpProxyServer
    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument("--port", type=int, required=True, help="本地代理监听端口")
    args = parser.parse_args()

    # 启动本地代理
    server = HttpProxyServer(
        port=args.port,
        plugins=[AuthForwardPlugin],
        # 如果外部是SOCKS5代理,取消下面注释并修改地址
        # upstream_proxy_url="socks5://proxy.example.com:1080"
    )
    server.start()

使用方式

启动多个本地代理实例,每个实例绑定不同端口(对应不同浏览器/外部代理):

# 实例1:本地端口8001
python proxy_forward.py --port 8001
# 实例2:本地端口8002
python proxy_forward.py --port 8002

启动浏览器时指定对应本地代理:

# Chrome示例
google-chrome --proxy-server=http://localhost:8001

方案二:基于Twisted实现异步转发代理

Twisted是成熟的异步网络框架,适合高并发场景下的代理转发,同样无需证书即可完成中转。

步骤1:安装依赖

pip install twisted

步骤2:自定义代理脚本

创建twisted_proxy.py:

from twisted.web import proxy, http
from twisted.internet import reactor
import base64

class AuthProxyClientFactory(proxy.ProxyClientFactory):
    def __init__(self, command, rest, version, headers, data, father):
        super().__init__(command, rest, version, headers, data, father)
        # 替换为外部代理认证信息
        proxy_user = "your-proxy-username"
        proxy_pass = "your-proxy-password"
        auth_str = base64.b64encode(f"{proxy_user}:{proxy_pass}".encode()).decode()
        self.headers["Proxy-Authorization"] = f"Basic {auth_str}"

class AuthProxyRequest(proxy.ProxyRequest):
    proxyClientFactoryClass = AuthProxyClientFactory

class AuthProxy(proxy.Proxy):
    requestFactory = AuthProxyRequest

class ProxyFactory(http.HTTPFactory):
    def buildProtocol(self, addr):
        return AuthProxy()

if __name__ == "__main__":
    import sys
    if len(sys.argv) != 2:
        print("用法: python twisted_proxy.py <本地端口>")
        sys.exit(1)
    local_port = int(sys.argv[1])
    reactor.listenTCP(local_port, ProxyFactory())
    print(f"本地代理已启动,监听端口: {local_port}")
    reactor.run()

使用方式

和方案一一致,启动多个实例绑定不同端口,浏览器指向对应本地端口即可。如果需要对接SOCKS代理,可扩展Twisted的SOCKS客户端逻辑实现。

额外优化建议

  • 随机端口分配:添加自动查找空闲端口的逻辑,避免手动指定端口:
    import socket
    def get_free_port():
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.bind(("", 0))
            return s.getsockname()[1]
    
  • 多实例管理:用shell脚本批量启动不同配置的代理实例,或者用systemd创建服务实现后台运行。
  • 外部代理切换:通过命令行参数传入代理地址和认证信息,无需修改代码即可让不同本地端口对应不同外部代理。

内容的提问来源于stack exchange,提问作者Old Wizard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:00:38