# 为Dify 的 ssrf_proxy 配置上游代理
在使用 Dify 过程中,可能会遇到需要通过代理服务器来访问外部网络的场景。Dify 使用 ssrf_proxy(Squid ) 来提升sandbox的安全性。通过配置 Squid 代理,可以方便地实现这一需求。在本文中,我们将介绍如何通过配置 Squid 的 cache_peer 和 never_direct 指令,实现所有 HTTP 请求都通过上游代理转发的目标。
#### 什么是 Squid?
Squid 是一款流行的代理服务器软件,它能够缓存 HTTP、FTP 等协议的请求,减少带宽消耗并提升访问速度。Squid 还可以充当代理服务器,将用户的请求转发给上游代理,从而为应用程序提供额外的隐私和控制功能。在配置 Dify 的 `ssrf_proxy` 服务时,我们可以利用 Squid 将 HTTP 请求通过上游代理进行转发。
#### 需求背景
在配置 `ssrf_proxy` 时,我们需要让 HTTP 请求通过 Squid 代理服务器的上游代理进行访问,避免直接访问外部网络。通过配置 Squid 的 `cache_peer` 和 `never_direct` 指令,我们可以轻松实现这个目标。
#### 配置步骤
##### 1. 打开 Squid 配置文件
在 Dify 的 Docker 配置目录中,找到 `squid.conf.template` 文件。这个文件位于 `dify/docker/` 目录下。使用任意文本编辑器打开此文件,准备进行修改。
```bash
cd dify/docker/ssrf_proxy
nano squid.conf.template
```
##### 2. 配置 `cache_peer`
`cache_peer` 指令用于指定 Squid 代理的上游代理服务器。基本语法如下:
```bash
cache_peer <hostname> <type> <http-port> <icp-port> [options]
```
- `<hostname>`:上游代理服务器的主机名或 IP 地址。
- `<type>`:代理类型,通常为 `parent`,表示这是一个上游代理。
- `<http-port>`:上游代理服务器的 HTTP 端口(如 3128)。
- `<icp-port>`:ICP 端口,如果不需要可以设置为 0。
- `[options]`:额外的选项,如 `no-query` 禁用 ICP 查询,`default` 设为默认上游代理。
例如,如果你的上游代理的 IP 地址为 `192.168.1.100`,HTTP 端口为 `3128`,则可以这样配置:
```bash
cache_peer 192.168.1.100 parent 3128 0 no-query default
```
此配置将所有请求发送到位于 `192.168.1.100` 的上游代理,并禁用了 ICP 查询功能。
##### 3. 添加 `never_direct allow all`
为了确保 Squid 代理始终通过上游代理转发请求,而不直接连接外部网络,我们需要在配置文件中添加 `never_direct allow all` 指令。这一指令强制所有请求都通过上游代理处理。
在 `squid.conf.template` 文件的合适位置(通常在 `cache_peer` 指令附近)添加以下内容:
```bash
never_direct allow all
```
##### 4. 完整配置示例
在完成上述步骤后,`squid.conf.template` 文件的完整配置可能如下所示:
```bash
# 定义上游代理
cache_peer 192.168.1.100 parent 3128 0 no-query default
# 禁止直接连接,强制使用上游代理
never_direct allow all
```
##### 5. 保存并重启服务
在完成配置后,保存文件并退出编辑器。然后,重新启动 Dify 及其 `ssrf_proxy` 服务,以应用新的 Squid 配置。你可以使用如下命令重启服务:
```bash
docker-compose down
docker-compose up -d
```
通过这种方式,你的 Squid 代理服务器就会将所有请求都转发给配置的上游代理,而不会直接访问目标服务器。
#### 结论
通过配置 `cache_peer` 和 `never_direct allow all`,我们可以强制 Squid 代理服务器将所有 HTTP 请求都通过上游代理转发。这种配置非常适合需要通过特定代理进行网络访问的场景,尤其是在企业网络或需要遵守特定网络策略的环境中。
希望这篇文章能帮助你顺利完成 Dify 的 `ssrf_proxy` 服务配置。如果你有任何疑问或进一步的需求,欢迎在评论区留言交流!