Mitmproxy配置上游代理服务器报错SetServerNotAllowedException求助
解决Mitmproxy设置上游代理时的SetServerNotAllowedException异常
问题分析
你碰到的SetServerNotAllowedException,核心原因是修改上游代理的时机不对。从你贴的代码来看,你在request事件里尝试修改上游,但此时请求已经处于live状态(也就是已经和服务器建立了连接),这时候mitmproxy不允许再切换上游服务器,自然就抛出了异常。
解决方案
我们需要把上游代理的修改逻辑移到请求连接建立的早期阶段,也就是用clientconnect事件来处理,这个阶段还没和目标服务器/上游代理建立连接,是修改上游的安全时机。另外还要注意妥善处理HTTPS的CONNECT请求。
修正后的代码
import mitmproxy from mitmproxy import ctx def clientconnect(flow): # 为所有客户端连接设置统一上游代理 upstream_proxy = ("92.247.125.246", 3128) flow.server_conn.change_upstream_proxy_server(upstream_proxy) ctx.log.info(f"已切换上游代理至: {upstream_proxy}") def request(flow): # 保留你原来的请求主机打印逻辑,跳过CONNECT请求避免冗余输出 if flow.request.method != "CONNECT": ctx.log.info(f"当前请求主机: {flow.request.host}")
关键修改点说明
- 改用
clientconnect事件:这个事件在客户端刚连上mitmproxy时触发,此时还未建立任何下游连接,完全允许修改上游代理配置。 - 调用
flow.server_conn.change_upstream_proxy_server():替换原来的flow.live相关方法,server_conn是专门管理服务器连接的对象,在这个阶段操作完全合规。 - 优化请求日志逻辑:把打印请求主机的逻辑留在
request事件里,同时跳过CONNECT请求,避免日志里出现大量隧道建立的冗余信息。
额外注意事项
- 先确认你的上游代理
92.247.125.246:3128是可用的,并且支持转发HTTP和HTTPS请求(包括CONNECT隧道)。 - 如果你之前禁用了HTTPS证书检查,记得把mitmproxy的根证书安装到浏览器里,不然会出现证书信任错误,影响请求正常转发。
- 要是需要针对特定域名设置不同上游代理,可以在
clientconnect事件里加条件判断,比如:def clientconnect(flow): if "target-domain.com" in flow.request.host: flow.server_conn.change_upstream_proxy_server(("special-proxy.com", 3128)) else: flow.server_conn.change_upstream_proxy_server(("92.247.125.246", 3128))
内容的提问来源于stack exchange,提问作者KaronatoR
相关产品推荐
相关产品推荐

