[ARTICLE] Dialer-Proxy 更新:给美国家宽加上本机限流

2026-09-21

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 节点,而是拆成两份:

  1. ai.yaml:target-socks5 指向 127.0.0.1:1994,没有 dialer-proxy,也没有家宽密码
  2. socks-limiter.json:家宽地址、账号、并发上限、新建间隔

同时会带上:

Clash 配置里还会多几条保护规则:

怎么用

  1. 打开工具,粘贴中转节点,填家宽 SOCKS5。
  2. 保持「启用限流」,同时最多建议 8,新建间隔 250 ms。
  3. 点 生成配置,再点 下载配套文件。浏览器会依次下载 ai.yaml、socks-limiter.json、start-ai.sh、socks-limiter.py。
  4. 四个文件放到同一目录:
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 即可。

Return_To_Blog_Index