所谓 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" } |
|