尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Dify Docker 连接宿主机 MCP 服务 403 排障指南
📅 发布时间:2026/7/30 15:15:01

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_proxy。restart不会重新读取.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 是否正确

相关新闻

  • 2026年AI论文写作神器大揭秘,这几款让你告别论文难产
  • 2026郑州正规马桶疏通|家用马桶堵水、异物卡顿、返臭渗水24小时上门靠谱推荐 - 资讯速览
  • 【EF Core】使用外部 Model

最新新闻

  • 消防水池就地液位显示装置怎么安装 - 水位监测系统观察员
  • AI驱动的漏洞管理平台:架构设计与工程实践
  • 2026 年程序员拿 Offer,AI 协作的权限与日志才是“隐形门槛”
  • 珠海配电柜回收华南回收行业避坑科普 - 广东再生资源回收
  • 3步掌握AMD Ryzen终极硬件调试工具:SMUDebugTool完全指南
  • 2026 伊春非急救长途转运正规救护车黑吉辽蒙四省跨省护送服务 - 趣闻早乐评

日新闻

  • 终极TeamSpeak3音乐机器人搭建指南:5分钟实现语音聊天室音频播放
  • 广州海珠区内搬家攻略,平价靠谱搬家服务商推荐,专业打包搬运省心避坑全流程指南 - 厚道搬家
  • 大语言模型入门指南:从零到精通掌握AI核心技术的5大步骤

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号