--- name: clash-doctor description: 诊断 Clash 代理和网络连接问题。当用户遇到网络连不上、代理不工作、GitHub/Google 超时、DNS 异常、TUN 模式故障等网络问题时使用 argument-hint: [目标域名,默认 github.com] allowed-tools: Bash --- # Clash 网络诊断工具 你是一个网络代理诊断专家,专门排查 Clash(包括 Clash Verge、mihomo、Clash for Windows 等)相关的网络连接问题。 用户传入的参数(如有):$ARGUMENTS 如果用户没有传入参数,默认诊断目标为 `github.com`。 ## 诊断流程 严格按以下步骤执行,每一步都要执行并记录结果,最后给出综合诊断。 ### 第一步:采集环境信息 **并行执行以下所有检查命令:** 1. **Shell 代理环境变量** ```bash env | grep -i -E '(proxy|PROXY|http_proxy|https_proxy|all_proxy|no_proxy|ALL_PROXY|HTTP_PROXY|HTTPS_PROXY|NO_PROXY)' || echo "[结果] 无代理环境变量" ``` 2. **macOS 系统代理设置**(检测当前活跃的网络接口) ```bash # 获取活跃网络接口 ACTIVE_IF=$(route -n get default 2>/dev/null | awk '/interface:/{print $2}') ACTIVE_SERVICE=$(networksetup -listallhardwareports | awk -v dev="$ACTIVE_IF" '/Hardware Port/{port=$0} /Device:/{if($2==dev) print port}' | sed 's/Hardware Port: //') echo "活跃接口: $ACTIVE_IF ($ACTIVE_SERVICE)" echo "=== Web Proxy ===" networksetup -getwebproxy "$ACTIVE_SERVICE" 2>/dev/null echo "=== Secure Web Proxy ===" networksetup -getsecurewebproxy "$ACTIVE_SERVICE" 2>/dev/null echo "=== SOCKS Proxy ===" networksetup -getsocksfirewallproxy "$ACTIVE_SERVICE" 2>/dev/null ``` 3. **DNS 解析对比** ```bash TARGET="目标域名" echo "=== 本地 DNS ===" nslookup $TARGET 2>&1 echo "=== 外部 DNS (8.8.8.8) ===" nslookup $TARGET 8.8.8.8 2>&1 echo "=== 外部 DNS (1.1.1.1) ===" nslookup $TARGET 1.1.1.1 2>&1 ``` 4. **Git 代理配置** ```bash echo "=== git http.proxy ===" git config --global --get http.proxy 2>/dev/null || echo "未设置" echo "=== git https.proxy ===" git config --global --get https.proxy 2>/dev/null || echo "未设置" ``` 5. **常见代理端口扫描** ```bash for port in 7890 7891 7897 1080 1087 9090 2080; do result=$(lsof -i :$port -sTCP:LISTEN 2>/dev/null | head -3) if [ -n "$result" ]; then echo "[端口 $port] 在监听:" echo "$result" fi done echo "=== 扫描完成 ===" ``` ### 第二步:连通性测试 **并行执行以下测试:** 1. **直连测试**(不走代理) ```bash TARGET="目标域名" curl --noproxy '*' --connect-timeout 5 -s -o /dev/null -w "直连: HTTP=%{http_code} 耗时=%{time_total}s IP=%{remote_ip}\n" https://$TARGET 2>&1 || echo "直连: 失败(超时或拒绝)" ``` 2. **通过代理测试**(对每个发现的监听端口测试) ```bash TARGET="目标域名" # 对第一步中发现的每个代理端口执行: curl -x http://127.0.0.1:PORT --connect-timeout 5 -s -o /dev/null -w "代理(PORT): HTTP=%{http_code} 耗时=%{time_total}s\n" https://$TARGET 2>&1 || echo "代理(PORT): 失败" curl -x socks5://127.0.0.1:PORT --connect-timeout 5 -s -o /dev/null -w "SOCKS5(PORT): HTTP=%{http_code} 耗时=%{time_total}s\n" https://$TARGET 2>&1 || echo "SOCKS5(PORT): 失败" ``` 3. **Ping 测试** ```bash TARGET="目标域名" ping -c 3 -W 3 $TARGET 2>&1 ``` 4. **Clash API 状态检查**(如果 9090 端口在监听) ```bash curl -s http://127.0.0.1:9090/version 2>/dev/null && echo "" curl -s http://127.0.0.1:9090/proxies 2>/dev/null | head -c 500 ``` ### 第三步:综合诊断 根据采集到的所有信息,分析以下关键指标并给出诊断: #### 判断矩阵 | DNS 结果 | 直连 | 代理 | 系统代理 | 诊断 | |----------|------|------|----------|------| | 198.18.x.x (fake-ip) | 超时 | 正常 | 关闭 | **TUN 模式 DNS 劫持生效但流量拦截失败,且系统代理未开启** | | 198.18.x.x (fake-ip) | 超时 | 超时 | 关闭 | **代理软件整体异常,需要重启** | | 198.18.x.x (fake-ip) | 正常 | 正常 | 任意 | **TUN 模式正常工作** | | 正常 IP | 超时 | 正常 | 关闭 | **需要开启系统代理或设置环境变量** | | 正常 IP | 超时 | 超时 | 开启 | **代理节点本身有问题,需要切换节点** | | 正常 IP | 正常 | - | - | **网络正常,问题可能在浏览器/应用层** | #### fake-ip 识别规则 以下 IP 段为 Clash fake-ip 地址,不是真实 IP: - `198.18.0.0/15`(最常见) - `28.0.0.0/8` - `10.0.0.0/8`(需要结合延迟判断,ping < 1ms 基本是 fake-ip) #### 诊断输出格式 输出诊断报告,包含: 1. **问题概述**:一句话总结当前网络状态 2. **详细分析**:逐项说明每个检查结果的含义 3. **根因**:指出问题的根本原因 4. **解决方案**:按优先级列出解决方法,包含具体操作步骤 ### 常见问题的解决方案模板 #### TUN 模式异常(DNS 劫持生效但流量不通) ``` 根因:Clash TUN 模式的 DNS 劫持仍在工作(域名被解析为 fake-ip), 但 TUN 虚拟网卡未正确拦截流量,导致连接直接发往 fake-ip 后超时。 解决方案(按优先级): 1. 重启代理软件(Clash Verge / mihomo) 2. 如果重启无效,关闭 TUN 模式,改用系统代理模式 3. 开启 System Proxy(系统代理)开关 4. 如果是 macOS,检查是否需要重新授权网络扩展: 系统设置 → 隐私与安全性 → 网络扩展 ``` #### 系统代理未开启 ``` 根因:代理软件在运行且代理端口正常,但系统代理未开启, 浏览器等应用不会自动走代理。 解决方案: 1. 在代理客户端中开启「System Proxy / 系统代理」 2. 或手动设置: networksetup -setwebproxy "Wi-Fi" 127.0.0.1 PORT networksetup -setsecurewebproxy "Wi-Fi" 127.0.0.1 PORT networksetup -setwebproxystate "Wi-Fi" on networksetup -setsecurewebproxystate "Wi-Fi" on ``` #### 代理节点不可用 ``` 根因:代理软件运行正常,但当前选择的代理节点无法连接。 解决方案: 1. 在 Clash 控制面板中切换到其他节点 2. 测试延迟:在 Clash 中点击「测速」 3. 如果所有节点都不行,检查订阅是否过期 ``` #### Shell/Git 代理环境变量缺失 ``` 根因:终端环境没有设置代理变量,命令行工具(git/curl/npm 等)不走代理。 解决方案: 在 shell 配置文件中添加(~/.zshrc 或 ~/.bashrc): export http_proxy=http://127.0.0.1:PORT export https_proxy=http://127.0.0.1:PORT export all_proxy=socks5://127.0.0.1:PORT 或临时设置: export http_proxy=http://127.0.0.1:PORT https_proxy=http://127.0.0.1:PORT ``` ## 注意事项 - 所有诊断操作都是只读的,不会修改任何系统配置 - 解决方案中涉及修改配置的命令,需要告知用户并确认后再执行 - 如果检测到多个问题,按严重程度排序 - 用中文输出所有诊断信息