家庭用户有必要自建递归 dns 吗

119 天前
 chenbin36255
RT https://blog.03k.org/post/paopaodns.html
看了这位大佬的 blog 使用 paopaodns 自建 dns+paopaogateway FAKE IP 网关
使用静态路由映射的方式实现国内外的域名分流
从原理上看是很精巧的分流方式

另外 DNS 解析的速度不太好判断
如何判断 dns 的解析速度和准确性呢
4922 次点击
所在节点    DNS
45 条回复
rulagiti
119 天前
mosdns yyds
povsister
118 天前
fakeip 谈不上精巧,现在一堆软件都提供打包解决方案。这个方案核心不在于要不要自建 dns ,核心在于你如何做 dns 分流,国内用运营商 dns 总是最好的,海外直接走梯子过 cf/google 落地区域的 dns 就行了。
lxh1983
118 天前
这相当于为了喝口牛奶养了头奶牛
chenbin36255
118 天前
@povsister 个人感觉还是不错的思路 至少这个分流可以做到完全不影响国内的访问 所有非 CN 域名解析通过静态路由全部由 fake ip 网关处理
araaaa
118 天前
自己写的监听 127.0.0.1:53 ,通过 adblock 列表转到不同的 dns server 上
chenbin36255
118 天前
@povsister 运营商的 dns 还是担忧劫持的风险 公共 dns 又纷纷限速 自建的话还是比较需要的
chenbin36255
118 天前
@araaaa 国内的流量也是经过科学网关出吗
lin41411
118 天前
@chenbin36255 #6
劫持可能只占你日常访问的 0.01%甚至远远低于 0.01%,单独把 0.01%的域名单独指定可信的 dns 来解析就好。不要大费周章去解决那些低概率事件。
araaaa
118 天前
@chenbin36255 #7 不过,国外 dns server 过
maybeonly
118 天前
分流说白了都是名单问题。
dns 真的很难有可靠的名单,简单一点的话有相对可靠的墙内 ip 列表(前不久还刚刚修理了一下我家用的版本)
我的做法是:自建递归(我用了 bind ,用什么都行),然后 53 端口根据 ip 列表走 ip 分流。
考虑到性能问题,前面还有一层 dnsmasq ,把简单的墙内白名单指向运营商,把简单的墙内黑名单指向可信 dns

原理的话,dns 解析都是递归的,从根域名开始。
省略根、.com 的解析过程:
比如解析 www.baidu.com ,拿到 ns1.baidu.com 之后,你的递归会给 ns1.baidu.com ,也就是 110.242.68.134 发送请求,这个请求是通过直连发出去的,那么他看到的当然就是你的墙内 ip 。
又如解析 www.google.com ,每一步都是通过梯子出去,墙内完全不知道你在解析什么……最后 google 看见的你的请求来源也是梯子出口的 ip 。

我的玩法比他精巧不? fakeip 还是算了,太假,个人表示不喜欢。
NoOneNoBody
118 天前
如果真的非常需要每次请求都精确且实时,就建吧
我就 client 改个 TTL 直接 cache 一天,就第一次慢而已,二次开始就快了,如果出现错误就重启清 cache 再来
要走梯子的那些也跟这个无关
shenjinpeng
118 天前
对分流需求不高, 一般回去就刷刷视频玩玩游戏, 只是用 adguard home 代替了 hosts 文件 让局域网所有设备直接解析跳转方便开发 ,并且拦截了部分广告 dns
chenbin36255
118 天前
@maybeonly 我可能没有说清楚 我说的精巧不是 dns 的分流
是通过 dns 把非大陆 IP 解析成 FAKE IP 然后直接转发到科学网关
实现了国内流量直接走主路由 外网流量走科学网关
不需要让科学网关处理国内的流量 降低延迟和性能
而且不会有节点挂掉全家断网的风险
这个思路是比较巧妙的
povsister
118 天前
@maybeonly
正解,用一份黑名单,无条件走海外 dns ,剩下的走国内,不用去赌那 0.0001%的漏网之鱼。
不过,黑名单以外的网站我是用国内解析一遍,如果是国内 ip 就采用,如果是海外 ip ,就用地理位置较近的海外机器再解析一遍,以海外结果为准。
dns 泄露?只要你不是 50w 真有人查这东西吗
maybeonly
118 天前
@povsister 这是一个可以考虑的权衡方向。不过我选择不告诉境内我在解析什么,怕反炸上门。
maybeonly
118 天前
@chenbin36255
emmmm 直连用 fakeip 就更奇怪了
所以说有可靠 ip 列表的前提下用路由表直接分流啊
路由表本来就可以让一部分流量直接过去的
科学网关坏掉为什么会全家断网?因为大部分梯子都是为了单机而不是路由器上用的
所以他们实际上做了调度器+隧道的组合,而良好的路由器上运行的梯子应该把调度器和隧道分开,
甚至把不过梯部分和梯子调度器进一步分开。
关于这方面的问题,我的解决方案是 /t/1034955
yyysuo
118 天前
fake 网关现在已经很流行了,opn 、op 、爱快、ros 都可以实现,op 最简单。
yyysuo
118 天前
粘个 mosdns 的 fakeip 分流法配置
log:
level: error
file: "/tmp/mosdns.log"

api:
http: "0.0.0.0:9091"

include: []

plugins:
- tag: hosts
type: hosts
args:
files:
- "/etc/mosdns/rule/hosts.txt"

- tag: geosite_cn
type: domain_set
args:
files:
- "/etc/mosdns/unpack/geosite_cn.txt"

- tag: geoip_cn
type: ip_set
args:
files:
- "/etc/mosdns/unpack/geoip_cn.txt"

- tag: geosite_no_cn
type: domain_set
args:
files:
- "/etc/mosdns/unpack/geosite_geolocation-!cn.txt"

- tag: whitelist
type: domain_set
args:
files:
- "/etc/mosdns/rule/whitelist.txt"

- tag: blocklist
type: domain_set
args:
files:
- "/etc/mosdns/rule/blocklist.txt"

- tag: greylist
type: domain_set
args:
files:
- "/etc/mosdns/rule/greylist.txt"

- tag: forward_cf
type: forward
args:
concurrent: 1
upstreams:
- addr: "tls://8.8.8.8:853"
idle_timeout: 3600000

- tag: forward_local
type: forward
args:
concurrent: 1
upstreams:
- addr: "tls://223.5.5.5:853"
idle_timeout: 3600000

- tag: forward_remote
type: forward
args:
concurrent: 1
upstreams:
- addr: "tcp://127.0.0.1:7874" #sing-box fakeip server

- tag: main_sequence
type: sequence
args:
- matches: "!qtype 1 16 28 33"
exec: reject 0
- exec: $hosts
- matches: has_resp
exec: ttl 600000
- matches: has_resp
exec: accept
- matches: qname $blocklist
exec: reject 0
- matches: qname $whitelist
exec: $forward_local
- matches: has_resp
exec: accept
- matches: qname $greylist
exec: $forward_remote
- matches: has_resp
exec: accept
- matches: qname $geosite_cn
exec: $forward_local
- matches: has_resp
exec: accept
- matches: "qtype 16 33"
exec: $forward_cf
- matches: has_resp
exec: accept
- matches: qname $geosite_no_cn
exec: $forward_remote
- matches: has_resp
exec: accept
- exec: ecs 你所在城市的 IPV4 地址
- exec: $forward_cf
- matches: "!resp_ip 0.0.0.0/0 2000::/3"
exec: accept
- matches: "!resp_ip $geoip_cn"
exec: $forward_remote

- tag: udp_server
type: udp_server
args:
entry: main_sequence
listen: ":5454"

- tag: tcp_server
type: tcp_server
args:
entry: main_sequence
listen: ":5454"
chenbin36255
118 天前
@maybeonly #16 直连是 real ip 的 把非 cn 的做 fake ip
你的方案是个高度定制化且复杂的网络架构 而且纯 cli 的配置对于大部分用户来说可能过于复杂了
samIIsun
118 天前
在用方案:mwan3,dnsmasq,ipset

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1066895

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX