Dify 连接 MCP Server 报 403 Forbidden 是怎么回事?
“
最近在给 Dify 接入 MCP Server 时,遇到了一个让人摸不着头脑的报错。控制台日志一片红,关键信息只有一行:
httpx.ProxyError: 403 Forbidden。本文记录排查过程与解决方案,希望能帮到遇到同样问题的你。
问题现场
在 Dify 控制台添加 MCP 工具提供商(POST /console/api/workspaces/current/tool-provider/mcp/auth)时,后台抛出以下异常:
api-1 | ERROR [sse_client.py:300] - Error connecting to SSE endpoint
...
httpcore.ProxyError: 403 Forbidden
The above exception was the direct cause of the following exception:
...
httpx.ProxyError: 403 Forbidden
完整的调用栈显示,错误发生在 sse_client.py 的 ssrf_proxy_sse_connect 调用处:
File "/app/api/core/mcp/client/sse_client.py", line 286, in sse_client
with ssrf_proxy_sse_connect(
根本原因:SSRF 防护代理
这个错误并不是 MCP Server 本身的问题,而是被 Dify 内置的 SSRF(服务端请求伪造)防护代理拦截了。
Dify 在架构上内置了一个基于 Squid 的代理服务,所有从 API 容器发出的 HTTP 请求都必须经过这个代理过滤。这是一种安全机制,用于防止攻击者通过构造恶意 URL,让服务器去访问内网资源(即 SSRF 攻击)。
当你在控制台填写 MCP Server 的 SSE 地址并点击保存时,Dify 会尝试通过 SSE 协议建立连接。这个请求经过 SSRF 代理时,如果目标地址在黑名单内,代理就会直接返回 403 Forbidden,连接失败。
哪些情况会触发 403?
| 场景 | 原因 |
|---|---|
MCP Server 部署在 localhost 或 127.0.0.1 |
代理默认封锁回环地址 |
MCP Server 使用内网 IP(192.168.x.x、10.x.x.x、172.16~31.x.x) |
代理默认封锁私有网段 |
| MCP Server 域名解析到上述任意 IP | 即使用域名访问也会被拦截 |
| SSRF 代理服务本身配置异常 | 可能连公网请求也会被误拦截 |
解决方案
方案一:在 Squid 配置中添加白名单(推荐)
这是最精准的做法,只放行必要的地址,不影响整体安全策略。
找到 Dify 项目目录下的 Squid 配置文件:
docker/ssrf_proxy/squid.conf
在文件中加入以下规则(根据实际情况修改 IP 或域名):
# 允许访问内网 MCP Server
acl mcp_server dst 192.168.1.100
http_access allow mcp_server
# 或者按域名放行
acl mcp_domain dstdomain mcp.your-domain.com
http_access allow mcp_domain
修改完成后,重启 ssrf_proxy 容器:
docker compose restart ssrf_proxy
方案二:禁用 SSRF 代理(仅适用于内网/测试环境)
在 Dify 的 .env 文件中,将 SSRF 代理环境变量清空:
SSRF_PROXY_HTTP_URL=
SSRF_PROXY_HTTPS_URL=
然后重启 API 服务:
docker compose restart api
“
⚠️ 注意:此方案会完全禁用 SSRF 防护,存在安全风险,不建议在公网生产环境使用。
方案三:确认 MCP Server 的公网可达性
如果你的 MCP Server 已经有公网域名,先逐项排查以下几点:
-
域名 DNS 解析是否正常( nslookup your-mcp-domain.com) -
对应端口是否已在防火墙/安全组中开放 -
MCP Server 的 SSE 端点(通常是 /sse)是否能直接从浏览器或curl正常访问
curl -N https://your-mcp-domain.com/sse
如果以上均正常,但仍然 403,说明是代理配置问题,回到方案一处理。
快速排查清单
□ MCP Server URL 是否使用了 localhost / 127.0.0.1?
□ MCP Server 是否部署在私有 IP 网段?
□ ssrf_proxy 容器是否正常运行?(docker compose ps)
□ squid.conf 是否有对应的 ACL 白名单规则?
□ 修改配置后是否重启了 ssrf_proxy?
小结
Dify 连接 MCP Server 报 403 Forbidden 的核心原因,几乎都指向同一个地方:内置的 SSRF 防护代理拦截了请求。理解这一点之后,解决思路就很清晰了——要么给目标地址加白名单,要么在可控环境中禁用代理。
希望这篇文章能帮你少走弯路。如果有其他 Dify 踩坑经历,欢迎交流。
