编辑
2025-11-13
环境部署
00

目录

Dify模型代理配置:通过SSRF代理链链接
一、配置目标与架构
1. 核心目标
2. 流量架构
二、详细配置步骤
1. 配置环境变量 (.env 文件)
2. 修改Squid配置模板 (squid.conf.template)
3. 修改Docker Compose配置 (docker-compose.yaml)
三、启动与生效
四、验证配置
1. 测试外部连通性
2. 查看代理日志
五、常见问题与排查
1. 外部连接失败
3. 安全性增强(可选)

Dify模型代理配置:通过SSRF代理链链接

很久没用Dify,新版本代理配置比0.x.x版本变得复杂了些。1.x.x版本后,通过将 Dify 内置的 ssrf_proxy 服务链接到一个上游代理(如 Clash),再让指定域名下的所有外部流量(特别是 plugin_daemon 服务)通过此代理链,可以有效解决OpenAI或者Gemini的api网络访问问题,同时保持配置的灵活性和安全性。

一、配置目标与架构

1. 核心目标

  • 统一出口:为 ssrf_proxy 服务配置一个上游 HTTP 代理,使国外的模型的api域名,经由它的流量都通过这个指定的上游出口。(当然上游这个出口需要你自行代理,且可访问Google,这是前提条件)
  • 域名通配匹配覆盖:让 plugin_daemon 服务的外网网络请求,强制通过 ssrf_proxy,从而实现对插件外部访问的全面代理。
  • 简化配置:在 .env 文件中提供清晰的配置选项,方便用户在不同操作系统(macOSWindowsLinux)上快速设置。

2. 流量架构

代理链条,其流量走向如下:

plugin_daemonssrf_proxy (端口 3128) → 上游HTTP代理 (例如: host.docker.internal:7890) → 互联网

二、详细配置步骤

1. 配置环境变量 (.env 文件)

Difydocker 目录下,修改或创建 .env 文件,添加以下配置段。这些变量用于定义上游代理地址和 plugin_daemon 的代理行为。

bash
# --- 上游代理配置 (用于 ssrf_proxy) --- # 注意: Squid 不支持 SOCKS5 作为上游,请确保使用 HTTP 代理端口。 # macOS/Windows Docker: 使用 host.docker.internal # Linux Docker: 使用宿主机在 Docker 网桥的 IP (如 172.17.0.1) 或实际网卡 IP。 # UPSTREAM_PROXY_HOST=host.docker.internal UPSTREAM_PROXY_HOST=172.17.0.1 UPSTREAM_PROXY_PORT=7890 # --- 插件守护进程出站代理配置 (经由 ssrf_proxy) --- # 默认将插件的所有出站流量路由到内部的 ssrf_proxy 服务。 PLUGIN_HTTP_PROXY=http://ssrf_proxy:3128 PLUGIN_HTTPS_PROXY=http://ssrf_proxy:3128 # 绕过内部服务,防止代理循环。 PLUGIN_NO_PROXY=localhost,127.0.0.1,api,plugin_daemon,ssrf_proxy,sandbox,db,redis,weaviate,nginx

host.docker.internal: 一个特殊的DNS名称,在macOS和Windows的Docker环境中,它会解析为宿主机的内部IP地址,方便容器访问宿主机上的服务。

image.png

或者添加指定域名代理:

image.png

evn
# Upstream proxy for SSRF proxy (HTTP only) # Squid 不支持直接对接 SOCKS5 上游;请使用 Clash 的 HTTP 端口。 # macOS/Windows Docker 主机:host.docker.internal:7890 # Linux Docker 网桥:172.17.0.1:7890(或替换为宿主机实际网卡 IP) # UPSTREAM_PROXY_HOST=host.docker.internal UPSTREAM_PROXY_HOST=172.17.0.1 UPSTREAM_PROXY_PORT=7890 # 需要通过代理访问的域名列表(空格分隔,子域名通配符必须以逗号开头) DOMAINS_BY_PROXY=".jina.ai .googleapis.com .google.com google.dev .openai.com .anthropic.com .github.com .githubusercontent.com .githubassets.com .youtube.com .duckduckgo.com .huggingface.co .dify.ai" # ------------------------------ # Plugin Daemon Outbound Proxy (via SSRF) # ------------------------------ # Squid does NOT support SOCKS5 as upstream. Use an HTTP proxy. # Default routes plugin_daemon outbound traffic via internal SSRF proxy. # If using Clash, HTTP port is typically 7890. # macOS/Windows: set UPSTREAM_PROXY_HOST=host.docker.internal, UPSTREAM_PROXY_PORT=7890 # Linux: set UPSTREAM_PROXY_HOST to your host IP (e.g. 172.17.0.1) or gateway. PLUGIN_HTTP_PROXY=http://ssrf_proxy:3128 PLUGIN_HTTPS_PROXY=http://ssrf_proxy:3128 # Bypass internal services to avoid proxy loops PLUGIN_NO_PROXY=localhost,127.0.0.1,api,plugin_daemon,ssrf_proxy,sandbox,db,redis,weaviate,nginx

2. 修改Squid配置模板 (squid.conf.template)

编辑 docker/ssrf_proxy/squid.conf.template 文件,以强制 Squid 服务使用我们定义好的上游代理。

首先,在文件靠前的位置(http_access 规则定义区域)添加以下规则,以允许所有转发请求通过:

bash
# 允许所有目标地址的转发代理请求 (将通过上游代理路由) http_access allow all

image.png

接着,找到原有的 cache_peer 注释部分,并将其替换为以下内容,使其从环境变量中读取上游代理配置,并强制所有流量走代理:

配置方式一:全局代理 —— 所有流量强制通过上游代理

bash
# --- 上游代理配置 --- # 注意: Squid 不支持直接对接 SOCKS5 上游;如使用 Clash,请使用其 HTTP 端口(通常为 7890)。 # 通过环境变量配置上游代理的主机与端口 cache_peer ${UPSTREAM_PROXY_HOST} parent ${UPSTREAM_PROXY_PORT} 0 no-query no-digest no-netdb-exchange default # 强制所有请求都通过上游代理,从不直接连接 never_direct allow all

配置二(推荐):选择性代理 —— 仅特定域名走上游代理,其他流量直连

sh
cache_peer ${UPSTREAM_PROXY_HOST} parent ${UPSTREAM_PROXY_PORT} 0 no-query no-digest no-netdb-exchange default acl external_domains dstdomain ${DOMAINS_BY_PROXY} never_direct allow external_domains cache_peer_access ${UPSTREAM_PROXY_HOST} allow external_domains cache_peer_access ${UPSTREAM_PROXY_HOST} deny all

若采用配置二,则需要额外配置 DOMAINS_BY_PROXY.env 文件中,以及 ssrf_proxy 服务

image.png

3. 修改Docker Compose配置 (docker-compose.yaml)

编辑 docker/docker-compose.yaml 文件,将环境变量注入到相应的服务中。

首先,为 ssrf_proxy 服务添加环境变量,使其能接收上游代理的配置:

yaml
services: ssrf_proxy: # ... 其他配置 ... environment: # ... 其他SSRF变量 ... UPSTREAM_PROXY_HOST: ${UPSTREAM_PROXY_HOST:-host.docker.internal} UPSTREAM_PROXY_PORT: ${UPSTREAM_PROXY_PORT:-7890}

image.png

然后,为 plugin_daemon 服务添加代理环境变量,确保其所有外部请求都指向 ssrf_proxy。这里同时注入大小写两套变量以兼容不同工具库的读取规则。

yaml
plugin_daemon: # ... 其他配置 ... environment: # ... 其他变量 ... # 通过内部 ssrf_proxy 为插件守护进程配置出站代理 HTTP_PROXY: ${PLUGIN_HTTP_PROXY:-http://ssrf_proxy:3128} HTTPS_PROXY: ${PLUGIN_HTTPS_PROXY:-http://ssrf_proxy:3128} NO_PROXY: ${PLUGIN_NO_PROXY:-localhost,127.0.0.1,api,plugin_daemon,ssrf_proxy,sandbox,db,redis,weaviate,nginx} http_proxy: ${PLUGIN_HTTP_PROXY:-http://ssrf_proxy:3128} https_proxy: ${PLUGIN_HTTPS_PROXY:-http://ssrf_proxy:3128} no_proxy: ${PLUGIN_NO_PROXY:-localhost,127.0.0.1,api,plugin_daemon,ssrf_proxy,sandbox,db,redis,weaviate,nginx}

image.png

同样的,给api服务加上:

image.png

给sandbox加上:

image.png

三、启动与生效

修改完配置文件后,需要重启相关服务以应用变更。推荐使用 --force-recreate 参数确保容器使用最新的环境变量和配置。

docker/ 目录下执行:

bash
# 重启 ssrf_proxy 和 plugin_daemon 服务 docker compose up -d --no-deps --force-recreate ssrf_proxy plugin_daemon

如果希望 apisandbox 服务也立即应用最新的 ssrf_proxy 行为,可以一并重启它们:

bash
# (可选)一并重启 api 和 sandbox docker compose up -d --no-deps --force-recreate api sandbox

四、验证配置

1. 测试外部连通性

plugin_daemon 容器内部尝试访问一个需要代理的外部地址,例如 OpenAI 的API。

bash
docker compose exec plugin_daemon curl -sI https://api.openai.com/v1/models

如果网络路径正常,你将收到一个 HTTP/2 401 (未授权) 或其他非连接错误的响应,这表明请求已成功通过代理到达目标服务器。

2. 查看代理日志

实时观察 ssrf_proxy 的日志,确认流量是否按预期转发到了上游代理。

bash
docker compose logs -f ssrf_proxy

日志中应出现类似 TCP_TUNNEL/200 的记录,并且目标地址是你正在访问的外部服务。

image.png

测试添加一下OpenAI:

image.png

测试添加一下gemini:

image.png

A社试一下:

image.png

插件升级一下:

image.png

知识库测试下:

image.png

五、常见问题与排查

1. 外部连接失败

  • 检查上游代理:确保你的上游代理(如 Clash)已开启 HTTP 代理端口,并且其 allow-lan(允许局域网连接)选项已开启,允许来自 Docker 网段(如 172.17.0.0/16)的访问。
  • 测试代理连通性:在 ssrf_proxy 容器内部直接测试上游代理是否可用:
    bash
    docker compose exec ssrf_proxy curl -x http://<UPSTREAM_PROXY_HOST>:<UPSTREAM_PROXY_PORT> https://www.google.com -I

2. 内部服务请求异常

  • 检查 NO_PROXY 配置:如果 Dify 内部服务之间的通信出现问题,请检查 PLUGIN_NO_PROXY 环境变量是否包含了所有内部服务的容器名称(或别名)。

3. 安全性增强(可选)

  • 收紧访问控制:默认配置允许 ssrf_proxy 访问所有外部地址。如果希望增强安全性,可以在 squid.conf.template 中使用 ACL(访问控制列表)来创建域名白名单,仅允许访问特定的模型供应商。
    bash
    # 示例:定义模型供应商域名白名单 acl model_providers dstdomain .openai.com .google.com .googleapis.com .anthropic.com http_access allow model_providers http_access deny all # 拒绝其他所有请求

核心配置总结

文件关键变量/配置作用
.envUPSTREAM_PROXY_HOST
UPSTREAM_PROXY_PORT
定义 ssrf_proxy 使用的上游 HTTP 代理服务器地址和端口。
.envPLUGIN_HTTP_PROXY
PLUGIN_HTTPS_PROXY
PLUGIN_NO_PROXY
指示 plugin_daemon 服务通过 ssrf_proxy 访问外部网络,并配置内部服务免代理。
squid.conf.templatecache_peer
never_direct allow all
强制 Squid 将所有外部请求通过定义好的上游代理进行转发。
docker-compose.yamlenvironment 配置.env 文件中定义的变量注入到 ssrf_proxyplugin_daemon 容器中。