先看失败发生在哪一段,再看错误关键词
dial tcp 只是“尝试建立 TCP 连接”,不是故障原因。真正需要读的是它后面的地址、端口和末尾错误。i/o timeout 表示某次网络读写等待超时;no such host 表示当前解析链路未能得到可用的主机地址。三个词不能直接分别等同于“节点坏了”“网络慢”“换 DNS”。
一次代理请求通常经过“应用 → 本地代理入口 → 规则与策略组 → 节点服务器 → 目标站点”。DNS 查询可能出现在节点域名解析、目标域名解析等不同环节。先认出失败地址属于哪一段,才能决定该改本地端口、节点选择还是 DNS 配置。
用一次请求留下最小排查记录
- 打开客户端的「日志」页,记下发生时间;界面名称可能是「运行日志」或「Logs」。
- 记录当前模式、启用的配置名称、策略组实际选中的节点,以及系统代理、TUN 的开关状态。
- 临时将日志等级设为
debug,只重现一次失败。排查结束改回info,避免日志持续膨胀。 - 保留同一时间附近的匹配规则、出口选择和最终错误,不要只截取一个红色关键词。
常见报错对照:先定位,再动配置
| 日志末尾或关键词 | 直接含义 | 先检查什么 |
|---|---|---|
connection refused | 连接被主动拒绝 | 被连接地址、端口是否正确,服务是否监听 |
i/o timeout | 网络操作超过等待时间 | 超时属于 DNS、节点连接还是目标响应 |
no such host | 域名未解析成功 | 具体域名、拼写及所用解析链路 |
address already in use | 本地监听地址已被占用 | 冲突端口及占用进程 |
network is unreachable | 当前网络缺少可用路由 | IPv4/IPv6 路由、网卡和隧道状态 |
certificate has expired | 证书有效期检查失败 | 系统时间、节点证书及服务端维护情况 |
一条报错也可能包含多层原因,例如外层写着 dial failed,内层才出现 DNS 查询超时。阅读顺序应当从最内层的具体错误开始,再向外确认是哪条连接触发了它。
dial tcp 与 connection refused:先认清连接对象
dial tcp 192.0.2.10:443: connect: connection refused
这段日志表示向 192.0.2.10:443 建立 TCP 连接时被拒绝。常见原因是服务未启动、端口写错,或网络设备主动拒绝连接。如果这个地址属于节点服务器,先核对当前节点的 server 与 port;如果它属于直连目标,就检查规则是否把请求送到了 DIRECT。
出现 127.0.0.1 时,优先查本地入口
Failed to connect to 127.0.0.1 port 7890: Connection refused
这类信息也可能来自浏览器或命令行工具,而非 Clash 日志。它通常说明应用连不到本机代理入口:内核未运行、入口端口改变,或者应用仍使用旧端口。先打开客户端的端口设置,确认实际监听端口,再核对系统代理中的地址和端口。
mixed-port: 7890:同一端口接受 HTTP 代理和 SOCKS 代理流量。port:HTTP 代理入口;socks-port:SOCKS 代理入口,不能只凭端口数字猜协议。external-controller:控制接口,不是浏览器应使用的代理入口。
例如控制接口为 127.0.0.1:9090,不代表系统代理应该填 9090。入口配置与控制接口混用,可能表现为连接失败、异常响应或无法加载网页。
i/o timeout:把 DNS、节点和目标站点分开测
i/o timeout 只说明某个网络操作没在期限内完成。它可能发生于 DNS 的 UDP 查询、连接节点服务器,也可能发生于已连接后的读写过程。只看到这个词就连续更换十几个节点,很容易把真正的本地网络问题藏起来。
第一步:用明确代理入口复现
如果实际混合端口为 7890,可执行下面的命令。Windows PowerShell 使用 curl.exe,避免部分环境将 curl 解释为其他命令;macOS 与 Linux 通常使用 curl。
curl -I -v --connect-timeout 10 --max-time 20 --proxy http://127.0.0.1:7890 https://example.com/
这里的 10 秒是连接阶段上限,20 秒是整次操作上限,不是内核的默认超时值。-I 发送 HEAD 请求,服务器可能返回 405;只要收到了有效 HTTP 响应,就不能把这个状态码当成网络超时。需要查看正文时可移除 -I。
第二步:只改变一个变量
- 保持目标网址和规则不变,只在同一策略组切换一个已知可用的节点,再重复请求。
- 保持节点不变,换另一个允许访问的目标。只有一个目标失败时,优先看目标侧限制或对应规则。
- 保持客户端配置不变,换手机热点测试。热点正常、原网络失败,才有依据继续查原网络的路由或过滤。
延迟测试按钮成功不等于所有网页可用。测试 URL、HTTP 状态要求和实际业务目标可能不同;同样,测试失败也不必然证明节点完全不可用。应当用发生故障的实际请求交叉验证。
no such host:先确定是哪个域名解析失败
lookup node.example.net: no such host
这条信息里的域名若是节点的 server,说明代理通道还没建立。此时先查节点域名的拼写、订阅是否过期或被服务商替换,再查节点域名使用的解析路径。如果报错指向目标网站,则需要检查目标解析与匹配规则,不能直接认定订阅失效。
按顺序检查三个位置
- 地址本身:确认
server不是带有https://、路径或尾部空格的整段 URL。该字段通常应是主机名或 IP 地址。 - 系统解析:执行
nslookup node.example.net。这里的域名仅作格式示例,测试时换成日志中的真实域名,并注意查询会发送给所用解析器。 - 内核解析:核对实际生效配置的
dns段,观察同一时间是否出现解析器连接超时或拒绝连接。
nslookup 的结果只能作为对照,不能证明内核 DNS 一定正常。系统解析器、Clash 内置 DNS、浏览器安全 DNS 可能走三条不同路径;TUN 的 DNS 劫持也会改变查询路径。
若设置“通过代理访问的加密 DNS”,而代理节点域名又必须依靠该 DNS 才能解析,就可能形成启动依赖环。应先建立可达的节点域名解析路径,而不是把所有 DNS 请求统一强制送入尚未建立的代理。
address already in use:本地端口冲突怎么查
listen tcp 127.0.0.1:7890: bind: address already in use
这是本地监听失败,和节点套餐、远端域名无直接关系。常见场景是另一个代理客户端已经启动,或者旧内核进程退出不完整。先确认占用者,再决定关闭旧进程还是修改端口,不要直接结束不认识的系统进程。
Windows:定位监听进程
netstat -ano | findstr :7890
tasklist /FI "PID eq 1234"
第一条命令会显示包含该端口的记录,应核对本地地址、LISTENING 状态与 PID。第二条里的 1234 是示例进程号,执行时使用查询得到的实际 PID。仅有连接记录,并不一定代表该程序占用了监听入口。
macOS / Linux:查看监听者
lsof -nP -iTCP:7890 -sTCP:LISTEN
Linux 若未安装 lsof,可尝试 ss -ltnp 'sport = :7890'。进程信息可能需要额外权限才能显示。若决定把混合端口从 7890 改为 7891,系统代理、浏览器扩展、终端环境变量与其他手动配置的应用入口都要同步更新。
界面显示“已启动”也不代表每个入口都成功监听。检查启动后的日志,确认报错涉及的是 mixed-port、DNS 监听端口还是控制接口,避免改错位置。
TUN、证书与连接中断:不要归为同一种超时
network is unreachable:先看地址是否为 IPv6,再检查当前网络是否提供可用的 IPv6 路由。它更接近路由问题,不能仅凭这一行认定服务器离线。permission denied或operation not permitted:如果出现在创建 TUN 设备阶段,核对客户端服务模式、系统授权及其他 VPN 占用。应按当前客户端的安装说明处理权限,不要到处提升整个程序的权限。x509: certificate has expired or is not yet valid:先检查系统日期、时间和时区,再核对节点证书。不要把skip-cert-verify: true当作长期修复方案。connection reset by peer或EOF:表示连接被重置或读取结束,可能涉及服务端、协议参数或中间网络。单独一行不足以判断是否为密码错误。
做 TUN 对照测试时,先记下原状态,再关闭 TUN,用显式指定 127.0.0.1:7890 的请求测试。如果显式代理正常而 TUN 失败,重点转向路由、DNS 劫持和与其他 VPN 的冲突。关闭 TUN 后直接打开浏览器并不是同等测试,因为浏览器可能改走系统代理,也可能直接连接。
如果只有某款应用失败,先确认它使用 TCP 还是 UDP、是否读取系统代理、是否自带代理设置。HTTP 代理请求成功,并不能证明 UDP 转发正常;也不要因此立刻修改全局模式或整份订阅配置。
修复后复测:保留可比较的证据
- 用同一个网址、同一种请求方式和同一策略组复测,确认原来的错误不再出现。
- 检查日志实际匹配的规则与出口,避免请求只是意外改走直连。
- 恢复临时调整的日志等级与测试开关,保存必要的本地配置修改。
- 需要求助时,提供内核名称和版本、系统版本、报错时间、完整错误链及复现步骤。
排查顺序可以固定为:本地入口 → 规则出口 → 节点解析与连接 → 目标响应。每次只改一项,记录改动前后的同一条请求,通常比反复重装更容易找到原因。端口设置可对照入门指南的端口说明;持续超时可继续查看问题诊断中的超时排查。