本文于 2025-01-18 15:51 更新,部分内容具有时效性,如有失效,请留言
根据部份用户反馈,在 Stash 处理 UDP(尤其是 QUIC)时,会在 Stash 观察到下面的行为:
- UDP 包会导致发生了本地解析,即使在规则中指定该域名由代理转发;
- 由于上一个行为,部份 UDP 的目标地址被解析到了错误地址,导致交由代理后 QUIC 握手无法完成,常见表现是 UDP 会话上行有数据,下行为 0 KB;
- 部份 UDP 会话在一段时间后会产生类似断流的现象,重启 App 后又马上会恢复。
上面这些问题的原因是 Stash 在处理 UDP 时,为了最大程度地兼容各种协议的行为,只会向代理以目标 IP 地址的形式转发,而不会像 TCP 一样将域名解析交由代理处理。在新版本中,我们重新对 Stash 的 UDP 转发逻辑进行了调整:
- Stash 现在会尝试使用目标代理发起 DNS 查询,以获取正确的、符合 CDN 优化的目标 IP 地址,再以此地址转发 UDP 包;
- 由于代理协议没有直接查询 DNS 的能力,Stash 会在使用代理向 1.0.0.1 发起 DNS 查询,该地址可以通过 udp-nameserver 参数进行配置,只支持通过 UDP 查询;
- DNS 查询结果会被缓存,直到 UDP 会话结束,可以在 Dashboard 打开对应 UDP 会话查看更多信息。
- 对于使用 DIRECT 策略的域名,Stash 依旧会使用原有的本地解析逻辑;对于 REJECT 策略的域名,Stash 会直接拒绝转发/丢弃 UDP 包,不再触发本地解析。
- 对于不希望应用程序使用 QUIC 的用户,可以继续通过逻辑策略拒绝应用向该域名的 443 端口发送 UDP 包。
😎 上述改动在 iOS Build 932 已生效,遇到问题欢迎反馈 ~