所谓 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.comfull:
msh.amazon.comfull:
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"
}