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

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

另外 DNS 解析的速度不太好判断
如何判断 dns 的解析速度和准确性呢
6765 次点击
所在节点    DNS
45 条回复
rulagiti
2024-08-22 10:33:17 +08:00
mosdns yyds
povsister
2024-08-22 13:04:10 +08:00
fakeip 谈不上精巧,现在一堆软件都提供打包解决方案。这个方案核心不在于要不要自建 dns ,核心在于你如何做 dns 分流,国内用运营商 dns 总是最好的,海外直接走梯子过 cf/google 落地区域的 dns 就行了。
Od37v61n5s89gXx8
2024-08-22 13:10:44 +08:00
这相当于为了喝口牛奶养了头奶牛
chenbin36255
2024-08-22 14:03:39 +08:00
@povsister 个人感觉还是不错的思路 至少这个分流可以做到完全不影响国内的访问 所有非 CN 域名解析通过静态路由全部由 fake ip 网关处理
araaaa
2024-08-22 14:04:44 +08:00
自己写的监听 127.0.0.1:53 ,通过 adblock 列表转到不同的 dns server 上
chenbin36255
2024-08-22 14:04:55 +08:00
@povsister 运营商的 dns 还是担忧劫持的风险 公共 dns 又纷纷限速 自建的话还是比较需要的
chenbin36255
2024-08-22 14:25:50 +08:00
@araaaa 国内的流量也是经过科学网关出吗
lin41411
2024-08-22 14:33:36 +08:00
@chenbin36255 #6
劫持可能只占你日常访问的 0.01%甚至远远低于 0.01%,单独把 0.01%的域名单独指定可信的 dns 来解析就好。不要大费周章去解决那些低概率事件。
araaaa
2024-08-22 14:33:57 +08:00
@chenbin36255 #7 不过,国外 dns server 过
maybeonly
2024-08-22 14:53:30 +08:00
分流说白了都是名单问题。
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
2024-08-22 15:02:14 +08:00
如果真的非常需要每次请求都精确且实时,就建吧
我就 client 改个 TTL 直接 cache 一天,就第一次慢而已,二次开始就快了,如果出现错误就重启清 cache 再来
要走梯子的那些也跟这个无关
shenjinpeng
2024-08-22 15:04:30 +08:00
对分流需求不高, 一般回去就刷刷视频玩玩游戏, 只是用 adguard home 代替了 hosts 文件 让局域网所有设备直接解析跳转方便开发 ,并且拦截了部分广告 dns
chenbin36255
2024-08-22 15:10:37 +08:00
@maybeonly 我可能没有说清楚 我说的精巧不是 dns 的分流
是通过 dns 把非大陆 IP 解析成 FAKE IP 然后直接转发到科学网关
实现了国内流量直接走主路由 外网流量走科学网关
不需要让科学网关处理国内的流量 降低延迟和性能
而且不会有节点挂掉全家断网的风险
这个思路是比较巧妙的
povsister
2024-08-22 15:10:55 +08:00
@maybeonly
正解,用一份黑名单,无条件走海外 dns ,剩下的走国内,不用去赌那 0.0001%的漏网之鱼。
不过,黑名单以外的网站我是用国内解析一遍,如果是国内 ip 就采用,如果是海外 ip ,就用地理位置较近的海外机器再解析一遍,以海外结果为准。
dns 泄露?只要你不是 50w 真有人查这东西吗
maybeonly
2024-08-22 15:13:48 +08:00
@povsister 这是一个可以考虑的权衡方向。不过我选择不告诉境内我在解析什么,怕反炸上门。
maybeonly
2024-08-22 15:17:21 +08:00
@chenbin36255
emmmm 直连用 fakeip 就更奇怪了
所以说有可靠 ip 列表的前提下用路由表直接分流啊
路由表本来就可以让一部分流量直接过去的
科学网关坏掉为什么会全家断网?因为大部分梯子都是为了单机而不是路由器上用的
所以他们实际上做了调度器+隧道的组合,而良好的路由器上运行的梯子应该把调度器和隧道分开,
甚至把不过梯部分和梯子调度器进一步分开。
关于这方面的问题,我的解决方案是 /t/1034955
yyysuo
2024-08-22 15:19:42 +08:00
fake 网关现在已经很流行了,opn 、op 、爱快、ros 都可以实现,op 最简单。
yyysuo
2024-08-22 15:23:21 +08:00
粘个 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
2024-08-22 15:27:44 +08:00
@maybeonly #16 直连是 real ip 的 把非 cn 的做 fake ip
你的方案是个高度定制化且复杂的网络架构 而且纯 cli 的配置对于大部分用户来说可能过于复杂了
samIIsun
2024-08-22 15:47:37 +08:00
在用方案: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