1 月写过 相对安全的 Claude Code / Codex / Gemini 用法:用 mihomo 的 dialer-proxy 做双跳,出口固定走美国家庭带宽。这条链路能用,但 Claude Code 一开会话,家宽 SOCKS5 经常在流式输出中途被打满,客户端报:
API Error: Connection lost mid-response. The response above may be incomplete.
Clash / mihomo 没有「把打向家宽的新建连排队、错峰再发」这种旋钮。这次把网页工具补上了本机限流层:多出来的连接在本地等,家宽同时只收有限几条 TCP。
工具地址:https://xuzhougeng.top/tools/dialer-proxy/
双跳还是那条,别把出口换成机房
家宽必须留着。美国 HY2 是机房出口,不是住宅 IP。出口仍然是第二跳 SOCKS5。
Claude Code
→ 127.0.0.1:1990 mihomo HTTP
→ 127.0.0.1:1994 本机限流 SOCKS(新)
→ 127.0.0.1:1991 第一跳(HY2 / SS / Trojan)
→ 美国家宽 SOCKS5
→ api.anthropic.com
以前是 Claude 直接打到家宽。Claude 启动时一秒能开出十几条 api.anthropic.com,住宅代理常见只有几条到十几条并发槽。槽满就 connection refused,正在流的 HTTP/2 一起死。
tcp-concurrent: false 解决不了这件事。它只作用于同一条连接里 A/AAAA 要不要一起抢,不会把 Claude 的 10 条 CONNECT 串起来。
smux 也不能用在普通家宽 SOCKS5 上:对端必须是 sing-box / xray / mihomo 的 mux。住宅代理听不懂。
所以限流只能加在 Clash 前面。
网页工具改了什么
打开 Dialer-Proxy 生成器,默认勾选 启用限流。
仍然填两样东西:
| 输入 | 作用 |
|---|---|
| 中转代理 YAML | 第一跳,只负责出墙、摸到家宽 |
| 美国家宽 SOCKS5 | 第二跳,真正的出口 IP |
勾选限流之后,生成结果不再把家宽账号写进 Clash 节点,而是拆成两份:
ai.yaml:target-socks5指向127.0.0.1:1994,没有dialer-proxy,也没有家宽密码socks-limiter.json:家宽地址、账号、并发上限、新建间隔
同时会带上:
socks-limiter.py:本机排队脚本(stdlib,不额外装包)start-ai.sh:先起限流器,再起 mihomo
Clash 配置里还会多几条保护规则:
- 家宽 IP
IP-CIDR,...,relay-group,no-resolve,避免限流器回连时打回:1994死循环 api.github.com/docker.io走第一跳,不占家宽槽- Apple Siri 那些走 DIRECT
ipv6: false、TCP keepalive 15s、禁止tcp-concurrent
怎么用
- 打开工具,粘贴中转节点,填家宽 SOCKS5。
- 保持「启用限流」,同时最多建议
8,新建间隔250ms。 - 点 生成配置,再点 下载配套文件。浏览器会依次下载
ai.yaml、socks-limiter.json、start-ai.sh、socks-limiter.py。 - 四个文件放到同一目录:
chmod +x start-ai.sh socks-limiter.py
bash start-ai.sh
export http_proxy=http://127.0.0.1:1990
export https_proxy=http://127.0.0.1:1990
Claude / Codex / Gemini 继续走 127.0.0.1:1990,和 1 月那篇一样。多出来的只是本机还要监听 1994。
只起 mihomo -f ai.yaml 不够:YAML 里的第二跳已经是 127.0.0.1:1994,限流器没起来,AI 会直接连不上。
限流参数
写在 socks-limiter.json 里,改完重启限流器:
| 字段 | 默认 | 含义 |
|---|---|---|
max_concurrent |
8 | 同时打到家宽的 TCP 条数(太小会把 Clash 握手拖超时,表现为 API disconnected) |
dial_interval_ms |
250 | 两条新建之间的间隔 |
queue_wait_s |
8 | 排队超过这个时间就失败,必须短于 Clash 拨号超时 |
listen |
127.0.0.1:1994 | Clash 连这里 |
via |
127.0.0.1:1991 | 经 mihomo SOCKS 走第一跳 |
upstream |
家宽 host:port | 真正的住宅 SOCKS5 |
槽位按连接生命周期占用。Claude 那条正在流的 HTTPS 占着 1 个槽,短请求排在后面。短请求会变慢,主对话不容易被 RST。
家宽如果明确能扛 8 条,把 max_concurrent 调到 6~8。调太大,限流就没意义了。
怎么确认它在干活
ss -lptn | grep -E '1990|1994'
tail -f /tmp/socks-limiter.log
Claude 一开会话,日志里应该能看到类似:
queue dest=api.anthropic.com:443 active=4 waiting=3
dequeued dest=api.anthropic.com:443 waited=0.60s
active=4 waiting=3 就是在排队。如果这里直接变成家宽 connection refused,说明限流器没接到链路上,检查 YAML 里 target-socks5 是不是 127.0.0.1:1994。
常见问题
Q: 能不能让 Clash 自己排队?
不能。mihomo 没有出站并发队列。tcp-concurrent、smux.max-connections 都不是这个功能。
Q: 第一跳该选美国还是日本?
选「到这台家宽 SOCKS5 整链最快」的。出口必须是家宽,第一跳只是去摸它。实测经常是日本 / 香港比美国 HY2 更合适。
Q: 还要不要 1 月那篇的 function.sh?
可以继续用 claude / gemini / codex 包装函数,它们只检查 127.0.0.1:1990。启动改成 start-ai.sh,先保证 :1994 起来。
Q: 家宽是自己家里的机器,有没有更干净的做法?
有:家里不要暴露 SOCKS5,改成 Hysteria2 / WSS。无数条 Claude TCP 复用成一条到家里的隧道,比本地排队更稳。买的住宅代理通常只能 SOCKS5,就用这次的限流。
小结
双跳的目标没变:AI 流量从美国家庭带宽出去。变的是第二跳前面加了一层本地排队,专门对付 Claude Code 那种「一条流 + 一堆短连接」的打法。网页工具默认勾上,下载配套文件,四个文件放一起执行 start-ai.sh 即可。