如何用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
相关产品推荐
相关产品推荐

