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.pyssrf_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 部署在 localhost127.0.0.1 代理默认封锁回环地址
MCP Server 使用内网 IP(192.168.x.x10.x.x.x172.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 已经有公网域名,先逐项排查以下几点:

  1. 域名 DNS 解析是否正常(nslookup your-mcp-domain.com
  2. 对应端口是否已在防火墙/安全组中开放
  3. 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 踩坑经历,欢迎交流。