V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yyysuo
V2EX  ›  DNS

聊聊 mosdns 在用的一些小技巧及 fakeip 分流大法的一些小应用。

  •  
  •   yyysuo · 1 天前 · 621 次点击
    所谓 fakeip 分流大法,包含以下几个要点
    1:在 dns 解析阶段用 mosdns 分流,只对需要代理的域名发 fakeip 。
    2:主路由防火墙只劫持 fakeip 流量/静态路由 fakeip 流量到 sing-box 入站。
    3:对不在域名列表的域名,先用国内 dns/国外 dns+ecs 解析,如果获取了国外 IP ,抛弃后发 fakeip 。

    这种分流方法有以下好处
    1:对于不需要代理的流量,从 dns 到路由,完全直连,和没有代理一模一样,科学挂掉也不影响。
    2:对于不走域名 IP 直连的流量,比如 bt/pt 的用户连接、vps ip ,默认是直连的。
    3:依赖 geoip-cn ,但是对域名列表精确度要求低,对未知域名能精确分流。


    衍生出来另外一个手机端的 fakeip 分流大法,和主路由方案很类似。
    1:家中主路由 sing-box 开 ss/hy2 等任何可以回家的入站。
    2:手机 sing-box dns 全通过 ss/hy2 入站导入到家中主路由 mosdns 。
    3:手机 sing-box dns 获取到 fakeip ,路由 fakeip 至家中 sing-box 的 ss/hy2 入站。
    4:手机 sing-box dns 获取到 real ip ,结果抛弃,重新使用 local dns 解析成对手机网络 cdn 友好的本地 ip 。

    这种分流方法对手机网络来说
    1:借用了这中 mosdns 的分流结果,分流精确,体验完美。
    2:不使用 srs/mrs 规则文件,省内存。
    3:配置文件写起来比较简单明了。

    有一些小技巧
    1:使用 mosdns ,可以使节点域名都走代理解析而不产生鸡蛋问题,第 1 次解析使用国内 dns ,代理联通后,后续都使用代理解析。
    sleep 1000 很重要,因为 sb 一接收到代理请求,就会解析节点域名,节点域名发到 mosdns 解析,mosdns 的上游国外 dns 如果使用了 sb 的代理,sb 接到 mosdns 的代理请求后会立即再发节点解析请求,5ms 内足以建立上万个连接。mosdns 延迟 1000ms 再走 8888 ,避免产生循环,使用 lazy cache 加速节点域名解析。

    #专门用于解析域名节点,默认使用 8888 解析,5 毫秒不通用换 223 解析
    - tag: sbnodefallback
    type: fallback
    args:
    primary: sequence_google
    secondary: sequence_local
    threshold: 5
    always_standby: false

    - tag: sequence_sbnode
    type: sequence
    args:
    - exec: $cache_node
    - matches: has_resp
    exec: accept
    - exec: sleep 1000
    - exec: $sbnodefallback

    2:改动了 mosdns 的代码,增加了一个规则文件输出插件,固化 mosdns 的分流结果,生成 2 种规则文件。

    #访问过的 fakeip 的域名清单和生成规则,以 mosdns 和 Adguard Home 为例
    - tag: my_fakeiplist
    type: domain_output
    args:
    file_stat: /cus/mosdns/gen/fakeiplist.txt #域名统计信息
    file_rule: /cus/mosdns/gen/fakeiprule.txt #可供 mosdns 使用的规则文件
    gen_rule: /cus/AdGuardHome/data/userfilters/fakeip.txt #可供 Adguard Home 使用的上游配置
    pattern: "[/DOMAIN/]127.0.0.1:7874" #Adguard Home 上游配置生成规则
    appended_string: "udp://127.0.0.1:6666"#Adguard Home 上游配置文件的第 1 行
    max_entries: 1000 #流经插件的域名达到 1000 写入本地
    dump_interval: 36010 #mosdns 运行 36010 秒后写入本地

    生成的可供 mosdns 使用的规则文件格式如下
    full:firetvcaptiveportal.com
    full:msh.amazon.com
    full:api.amazon.com

    生成的可供 Adguard Home 使用的上游 dns 配置文件格式如下:
    udp://127.0.0.1:6666
    [/001.kjdf-e56efs6.cc/]127.0.0.1:7874
    [/00453.net/]127.0.0.1:7874

    3:使用 fallback 插件并发匹配 2 个域名列表,并使用 black_hole 传递匹配结果(因为 mark 不能跨序列传递)

    #国内域名列表匹配
    - tag: gen_is_local_dns
    type: sequence
    args:
    - matches: qname $my_realiprule
    exec: black_hole 127.0.0.1 ::1

    #国外域名列表匹配
    - tag: gen_is_fakeip
    type: sequence
    args:
    - matches: qname $my_fakeiprule
    exec: black_hole 127.0.0.2 ::2
    - matches: "!resp_ip 127.0.0.2 ::2"
    exec: black_hole 127.0.0.3 ::3

    #fallback 并发匹配
    - tag: gen_conc
    type: fallback
    args:
    primary: gen_is_local_dns
    secondary: gen_is_fakeip
    threshold: 20000
    always_standby: true

    4:使用前面提及的 domain_output 插件生成没有 V6 ip 的域名列表,并在 mosdns 规则中屏蔽减少无效查询
    - matches:
    - "qtype 28"
    - "mark 11"
    - "rcode 0 2 3 5"
    - "!resp_ip 2000::/3"
    - "!cname keyword:."
    exec: $my_nov6list #生成域名规则

    - matches: #屏蔽没有 v6 地址的域名
    - qtype 28
    - qname $my_nov6rule
    exec: reject 3

    5:利用 sing-box 的 dns ip 规则,实现 sing-box dns 的 2 次查询判断

    {
    "tag": "mosdns",
    "address": "tcp://10.10.10.1:53",
    "detour": "home"
    },

    {
    "ip_cidr": [
    "28.0.0.0/8",
    "fc00::/18"
    ],
    "server": "mosdns"
    }

    "final": "localdns"
    解析:手机端 sing-box 配置中,dns 全回到家中的 mosdns 解析,如果 mosdns 返回了家中的 fakeip 段,那 dns 查询结果被接受,否则结果被抛弃,重新使用 localdns 查询。

    6:利用 sing-box network_strategy ,实现在没有 v6 的 wifi 环境下,v6 走手机流量。

    出站:
    {
    "type": "direct",
    "network_strategy": "hybrid",
    "network_type": "cellular",
    "tag": "directm"
    }


    路由:

    {
    "type": "logical",
    "mode": "and",
    "rules": [
    {
    "wifi_ssid": "我的 WIFI",
    "invert": true
    },
    {
    "ip_cidr": ["::/0"]
    }
    ],
    "outbound": "directm"
    }
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5191 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 07:47 · PVG 15:47 · LAX 00:47 · JFK 03:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.