搜索 K
Appearance
适用客户端:Clash Verge Rev / Mihomo Party / ClashX Meta / sing-box / Surge / Stash / OpenClash / Shadowrocket 适用人群:从刚接触代理客户端的新手,到需要定位跨境链路故障的运维与开发者
绝大多数人排查“断网”,顺序是错的。正确顺序应该是:看日志关键词 → 判断故障落在哪一层 → 用命令行验证 → 更换节点或配置,而不是一上来就疯狂切换节点。
三条能覆盖 80% 场景的结论:
connection reset by peer,不代表节点坏了。它只说明 TCP 连接被对端或中间设备发了 RST。RST 可能来自目标站点的风控、GFW 的主动阻断、运营商的 QoS 清洗设备,也可能是节点服务端主动踢人。三者处置方式完全不同。TLS handshake timeout 或 unexpected EOF,优先怀疑 MTU、SNI 嗅探和中间盒干扰,而不是“机场垃圾”。同一节点用 curl 能通、用浏览器不通,问题通常出在本机 DNS 或分流规则。silent 的人,永远排不出问题。info 级别是排障的最低门槛,debug 级别才是抓 Connection Reset 和 TLS 报错的正确姿势。理解日志之前,先理解日志的“生产者”。客户端日志本质上是代理内核在用户态对 socket 系统调用返回值的转述。一次 HTTPS 请求,内核要经历:
getaddrinfo() 解析域名(可能被 fake-ip 拦截,直接返回 198.18.x.x);connect() 发起 TCP 三次握手,可能的返回是 ETIMEDOUT(超时)、ECONNREFUSED(端口无监听)���ECONNRESET(被 RST)、EHOSTUNREACH(路由不可达);tls: handshake failure、remote error: tls: unrecognized name(SNI 不被接受)、x509: certificate signed by unknown authority(中间人证书);EOF、unexpected EOF、broken pipe、context deadline exceeded。代理内核把 errno 映射成人类可读字符串后写入日志。所以日志里的每一个词,都对应一个确定的内核返回码,不是玄学。
2026 年的链路环境还有几个新增变量必须纳入考量:
match GeoIP(HK),实际可能绕了日本 NTT 回程,延迟凭空多 60ms。connection reset,而公网中转节点天天见。想深入理解线路类型的物理差异,建议先读 /tech/bgp-iepl-iplc-explained/ 这篇底层拆解,再回来看日志会通透很多。
判断一条线路是否值得留,不要看宣传图上的“不限速”,看下面这张表。所有指标都能通过日志 + 命令行实测得到。
| # | 量化指标 | 及格线 | 良好 | 优秀 | 观测手段 |
|---|---|---|---|---|---|
| 1 | TCP 握手 RTT(本地到入口) | 低于 120ms | 低于 60ms | 低于 25ms | tcping -p 443 |
| 2 | TLS 握手耗时(含证书链) | 低于 400ms | 低于 200ms | 低于 120ms | curl -w "%{time_appconnect}" |
| 3 | 首字节时间 TTFB | 低于 900ms | 低于 500ms | 低于 250ms | curl -w "%{time_starttransfer}" |
| 4 | 晚高峰丢包率 | 低于 3% | 低于 1% | 低于 0.2% | mtr -rwzc 100 |
| 5 | 抖动(RTT 标准差) | 低于 30ms | 低于 12ms | 低于 5ms | mtr 逐跳抖动列 |
| 6 | 单线程下载速率 | 高于 30Mbps | 高于 120Mbps | 高于 400Mbps | curl -o /dev/null 大文件 |
| 7 | 4K 视频起播缓冲 | 低于 5s | 低于 2s | 低于 1s | 客户端日志 + 播放器统计 |
| 8 | RST 注入频次(每千连接) | 低于 20 次 | 低于 5 次 | 0 次 | tcpdump 抓 RST |
| 9 | 晚高峰降速比(对比凌晨) | 高于 50% | 高于 80% | 高于 95% | 分时段 speedtest |
| 10 | IP 纯净度(原生/广播) | 非机房段 | 原生住宅段 | 原生 + 解锁流媒体 | 落地流媒体检测 |
一句话总结:RTT 决定手感,丢包决定稳定,TTFB 决定“卡不卡”,RST 频次决定“能不能用”,带宽只决定下载快不快。很多人只盯带宽,结果买到 1Gbps 端口但 RST 频发,体验反而更差。
把这张表存下来,90% 的报错可以直接对号入座。
| 日志关键词 | 所属阶段 | 最可能根因 | 首选处置 |
|---|---|---|---|
connection reset by peer | 数据读写 | 目标站风控 / GFW RST / 节点服务端踢人 | 换落地 IP,或换专线节点 |
connect: connection refused | TCP 握手 | 节点端口未监听、被防火墙 DROP 后回 RST | 核对端口与协议参数 |
i/o timeout / context deadline exceeded | 全阶段 | 链路丢包、节点宕机、QoS 限速 | 先 mtr 定位丢包跳点 |
TLS handshake timeout | TLS 阶段 | 中间盒阻断 ClientHello、MTU 异常 | 开 Sniffer、下调 MTU 至 1380 |
remote error: tls: handshake failure | TLS 阶段 | SNI 被识别、服务端拒绝旧 TLS 版本 | 强制 TLS1.3,开启 TLS 分片 |
x509: certificate signed by unknown authority | TLS 阶段 | 中间人证书 / 本机根证书缺失 | 检查是否被运营商劫持 |
unexpected EOF | 数据读写 | 连接被中途切断,常见于长连接被清洗 | 缩短 keepalive,换协议 |
dns resolve failed | DNS | 上游 DNS 污染或超时 | 切 DoH / 关闭 fake-ip 冲突 |
no route to host | 网络层 | 本机路由表或 TUN 状态异常 | 重启 TUN,检查默认路由 |
broken pipe | 数据读写 | 客户端主动断开但内核仍在写 | 一般无害,大量出现需关注 |
日志反映的是链路,链路要匹配场景。以下是四类典型人群的取舍逻辑:
1)AI 重度用户(ChatGPT / Claude / Gemini) 痛点是风控而非速度。日志里高频出现 connection reset 与 403,说明落地 IP 被标记。此时带宽再大也无用,必须选原生住宅 IP 落地。参考 /scenario/ai-native-ip/。
2)4K / 8K 流媒体用户 痛点是晚高峰稳定性与解锁完整性。看日志重点抓 TTFB 和缓冲重试次数,而不是峰值带宽。IPLC 专线在这类场景的优势最明显。
3)游戏与实时协作 痛点是抖动。看 mtr 的 RTT 标准差,超过 30ms 就会出现明显卡顿。公网中转在晚高峰几乎不可能稳定,优先 IEPL。
4)开发者(Git / npm / PyPI / Docker Hub) 痛点是长连接被重置。日志里 unexpected EOF 反复出现,通常是并发连接数过高触发清洗。降低并发、开启连接复用比换节点更有效。
Clash Verge Rev / Mihomo Party
debug。排障结束后记得调回 info,否则 debug 日志会写盘数百 MB。~/.config/clash-verge/logs/ 或应用内“运行日志”面板。unified-delay: true(统一延迟测量口径)、tcp-concurrent: true(并发握手抢最快 IP)、find-process-mode。skip-cert-verify: true。它会让所有 x509 报错消失,但你的流量可能正在被中间人解密。sing-box
log.level 设为 debug 或 trace;trace 会记录每一次连接的路由决策,定位分流错误极快。sniff 未开启导致域名规则失效,日志里会看到用 IP 匹配的 match,于是分流全乱。Surge / Stash
[General] 中设 log_level = verbose,用“请求”面板查看更直观。REJECT 规则过多会让日志被拒绝请求淹没,建议先按策略分组过滤。OpenClash(OpenWrt)
debug 级别可能触发 OOM。建议用 log-level: warning + tcpdump 组合排障。fake-ip 与局域网 NAS 域名冲突,会导致内网设备全部解析失败。Shadowrocket / iOS
reset 与 timeout,iOS 端日志精简,关键词更集中。按顺序执行,基本能定位到具体层级。
# 1) 逐跳丢包与路径(TCP 443 探测,100 个包)
mtr -rwzc 100 -T -P 443 www.google.com
# 2) 单端口握手延迟与抖动(30 次探测)
tcping -p 443 -t 30 -i 0.5 jp01.example.net
# 3) 分层耗时拆解:DNS / TCP / TLS / TTFB
curl -o /dev/null -s -w 'dns=%{time_namelookup} conn=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n' https://www.netflix.com/
# 4) 强制 TLS1.3 并打印完整证书链
openssl s_client -connect jp01.example.net:443 -servername jp01.example.net -tls1_3 -showcerts
# 5) 抓取 RST 包,判断断连由谁发起
tcpdump -i any -nn -c 50 'tcp[tcpflags] & tcp-rst != 0'
# 6) 区分 DNS 污染与线路问题
dig +short +time=3 +tries=1 www.google.com @8.8.8.8判定流程:
mtr 第一条跳点就丢包,说明问题在本机或本地网关,与机场无关���tcpdump 显示 RST 由本机发往节点,说明是本地内核因超时主动断开;time 值只有几百毫秒,说明是服务端拒绝或 GFW 注入;openssl 能握手成功但浏览器失败,几乎可以断定是本机证书或 DNS 分流问题。| 宣传话术 | 实际含义 | 识别方法 |
|---|---|---|
| “无限流量” | 通常限制单节点并发或做 QoS 隐性限速 | 晚高峰单线程下载速率骤降 |
| “BGP 直连” | 可能只是落地 BGP,入口仍是公网中转 | mtr 看中间跳数是否绕行 |
| “原生 IP” | 常为广播 IP 冒充 | 检测落地 IP 的 ASN 归属与注册地 |
| “解锁全部流媒体” | 可能仅 DNS 解锁,非真正 IP 解锁 | 播放时抓包看实际 CDN 归属 |
| “1Gbps 端口” | 端口带宽而非单用户带宽 | 高峰期实测单线程速率 |
| “不超售” | 无法验证的承诺 | 连续 7 天记录晚高峰速率曲线 |
核心判据只有一条:任何宣传都要用自己的日志和命令复现一遍。日志不会说谎,宣传会。
Q1:日志刷屏 connection reset by peer,但网页还���开? 说明只有部分连接被重置,通常是对特定域名(如 AI 站点)的风控。检查分流规则,把该域名单独规划到原生 IP 节点。
Q2:节点测速很快,但看视频一直转圈? 典型的 BBRv3 + bufferbloat 症状。测速走高并发短连接,视频走单长连接。用 mtr 看抖动,用 curl 看 TTFB,抖动超标就换 IEPL 线路。
Q3:TLS 握手失败只在浏览器出现,curl 正常? 浏览器走系统代理链路,curl 走命令行环境变量,两者 DNS 解析路径可能不同。检查是否开启了 TLS 分片、ECH 或系统级证书拦截。
Q4:开了 TUN 模式后内网服务全挂? TUN 抢占了默认路由,需手动加内网网段(如 192.168.0.0/16)直连规则,并确认 fake-ip 过滤名单包含内网域名。
Q5:i/o timeout 频繁但 ping 得通? ICMP 通不代表 TCP 通。很多清洗设备只放行 ICMP,对 TCP 443 做丢弃。用 tcping 验证 TCP 层。
Q6:日志显示 match GeoIP(HK),但延迟像日本? 分流规则只决定“用哪个节点”,不决定“走哪条回程”。入口在 HK,回程可能绕 JP,mtr 一看便知。
Q7:换了很多节点都一样报错,是不是客户端问题? 先看是不是所有节点都走同一个 DNS。DNS 污染是全局性的,换节点无效。切 DoH 通常立刻见效。
结语:日志不是给客服看的,是给你自己看的。当你能从一行 connection reset by peer 里读出“这是风控、不是线路问题”,你就已经脱离了“换节点祈祷”的初级阶段。真正的排障能力,来自对每一层协议返回值的敬畏。
标签:#客户端日志排错 #Clash日志分析 #ConnectionReset #TLS握手失败 #网络卡死定位 #跨境链路优化 #AirPick