MatsuriDayo / nekoray

Qt based cross-platform GUI proxy configuration manager (backend: sing-box)
https://matsuridayo.github.io/
GNU General Public License v3.0
12.23k stars 1.16k forks source link

BUG: Xray的IPifNonMatch策略无效 #947

Closed tiehu closed 2 months ago

tiehu commented 11 months ago

描述问题: 隔壁的V2RayN也有一模一样的问题,但我不太确定NekoRay是不是也是因同一个原因引起:即作为“兜底”规则的“匹配端口0-65535”在逻辑上与IPifNonMatch域名策略是冲突的。 这个问题在#907曾被提到过,并且同样被怀疑是“兜底规则”引起的问题。 无论如何,这个问题本身已经被我成功复现。这至少证明无论原因是否相同,NekoRay同样存在这个bug。

复现步骤: 1.切换核心为Xray。 2.在路由规则-通用中,设置域名策略为IPifNonMatch。 3.在简易路由中,设置代理IP:geoip:!cn和默认出站:bypass 4.启动代理,尝试访问www.google.com。

预期行为: 程序先检查路由规则,发现流量中的域名没有命中任何规则,所以将域名解析为IP再进行匹配,并匹配到了geoip:!cn,因此流量走代理出站。

实际行为: www.google.com出站为bypass。

问题分析: 接下来假设引起该问题的原因确实是NekoRay通过“匹配端口0-65535”规则来设置默认出站方式: 根据V2Ray官方文档,IPifNonMatch的逻辑是在所有规则没有命中的情况下再将域名解析为IP。 然而问题就出在这里,“匹配端口0-65535”这条“兜底”规则实际上匹配了没有命中其他规则的所有流量。因此IPifNonMatch不会再对域名进行解析,流量将会根据“兜底”规则中设置的方式直接出站。

可能的解决方案: 根据V2Ray官方文档,当没有匹配到任何规则时,流量默认被转发至第一个 outbound。 可以放弃用“匹配0-65535端口”来兜底的逻辑,将默认出站选项与outbound(的顺序)关联,这样就可以在兼容IPifNonMatch策略的情况下做到设置默认出站方式。

Nyar233 commented 11 months ago

907

tiehu commented 11 months ago

907

这就是那个Issue的具体分析,主要是个人认为单纯只是把兜底规则改了没法从根本上解决问题,还是得用别的方式来提供默认出站的功能。

heibailiangxiangwang20 commented 11 months ago

这个问题确实存在,而且我去年的时候研究DNS分流的时候就发现了,我当时自己还做了笔记,所以不仅仅是你说的那个问题,就连分流也会出现问题! image 22年7月份的时候就做了笔记上传到网盘备以后自己看(忽略NDS这个字,当时写错了)

image image image

所以当时我研究dns的结果就是,我来回各种测试了好几个小时,有0-65535的时候,DNS分流匹配规则基本无效,除非是自定义配置,

Sherman-Liu commented 10 months ago

可以复现此问题,目前只有IPOnDemand可用