当前位置: 首页 > news >正文

Dify Docker 连接宿主机 MCP 服务 403 排障指南

Dify Docker 连接宿主机 MCP 服务 403 排障指南

问题场景

  • Dify通过 Docker Compose 部署在宿主机
  • MCP 服务(如 searXNG-mcp)运行在宿主机,监听0.0.0.0:3456
  • 宿主机本地测试 MCP 服务正常
  • Dify 界面添加 MCP 服务时报错:
Failed to connect to MCP server: code=403 message="Client error '403 Forbidden' for url http://192.168.31.184:3456/mcp"

根因分析

Dify 的 docker-compose 中包含一个ssrf_proxy容器(基于 Squid),用于防止 SSRF 攻击。Squid 配置中默认拦截所有内网 IP 段的请求:

  • squid.conf.template第 13 行:http_access deny to_private_networks
  • to_private_networksACL 包含192.168.0.0/16,宿主机 IP192.168.31.184被命中

Dify 内部发出的外部请求走ssrf_proxy:3128代理,因此 MCP 请求在到达宿主机前被 Squid 拦截返回 403。

关键文件

文件作用
docker/ssrf_proxy/squid.conf.template主配置模板,第 12 行 include 白名单,第 13 行 deny 私网
docker/ssrf_proxy/docker-entrypoint.sh入口脚本,读取环境变量动态生成白名单
.envDify 环境变量配置文件

入口脚本白名单机制

docker-entrypoint.sh第 55 行:

write_optional_private_allowlist"SSRF_PROXY_ALLOW_PRIVATE_IPS""dify_allowed_private_networks""dst"

该函数读取SSRF_PROXY_ALLOW_PRIVATE_IPS环境变量(逗号分隔的 IP 列表),动态生成/etc/squid/dify_allow_private.conf,内容格式:

acl dify_allowed_private_networks dst 192.168.31.184 http_access allow client_localnet dify_allowed_private_networks

该文件在deny to_private_networks之前被 include,因此匹配的请求会被提前放行。

解决步骤

第一步:确保 MCP 服务绑定 0.0.0.0

部分 MCP 服务默认绑定127.0.0.1,来自外部(包括 Docker)的请求无法到达。

mcp-searxng 示例:

dockerrun--rm-p3456:3000\-eMCP_HTTP_PORT=3000\-eMCP_HTTP_HOST=0.0.0.0\-eSEARXNG_URL=http://192.168.31.184:8080\isokoliuk/mcp-searxng:latest

验证:

netstat-ano|findstr :3456# 应显示 0.0.0.0:3456 或 [::]:3456,而非 127.0.0.1:3456

第二步:配置 SSRF 代理白名单

在 Dify 的.env文件中添加:

SSRF_PROXY_ALLOW_PRIVATE_IPS=192.168.31.184

多个 IP 用逗号分隔:

SSRF_PROXY_ALLOW_PRIVATE_IPS=192.168.31.184,192.168.31.185

第三步:完整重启 Dify(必须)

dockercompose downdockercompose up-d

重要:不能使用docker compose restart ssrf_proxyrestart不会重新读取.env文件的环境变量,白名单配置不会生效。

第四步:验证代理链路

# 测试直连(不走代理)dockerexec-itdocker-api-1curl-vhttp://192.168.31.184:3456/mcp# 测试代理链路(走 ssrf_proxy)dockerexec-itdocker-api-1curl-v--proxyhttp://ssrf_proxy:3128 http://192.168.31.184:3456/mcp

预期结果:两条命令都应返回HTTP/1.1 400 Bad Request+"Invalid or missing session ID"

  • 400是 MCP 服务正常响应(curl 未携带 MCP 协议头)
  • 如果仍返回403 Forbidden+ERR_ACCESS_DENIED,说明环境变量未生效

排障方法论

宿主机 curl → MCP 服务 → 确认服务可用 Dify 容器 curl 直连 → MCP 服务 → 确认网络通 Dify 容器 curl 代理 → MCP 服务 → 确认 SSRF 代理是否拦截
  1. 先确认宿主机自身能访问 MCP 服务
  2. docker exec进入容器测试直连(排除 Docker 网络问题)
  3. --proxy参数测试代理链路(定位 SSRF 拦截)
  4. 查看 Squid 日志:docker logs docker-ssrf_proxy-1

常见错误码速查

响应含义
400 Bad RequestMCP 服务正常(curl 未带 Session ID)
403 ERR_ACCESS_DENIEDSSRF 代理拦截,检查白名单配置
Connection refused端口未监听或防火墙阻断
Could not resolve hostDNS 解析失败,检查 IP 是否正确
http://www.jsqmd.com/news/1294430/

相关文章:

  • AI渠道转化率暴跌37%?揭秘头部企业正在隐藏的5个效益评估盲区
  • 2026年AI论文写作神器大揭秘,这几款让你告别论文难产
  • 没考上高中还有什么出路?武汉智工职业技术学校升学路径解析 - 武汉中职最新信息发布
  • 黄埔区技术强的装修公司大揭秘!速看! - 资讯速览
  • GEO优化公司哪家好?从诊断、监控、内容和服务看怎么选 - 凡科杰建云
  • RK平台USB的host设备和device设备有什么不同
  • AI魔法书:儿童AI启蒙教育的创新实践
  • oracle 中最常用的函数(日期函数)
  • 【EF Core】使用外部 Model
  • Axure RP中文语言包:3分钟让你的原型设计软件说中文
  • 2026安徽省合肥共达复读班在哪里上课?是校内还是机构?招办联系方式是? - 最新资讯
  • 除湿机选购指南:核心技术指标解析与美的CF50BD真实评测
  • 2026 上饶非急救长途转运正规救护车赣浙皖闽四省跨省护送服务 - 趣闻早乐评
  • 2026郑州正规马桶疏通|家用马桶堵水、异物卡顿、返臭渗水24小时上门靠谱推荐 - 资讯速览
  • 终极Evernote笔记备份方案:5分钟掌握完整本地备份技术
  • 宜宾市天车龙门吊行车吊机起重机采购销售维修安装维保改造本地厂家全指南 - 便民获客通
  • [特殊字符] KIMI K3 正式发布!百万级上下文+推理天花板,国产大模型再破纪录!
  • 宠物食品研发数字化转型白皮书|璞华易研拆解精准营养赛道的研发困局与破局路径
  • 物理学十大思想实验与悖论:从芝诺到黑洞信息悖论
  • WeChatMsg终极指南:如何永久备份你的微信聊天记录
  • 2026年实力之选:江苏景区苹果仓专业制造商山东易折叠智能技术有限公司 - 企业推荐官【官方】
  • 洛阳2026家里房子漏水怎么办?市面上多种方案可选择,哪种最适合自己?专业防水公司免费上门为您评估,家里漏水不再愁! - 吉林同城获客
  • Adrenaline完整指南:让PS Vita变身PSP游戏机的终极固件
  • Kimi K3架构解读 为什么Moonshot选择了不同的技术路线
  • Fan Control:Windows平台专业级风扇控制解决方案
  • 2026实测:专业AI智能降重工具TOP1推荐 - 降AI小能手
  • 上海热门的保研英语辅导公司怎么选更靠谱 - 品牌优推
  • [特殊字符] CNSH × 龍魂系统 · 公开透明治理架构术语总表 v2.0 《Chinese-Native Sovereign Semantic Architecture》
  • AI音乐多轨混音落地难题全解(2024最新实测数据+Pro Tools/Ableton/Adobe Audition三平台对比)
  • 2026 南京正规管道疏通 同城 24 小时上门靠谱推荐 - 资讯速览