DeepSeek Harness 在国内网络下怎么用:代理要设环境变量,哪些请求不走代理
按 DeepSeek Harness 官方文档整理:dsh 不读操作系统的代理设置,只认 HTTP_PROXY、HTTPS_PROXY 这些环境变量,所以常见的情况是浏览器能上、它连不上。讲清变量设在哪里、不支持 SOCKS、哪些地址要直连、哪些请求本来就不走代理,以及怎么验证。
本文根据公开分享整理,本站尚未实测。操作前请对照文末的原始来源。
在需要代理才能访问部分网站的网络里用 DeepSeek Harness,最常见的情况是:浏览器一切正常,它的网页搜索、抓取页面或者模型请求却连不上。
原因在官方文档里写得很清楚:dsh 不读操作系统的代理设置,只认环境变量。 设上这两个就行:
export HTTPS_PROXY=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
地址和端口换成你的代理软件实际监听的 HTTP 端口。dsh 在启动时读取这些变量,所以设完要重新启动它。
下面讲清变量放在哪里、有哪些限制、哪些请求本来就不走代理。
先分清:你需要代理吗
dsh 发出的请求有好几类,不是每一类都要代理:
| 请求 | 一般的情况 |
|---|---|
| 调用 DeepSeek 官方接口 | 国内可以直接访问 |
| 调用国内能直连的中转站 | 不需要代理 |
| 网页搜索、抓取国外的页面 | 看目标网站 |
| 安装插件、从 GitHub 拉代码 | 经常需要 |
这张表是我们按常见情况整理的,不是官方的说法,以你自己的网络为准。
如果你只用 DeepSeek 官方接口或者一家国内能直连的中转站,平时不抓国外页面,可以不设代理。接中转站的办法见DeepSeek Harness 接入中转站。
为什么浏览器走代理,它却不走
官方文档把这一点称为“最常见的意外”,并且说明这不是 dsh 特有的问题:根本不存在一个所有软件都遵循的“系统代理”。 实际上有三套互不相干的机制:
| 机制 | 谁会遵循 |
|---|---|
| 操作系统的代理设置 | Safari、绝大多数 macOS 原生应用、Chrome 和 Edge |
HTTP_PROXY、HTTPS_PROXY 环境变量 |
curl、git、npm、pip,以及 dsh |
| TUN 模式(虚拟网卡) | 所有程序,对应用是透明的 |
代理软件里的“系统代理”开关只写第一套。浏览器读得到,命令行工具永远看不到。所以设环境变量是单独的一步;打开 TUN 模式的话两边都能用,也就不需要变量了。
变量设在哪里
官方给了两个地方:
一、写进 shell 的配置文件。 比如 ~/.zshrc,这样每次运行 dsh 都带着。
二、写进 ~/.dsh/.env。 这是 dsh 自己的环境文件,和 API key 放在一起。两处都有时,导出的环境变量优先。
有一个地方不能设:项目目录里的 .env。官方的解释是,这个文件会跟着 git clone 一起到你电脑上,dsh 宁可拒绝启动,也不让一个仓库来决定你的流量往哪走。
桌面应用
从图形界面启动的程序,一般拿不到你在 shell 配置文件里导出的变量。官方的桌面端说明里写了它的处理:macOS 和 Linux 上,桌面应用在启动后台服务之前,会先运行一次你账户的登录 shell,把 ~/.zprofile、~/.zshrc 这些文件里的变量读进来。
所以在 macOS 上,把那两行写进 ~/.zshrc 之后完全退出再打开桌面应用,它就能读到。注意关掉窗口只是隐藏,不算退出。
Windows 上官方没有写这一段。用系统的“环境变量”设置成用户变量,或者写进 ~/.dsh/.env,后一种办法是官方文档里明确支持的。
代理需要用户名和密码
把它们写进地址里:
export HTTPS_PROXY=http://用户名:密码@proxy.example:8080
官方说明,dsh 自己不会把这个地址显示出来。但要注意下文“它替你运行的命令也拿得到”那一条。
哪些地址让它直连
用 NO_PROXY 列出不走代理的主机,逗号分隔:
export NO_PROXY=internal.example.com,.corp.example.com
官方文档里的规则:
- 写的是主机名,连同它下面所有子域名一起匹配。写
example.com,api.example.com也直连。 - 可以带端口;写
*表示全部直连。 - 写网段不生效。 像
10.0.0.0/8、192.168.0.0/16这种写法,从系统的绕过列表里抄过来不会有任何效果,要改成主机名或域名后缀。 - 不用写
localhost和127.0.0.1,dsh 始终绕过本机地址。
用国内中转站的,把它的域名加进来。 设了代理之后,发给中转站的模型请求默认也会走代理,绕一圈又慢又不稳。比如中转站的接口在 api.koozhan.com,就写:
export NO_PROXY=koozhan.com
这一条是我们按上面的匹配规则给的建议,官方文档里没有专门讲中转站。
几条限制
不支持 SOCKS 代理。 写成 socks5:// 的地址会在启动时被报告并跳过,对应的请求改为直连。官方的建议是把变量指向代理软件的 HTTP 端口,多数软件两种端口都有,而且常常是相邻的端口号。
这一条最容易踩。很多人从别处抄来的是 socks5://127.0.0.1:7891 这样的地址,设上之后 dsh 实际上没有走代理。
只设 ALL_PROXY 也可以。 dsh 会用它给两种协议兜底。不过官方认为明确写 HTTPS_PROXY 更清楚。
公司代理拦截了 HTTPS 时要给它证书。 代理能连上、请求却报证书错误,在启动前把公司的 CA 证书告诉 Node:
export NODE_EXTRA_CA_CERTS=/path/to/corporate-ca.pem
Node 只在进程启动时读这个变量,要在运行 dsh 之前设好。
它替你运行的命令也拿得到这些变量。 官方文档说明,bash 工具里的命令、git、gh,以及作为子进程启动的 MCP 服务器,都会继承代理变量。这带来两点:
- 子进程本身是 Node 程序时,要 Node 22.21 或更高版本才会走代理,旧版本会直连。
- 代理地址里的密码也会被这些命令读到,包括模型自己写的命令。打印环境变量的命令会把密码留在输出里。在意这一点的话,给代理开一个不需要密码的入口。
哪些请求本来就不走代理
官方列了四类,设了代理它们也保持直连:
| 请求 | 说明 |
|---|---|
| 本机上的一切 | localhost、127.0.0.0/8 整段等始终直连 |
| 模型写的代码发出的请求 | 工作流和 Node 运行时进程拿不到代理配置,这是有意的,免得模型的脚本读到可能带密码的代理地址 |
| 使用情况遥测 | 用的是 Node 自带的 HTTP 客户端,直连。连不上只是失败,不影响任何功能 |
| 抓取写成内网 IP 的地址 | 形如 http://10.0.0.5/ 的地址会被直接拒绝,不会交给代理 |
第二条的影响是:让它“写个脚本去请求某个国外接口”,脚本里的请求不会自动走代理,要在脚本里自己配。
遥测可以完全关掉:
export DSH_TELEMETRY_MODE=DISABLED
验证有没有生效
官方给的办法是让它抓一个页面,同时看代理软件的连接日志里有没有这条请求:
dsh --profile headless "fetch https://example.com and tell me the page title"
日志里没有的话,确认变量确实进了 dsh 的环境:
env | grep -i proxy
常见问题
| 现象 | 检查什么 |
|---|---|
| 浏览器能上,dsh 连不上 | 没有设环境变量。代理软件的“系统代理”开关对它不起作用 |
| 设了变量还是不走代理 | 地址是不是 socks5:// 开头;设完有没有重启 dsh |
| 桌面应用读不到变量 | 有没有完全退出再打开;Windows 上改用 ~/.dsh/.env |
| 启动时拒绝运行,提到代理变量 | 是不是把变量写进了项目目录的 .env |
NO_PROXY 里写了网段不管用 |
网段写法不生效,改成主机名或域名后缀 |
| 请求报证书错误 | 公司代理拦截了 HTTPS,设 NODE_EXTRA_CA_CERTS |
| 用了中转站反而变慢 | 中转站的域名没有加进 NO_PROXY,请求绕了代理 |
| 模型写的脚本连不上外网 | 模型写的代码不继承代理,要在脚本里自己配 |