星期二, 十二月 27, 2022

157 v2rayN + AdGuard Home 的组合使用, 解决 拦截的域名被拉进代理并解析成功 的问题

前面我在154号文章中提到, Clash For Windows 和 AdGuard Home 默认是有冲突的: 拦截的广告域名被拉进了代理并解析成功. 那篇文章也讲了如何处理这个问题. 

v2rayN 和 AdGuard Home 组合使用时, 也存在同样的问题...


最近在研究各个机场, 观察入口和落地, 速度, 是否支持 torrent 域名等. 有很多的机场订阅, 也有很多的节点, 这时候 v2rayN 就显得比 Clash For Windows 好用许多了, v2rayN 支持批量节点测速, 尤其是 检测真实连接延迟(https://www.google.com/) 和 下载速度(http://cachefly.cachefly.net/10mb.test) 能比 Clash For Windows 更加真实地反映出这个机场在我这个地理位置的性能. 

但是和 Clash For Windows 一样, 有一点非常操蛋, 又把我在 AdGuard Home 拦截掉的广告域名拉进代理解析🤨... 

文档也不是没有, 但对我来说, 看起来有点费劲: 
https://www.v2fly.org/config/dns.html#dnsobject
https://www.v2fly.org/config/routing.html

经过一番折腾, 我就把我设置好的配置, 带上截图分享出来, 以帮助有需要的人. 

当前的版本是: v2rayN 5.3.9 (2022/12/13), 这也是 v2rayN 5 的最后一个大版本. 以后的版本可能有所改进或变动, 可能会更好. 这是未知数, 而且我懒得更新博客😂

====

v2rayN 需要配置两处地方才能实现 V2rayN + AdGuard Home 的组合使用, 既能走自己的 dns 去广告, 也能正常国内外分流. 


参数设置和路由设置. 首先进到参数设置 - (Core)DNS设置:

{
    "servers": [
        "tcp://192.168.10.1:5335",
        {
            "address": "192.168.10.1",
            "port": 5335,
            "skipFallback": true,
            "expectIPs": [
                "ext:geoip.dat:private"
            ]
        },
        "localhost"
    ],
    "clientIp": "",
    "queryStrategy": "UseIPv4",
    "disableCache": true,
    "disableFallback": true,
    "tag": "AdGuard Home"
}
把这个粘贴上去, 当然你直接填一个 localhost 也行, 代表使用本机系统设置的 dns . 我是两个都加上了, 192.168.10.1:5335 是路由器上搭的 AdGuard Home. 而 localhost 是网卡设置里面的 192.168.10.1. 至于 server 为什么要用 tcp://, 因为我写 udp:// 的话, dns 请求就被拉进代理了, 如果不写协议, 只写个 "192.168.10.1:5335", 则会报错: failed to create server > app/dns: failed to create client > app/dns: failed to create nameserver > parse "192.168.10.1:5335": first path segment in URL cannot contain colon
对 v2rayN dns 这块我特码的也是一知半解, 所以就直接复制粘贴上去最好🤦‍♂️

clientIp 其实就是 edns, 就近原则分配IP地址, 访问有 cdn 的大网站时会有加成, 国外 8888 1111 都支持 edns, 国内的都不太行. 目前 AdGuard Home 支持带上edns0头转达至上游, 我测试过. 这个 clientIp 的参数可以改为你附近的IP路由, 比如你实际IP是123.123.123.123, 你就改成 "clientIp": "123.123.122.1". 也可以去访问自己宽带的省运营商官网获得官网IP, 总之自己发挥, 不要写自己真实的 ip 以免出现安全问题. 
剩下几个参数看英文就知道啥意思, 最后一个 tag 名会出现在日志中.

core我选的都是xray, 我路由器上也是这个核, 用习惯了. 自己选自己喜欢的. 


下面是路由设置, 我选了 IPOnDemand 和 mph 算法. 上面发了链接, 官方文档中说 mph 效果好. 域名解析策略有点曹蛋, 我用通俗易懂的话说概括一下: 


这是官网的文档: 
AsIs:只使用域名进行路由选择,默认值;
IPIfNonMatch:当域名没有匹配任何基于域名的规则时,将域名解析成 IP(A 记录或 AAAA 记录),进行基于 IP 规则的匹配;
当一个域名有多个 IP 地址时,会尝试匹配所有的 IP 地址,直到其中一个与某个 IP 规则匹配为止;
解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名。
IPOnDemand:当匹配时碰到任何基于 IP 的规则,立即将域名解析为 IP 进行匹配。

在 Clash For Windows Mixin 里的语法就简单得多, 上面这段看得我特么头疼, 我总结下实际测试结果. 
AsIs: 和下面 IPIfNonMatch 一样. 
IPIfNonMatch: AdGuard Home 也没接到 dns 请求, 网页也无法访问, ERR_PROXY_CONNECTION_FAILED: 

IPOnDemand:是正确的选项, 我就不截图了. 

下面来配置规则, 借助geoip就变得非常容易了, 只需要配置三条规则: 

第一条是block, 阻断, 255.255.255.255 是我在 AdGuard Home 中的拦截专用的 IP 地址. 
第二条是direct, 直连, geoip:private,geoip:cn 意思是私有网络地址(局域网那几段) + 中国IP走直连. 
第三条是proxy, 代理, 保持默认. 
剩下的是系统默认规则, 删除或改为 false. 
因为我这 DNS 用的是 dns over https, 没有劫持, 不用担心 DNS 污染问题, 所以就没开 geosite:cn. 广告屏蔽也不需要, 我自己在 AdGuard Home 里面维护. 

最后看看效果: 


国外走代理, 国内走直连, AdGuard Home 屏蔽的也正常屏蔽了, 网页返回 403. 

几个 v2rayN 的使用建议: 
1, 配置好之后记得在系统托盘右键, 把系统代理改成自动. 
2, 订阅可以分组. 
3, 底下的日志太多, 可以在设置里面把日志等级改为 none, 或者在日志上面右键, 设置信息过滤器, 可以选过滤 代理日志 或者 直连日志. 也可以用正则改成过滤掉 代理+直连+拦截, 把这个粘贴进去
^(?!.*(proxy|direct|block)).*$