显示标签为“解析”的博文。显示所有博文
显示标签为“解析”的博文。显示所有博文

星期一, 一月 02, 2023

158 利用 Javascript, 让 Clash For Windows 的 mixin 同时支持多个机场切换, 而不用频繁修改 MATCH (以及 yaml + 多机场 的 proxy-providers 写法)

在154号文章中讲到, 利用混合配置 Mixin 将 Clash For Windows 和 AdGuard Home 组合起来使用, 但是 mixin 使用的 Yaml 是静态的, MATCH后面跟的是组名, 每个订阅的组名又不一样, 这就是说, 每次切换节点我还得改, 十分蛋疼. 

于是我在这里找到了解决方法, 从 Yaml 切换成 Javascript. 博主的代码中好像有些错误, 因为它在我这运行报错... 规则也会反过来, MATCH跑到第一位去了... 我也都将其改正了. 
注意 'GEOIP,CN,DIRECT', 'IP-CIDR,255.255.255.255/32,REJECT,no-resolve', 这两句的顺序不能写反了, 我测试发现写反了会导致 AdGuard Home 屏蔽掉的域名又特么被拉进代理解析了... 

我的需求: DNS 走我的 AdGuard Home, 局域网流量直连, 解析出来的 CN IP 直连, 其余一律走代理, 无流媒体需求. 

自己按需修改规则即可. 注意, 如果用 tun 不要使用 fakeip dns 模式, 不然你外部自建的 dns 就废了. 


module.exports.parse = ({ content, name, url }, { yaml, axios, notify }) => {


    // 通用设置

    content['mixed-port'] = 1081;

    content['allow-lan'] = true;

    content['ipv6'] = false;

    content['bind-address'] = '*';

    content['mode'] = 'rule';

    content['log-level'] = 'error';

    content['unified-delay'] = true;

 

    //DNS

    content.dns = {

        'enable': true,

        //'listen' : '127.0.0.1:5335', 

        'nameserver': [

            '192.168.10.1:5335'

        ],

        'default-nameserver': [

            '192.168.10.1:5335'

        ]

    };


    // 自定义 DIRECT / REJECT 条目

    //先清空 rules 以达到覆盖的效果

    content['rules'] = []; 

    [

        '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',

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

    ].forEach(rule => {

        content.rules.push(rule);

    });


    // 自定义走梯子的条目, 无需写尾部的后缀, 末尾带上逗号

    const customProxy = [

        'MATCH,',

    ];


    // 需要对每个 Plan 配置相应的 GroupName

    var proxyGroupName = '';


    if (name == '订阅名1.yaml') {

        proxyGroupName = 'proxy';

    } else if (name == '订阅名2') {

        proxyGroupName = '🚀 节点选择';

    } else if (name == '订阅名3') {

        proxyGroupName = '🔰国外流量';

    }

    // 还可以继续添加


    customProxy.forEach(rule => {

        content.rules.push(rule + proxyGroupName);

    });


    // Debug

    // axios.get('http://localhost:4016/openFile?path=' + yaml.stringify(content));

    return content;

}



更新:  其实 yaml 也行, 只不过它那个空格太厦碧, 我从网上东拼西凑总是报错, 下面是测试能用的. 成功的标志是, 常规 - Clash 核心( API 端口) 右边有个小芯片图标, 点开有你修改的 mixin 的内容, 而且主界面左侧会多出来一个 "服务商".  博客复制出来的代码可能还会有缩进问题, 请仔细检查, 妈的真的服了 yaml 了...

mixin:

  mixed-port: 1081

  allow-lan: true

  bind-address: '*'

  mode: rule

  log-level: error

  ipv6: false


  dns:

    enable: true

    #listen: 127.0.0.1:5335

    nameserver:

      - 192.168.10.1:5335

    default-nameserver:

      - 192.168.10.1:5335

 

  proxy-providers:

    机场1:

      type: http

      url: "填节点订阅网址, 如果是v2board的机场面板, 记得加上 &flag=clash"

      path: 机场1.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


    机场2:

      type: http

      url: "https://v2board的面板订阅/api/v1/client/subscribe?token=123&flag=clash"

      path: 机场2.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


    机场3:

      type: http

      url: "https://sspanel的面板订阅/link/123?clash=1"

      path: 机场3.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


  proxy-groups:

    - name: Proxy

      type: select

      proxies:

        - cnix  #这里填机场提供的订阅里面, 含有一堆节点的那个组名(proxy-groups底下的name, 一般在type: select的前面, 我这里是随便举例写了个cnix)

        - 代理流量

        - amy

      

    - name: cnix  #和上面对应

      type: select

      use:

        - 机场1

      

    - name: 代理流量

      type: select

      use:

        - 机场2

      

    - name: amy

      type: select

      use:

        - 机场3


  rules:

    #- 'PROCESS-NAME,clash,REJECT' #安卓上防止回环, win上没见出问题

    - 'GEOIP,PRIVATE,DIRECT'

    - 'GEOIP,CN,DIRECT'

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

    - 'MATCH,Proxy'


星期二, 十二月 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)).*$

星期六, 十月 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/