星期六, 十月 01, 2022

154 clash for windows 和 adguard home 的冲突问题: 拦截的广告域名被拉进了代理并解析成功

由于clash mini出现的各种小问题, 最终还是转向了clash for windows. 这屎山electron应用... 不过看日志确实方便, 方便我找出那些广告和收集隐私的域名. 

前面折腾了一个勉强能用的便携版, 也算不错. 

但是我本地有个adguard home, 就搭在路由器上, 也是我内网中唯一的dns. 上游dns是国内的ip doh, 目前没有劫持和污染. 


机场规则乱七八糟, 这一看就是从网上订阅规则合并的: 

    - 'DOMAIN,dl.google.com,全球直连'

    - 'DOMAIN,dl.l.google.com,全球直连'

    - 'DOMAIN,update.googleapis.com,全球直连'

    - 'DOMAIN,fonts.googleapis.com,全球直连'

    - 'DOMAIN,fonts.gstatic.com,全球直连'

瞎写是吧? 照这么用, 特么十次里面得有八次字体是方块. 于是我就这么写mixin: 

mixin:

  dns:

    enable: true

    listen: 127.0.0.1:5335

    nameserver:

      - 192.168.10.1:5335

  rules:

      - 'DOMAIN-SUFFIX,local,DIRECT'

      - 'IP-CIDR,192.168.0.0/16,DIRECT,no-resolve'

      - 'IP-CIDR,10.0.0.0/8,DIRECT,no-resolve'

      - 'IP-CIDR,172.16.0.0/12,DIRECT,no-resolve'

      - 'IP-CIDR,127.0.0.0/8,DIRECT,no-resolve'

      - 'IP-CIDR,100.64.0.0/10,DIRECT,no-resolve'

      - 'IP-CIDR6,::1/128,DIRECT,no-resolve'

      - 'IP-CIDR6,fc00::/7,DIRECT,no-resolve'

      - 'IP-CIDR6,fe80::/10,DIRECT,no-resolve'

      - 'IP-CIDR6,fd00::/8,DIRECT,no-resolve'

      - 'GEOIP,CN,DIRECT'

      - 'MATCH,🐟 漏网之鱼': 

mixin的功能就是覆盖机场的配置, 在这段代码中, 覆盖了机场的dns和rule两个节点. 我指定dns服务器为我自己内网路由器的5335端口. 写了一些本地局域网直连(DIRECT)的规则. 比较重要的是最后两行, cn分流直连, 剩余的交给漏网之鱼select选择器. 

结果他妈的cfw在adguardhome响应了NXDOMAIN(域名不存在)后, 自己跑去连上代理给我了解析域名, 代理可不管你本地拦不拦截, 全部都会解析. 妈的那我还去个锤子广告? 

于是乎, 把目前上网的工具试了一圈, 没一个好使的, v2rayN一样会把拦截域名拉到代理里解析掉; v2rayA是网页GUI, 做得不错, 但也会拉到代理里; clashy根本没有mixin; HMBSbige / ShadowsocksR-Windows 是.net写的, 占用内存150M+, 不想用, 而且也会拉入代理; netchx那个还行, 但是加上千个cnip路由, cpu直接起飞; 其它的工具都已经很久没有维护了, 要么就得用2019年就停更的 shadowsocksrr / shadowsocksr-android. 

这几年的工具都有一个机制, 它会认为我这些 servfail/nxdomain/refused/空noerror 等等的响应全都是污染, 于是作为后备方案, 工具就会尝试通过代理解析域名... 

后来经高人指点, 得到了一个简单有效又另类的方法, 效果和nxdomain响应差不多. 

在 adguard home - 设置 - DNS设置 - DNS 服务配置 - 拦截模式 这里, 设置成 自定义IP. 在IPv4这一栏填成: 255.255.255.255, 如图: (截图是255.0, 但是实际测试发现255更好, 图片懒得重新截了...)

回到cfw, 在mixin里match的上方加一行规则, 如图: (同上, 懒得重新截图了)

 - 'IP-CIDR,255.255.255.255/32,REJECT,no-resolve'

最后面match跟的是Select选择器, 每个机场可能都不一样, 自己改一下就好. 重启cfw之后, 来看看dns解析情况(刚才为了截图, 解析了域名, 浏览器有缓存, 所以下面我换了个测试域名): 
adguard home里面拦截的域名终于被mixin的规则干死了. REJECT, 哈哈!

浏览器访问被adguard home拦截的域名时, 会立即报这些错: 
ERR_CONNECTION_RESET
ERR_CONNECTION_ABORTED
ERR_CONNECTION_CLOSED
HTTP ERROR 502

找了找, 网上目前没有clash for windows和adguard home之间存在问题的文章, 所以发出来帮助大家. 感谢大佬, 开心😄

20221003更新: 实际测试选用255.255.255.255更好, 懒得截图了.. 
adguard home 返回IP改为: 
255.255.255.255
mixin:  
- 'IP-CIDR,255.255.255.255/32,REJECT,no-resolve'
mixin这破东西, 一定要注意对齐啊...

关于IP-CIDR的转换, 参见: https://www.rocschool.com/tool/ipcidr/

0 条评论: