Direct/Freedom outbound: Better Compatibility#6058
Conversation
This comment was marked as outdated.
This comment was marked as outdated.
|
|
这种情况有几种可能,比如 VLESS 没走 XUDP,就不会赋值 b.UDP,之前 ipsBlocked 是没问题的,现在 dial 那里放过了 UDP |
|
怕耽误发版标记为 draft #6027 (comment) 之前说了一大堆 0 人在意 |
|
主要是想兼容老哥的 happyeyeballs 这些边角的 BUG 早就存在了 |
|
还有其它一些情况会导致序号 6,但我看了下代码倒是又发现了别的问题,如果 UDP 那里
这个断言失败,就不会走到自定义的 PacketReader/Writer,而是 buf.PacketReader/buf.SequentialWriter,绕过了过滤逻辑 |
|
那再包一层,我开个 PR 单独修这几项呗 |
|
你开个 PR,这样吧:
|
|
#6058 (comment) 基本上只是因为 NG 自定义 dialer,然后又出现了域名的问题,还是先不管它吧,你先把上面的 1 给 PR 了 |
|
毕竟这些 feature 理论上不该冲突,只是得益于屎山代码。。。 |
|
并非“理论上不该冲突”,这里的一些东西它理论上就是冲突的,因为 finalRules 要求在 freedom 这步就解析出 IP,这必然要跳过 sockopt 的 domainStrategy 和 happyEyeballs;就算这俩能读取,你要配置 dialerProxy 的话那还是控制不了它最终实际上 dial 到哪,此时 finalRules 可能根本就没意义;NG 自定义 dialer 可能有自定义域名解析策略等,这就更不该提前解析出 IP 了 并非“屎山”而是可能的用法太多了,我的意思是这个特性目前只针对服务端,先不考虑客户端的那些情况
|
|
ok 明白了 漏掉了 TCP 那个客户端行为在墙眼里是什么样 |
那取决于被代理的应用了,代理层 dial 是成功了不会 retry,但应用层可能发现一发数据就被关连接,所以可能会重试几次 |
|
根据 #6060 更新下文档然后 rebase 一下,剩下的讨论在这里进行 其实也没那么复杂,#6058 (comment) 都列举清楚了,区分服务端/客户端后就清晰很多 |
|
文档改好了,UDP 断言失败不会逐包过滤暂时没提 |
|
|
|
只有 freedom 才需要最终过滤 |
|
Xray-core/proxy/freedom/freedom.go Lines 318 to 326 in 228f1e1 this code disable both xray and go happyEyeballs, also so it is possible that an ipv6 is selected but our server has ipv4 only. so we should filter IPs before we choose one at random (use /// but it is still possible that our server has an inactive ipv6 interface or one ip type is disabled at target-side, so disabling happyEyeballs is not good idea at all. so |
Xray-core/transport/internet/dialer.go Line 254 in 228f1e1 we can check |
|
为了让你的 udpdomain 和 happyeyeballs 行为一致 既然已经偷看了,那就没必要改 dialer 让能传递多个 dest 下去 |
|
??? you can prioritize ipv4 when selecting ip, but most of the time ipv6 has better performance and it is not future-proof. I don't understand your resistance to using xray-happyEyeballs (this is not about the properties of happyEyeballs-v2, this is about the essential properties of happyEyeballs-v1) /// I still think we should remove multiple-domain-udp-cone support, anyway we can keep it and have duplicate finalRules-code in freedom (or keep finalRules-code in freedom and just pass the filtered-ips via ctx) |
不能因为你的两个功能互相打架就把其中之一删掉 finalrules udpdomain 都和 happyeyeballs 冲突 以及 ipv6 跨国路由绝大多数情况下都比 ipv4 烂 |
|
|
|
首先你这玩意也就客户端用 就别为这个东西再大肆破坏现有结构了 |
|
再多 thumbs down 你的 udpdomain 还是和 happyeyeballs 打架 |
|
target 发生在 freedom 之前,没有被偷看
|
|
我现在看下你那个新加的选项 |
|
我又看了下 忘了。。。为了修复 UDPDomain 怎么说,是 break 掉 freedom + targetStrategy 并且
还是保持现状? |
|
本来有一个freedom的domainstrategy 然后patterniha加targetstrategy的时候你说反正这玩意和freedom的domainstrategy的功能一样 要他给freedom的domainstrategy加了个同名的别名 |
|
@Fangliding 我们说的是 outbound 那个 targetStrategy,你先别添乱了,绝大多数别名/重命名都是更合理的, @Meo597 那还是 freedom 禁止配 targetStartegy,另外你那个选项别加了,sockopt ds 默认值都从 asis 改成 usev4v6 吧 |
|
那个 privacyGuard 主要是你怕面板、GUI 们默认都显式给 AsIs 而且 sockopt.ds 默认 AsIs 好处是 go dial 解析策略会优先拨 v6,双栈服务器 v6 据说墙低 |
This comment was marked as outdated.
This comment was marked as outdated.
|
就是说不光 freedom,所有都是 v4 优先,包括代理协议出站,想要 asis 或 v6 优先/强制的可以自己去设置 没几个 GUI 去设默认 sockopt ds asis 的,所以还好,和 freedom 被删掉那个不一样(所以这个也别兼容了吧,直接 ignore) v6 墙是低了但更容易实名到个人,都不用去调运营商数据,不妥,想要 v6 过墙的自己改设置吧,
@Fangliding 因为上文已经决定把 freedom 的 ds 干掉了所以我们都没在想这个, |
|
sockopt.Domainstrategy乱改use有的配置要炸回环的 假如有人就配了个vmess出站 里面是域名 然后内置dns配了个1.1.1.1 再正常不过的配置 本来出站正常走asis走系统DNS 内置DNS也走这个出站出去 sockopt.Domainstrategy 改默认use这个1.1.1.1没地方出去了回环了 |
|
因为他现在要加个选项就有点没必要了,就只是因为默认值是 asis, |
|
任何一个GUI只要填了内置DNS就会有这个问题 甚至不是GUI 手写一样遇到 这可不是少数 |
|
删掉 privacyGuard 或者干脆默认全 AsIs 不再帮用户默认 v4 |
This comment was marked as duplicate.
This comment was marked as duplicate.
|
@Fangliding 刚刚没仔细看, @Meo597 “freedom 禁止配 targetStartegy” @Fangliding 可以给链接,不要刷屏 |
|
可以这样,sockopt ds 不填任何东西时,用系统 DNS 解析出来 IP 并优先 v4,有 dialerProxy 时就不管了直接传域名过去 |
删掉 privacyGuard 并且 sockopt.ds 不能全改默认值的情况下 要的话就只能是 infra 那边 freedom 遇到 sockopt 并且 asis 强制改写为 useipv4v6 |
改动面巨多无比,ds 不是个普通的变量,没法简单的在 core 里判断 "" 还是 asis |
|
sockopt 遇到 freedom 在 infra 层面强行改写为 useipv4v6 是最直观简单的 |
|
@Meo597 改动哪里多了,分配个新的标号 internet.DomainStrategy_OS_IP46 不就行了,注意 TUN 那个别回环 |
|
矛盾是 asis 不能选 4/6,而其它的都走内置 DNS、容易回环,还是功能上不够方便,以后可以加些选择,现在先随便给个标号 |
|
ok |
|
对于 targetStrategy 来说 os_ip46 是个废选项,有点不美观 |
|
纠结那么多干嘛,本来没说让你加个“用户可选参数”的,实在纠结的话就把 os_ip4 os_ip6 os_ip64 全加上、写文档里 这个和 Go 的 dial 应该是能拿到相同的解析结果吧,那也不用回退 asis 了,没查到的话 Go 内置库也查不到 一定注意一是 TUN 别回环(Go 自己查的会吗?),二是 dialerProxy 时回退 asis, |
|
dialerProxy 回退目的防泄漏呗,那么 UDPDomain 那边原本其实一直泄露的
|
|
|
|
|
这里以前应该完全没考虑 freedom dialerProxy 的事,在 core 体系里最终有效出口只有 wg 和 freedom |
|
话说刚发现 wg 那边没有 UDPDomain 的缓存 |
|
|
|
在弄了,估计要两天 还有 dialerProxy 以前也没好好处理,较真起来泄露的有点多 |
按照下面的讨论,现在是这样的:
freedom.domainStrategy 已经干掉了,自动兼容旧配置并提醒用户
有 proxySettings.tag 时,且 targetStrategy 为 AsIs 则旧配置自动覆写为 targetStrategyfreedom 新增选项
privacyGuard,它有三种状态:未设置、显式 true、显式 false翻译下就是“用户有策略听用户的,否则 v4 优先”
翻译下就是“一旦显式设置,必须保证 v4 优先”
finalRules 现在不会覆写 IP,而且 freedom 也不允许覆写 IP,都是偷看 sockopt 策略,解析出来判所有 IP
意思是在 freedom 真的是最终出站时绝对有效,但若还有 sockopt.dialerProxy、
proxySettings.tag、sockopt.addressPortStrategy时则尽力而为UDP domain 有更好的兼容性
proxySettings 整个干掉了
freedom 不兼容 sockopt.addressPortStrategy