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

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

  •  
  •   chenbin36255 · 2024-08-22 09:53:35 +08:00 · 6726 次点击
    这是一个创建于 378 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT https://blog.03k.org/post/paopaodns.html
    看了这位大佬的 blog 使用 paopaodns 自建 dns+paopaogateway FAKE IP 网关
    使用静态路由映射的方式实现国内外的域名分流
    从原理上看是很精巧的分流方式

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

    https://zhu327.github.io/2023/12/23/%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86%E5%AE%9E%E8%B7%B5%E6%8A%80%E6%9C%AF%E5%B0%8F%E7%BB%93%E4%B8%8E%E6%96%B9%E6%A1%88%E6%BC%94%E8%BF%9B/
    yyysuo
        27
    yyysuo  
       2024-08-22 17:10:18 +08:00
    @zhu327808 本质上都是按 fakeip 分流了,不管是本机用 ipt 、nft ,还是静态路由到旁路,其实没有太大的区别,都是先按域名分成 fakeip 和 realip ,体验的区别主要是分流的精细度,你的方案对于列表外的域名是怎么分的?可以看看我的
    方案

    https://v2ex.com/t/1057357

    再分享一个 nft 的规则,我简化了一下,没有写奈飞 ip 电报 ip 的国外公共 dns ip ,可以自己按需添加。

    table inet singbox {
    set local_ipv4 {
    type ipv4_addr
    flags interval
    elements = {
    28.0.0.0/8
    }
    }

    set local_ipv6 {
    type ipv6_addr
    flags interval
    elements = {
    fc00::/18
    }
    }

    set router_ipv4 {
    type ipv4_addr
    flags interval
    elements = {
    28.0.0.0/8
    }
    }

    set router_ipv6 {
    type ipv6_addr
    flags interval
    elements = {
    fc00::/18
    }
    }

    chain singbox-tproxy {
    meta l4proto udp meta mark set 1 tproxy to :7895 accept
    }

    chain singbox-mark {
    meta mark set 1
    }

    chain mangle-prerouting {
    type filter hook prerouting priority mangle; policy accept;
    ip daddr @local_ipv4 meta l4proto udp ct direction original goto singbox-tproxy
    ip6 daddr @local_ipv6 meta l4proto udp ct direction original goto singbox-tproxy
    }

    chain mangle-output {
    type route hook output priority mangle; policy accept;
    ip daddr @router_ipv4 meta l4proto udp ct direction original goto singbox-mark
    ip6 daddr @router_ipv6 meta l4proto udp ct direction original goto singbox-mark
    }

    chain nat-prerouting {
    type nat hook prerouting priority dstnat; policy accept;
    ip daddr @local_ipv4 meta l4proto tcp redirect to :7899
    ip6 daddr @local_ipv6 meta l4proto tcp redirect to :7899
    }

    chain nat-output {
    type nat hook output priority filter; policy accept;
    ip daddr @router_ipv4 meta l4proto tcp redirect to :7899
    ip6 daddr @router_ipv6 meta l4proto tcp redirect to :7899
    }
    }
    zhu327808
        28
    zhu327808  
       2024-08-22 17:20:07 +08:00
    @yyysuo 列表外直接走默认运营商 dns ,ipv4 也好,ipv6 也好都没关系的
    povsister
        29
    povsister  
       2024-08-22 17:39:50 +08:00 via iPhone
    @yyysuo 国内 dns 先解析一次的作用,是在不写过多 domain rule 的情况下,尽可能优选节点,同时避免 dns 污染。
    国内 dns 可以保证如果目标网站国内有节点,可以直接访问,同时碰到 dns 污染( 99%的 dns 污染返回的是海外 ip )时,会自动调用海外 dns
    frankilla
        30
    frankilla  
       2024-08-22 18:02:57 +08:00
    我的看法就是瞎折腾。
    winson030
        31
    winson030  
       2024-08-22 19:11:45 +08:00 via iPhone
    @samIIsun 卧槽那真是太好了!可以给我几个搜索的关键词或者网页或者教程吗?我现在想实现在 op 主路由里完成国内外分流,像 router os 那样。
    zzzmode
        32
    zzzmode  
       2024-08-22 19:16:09 +08:00
    构建自己的域名黑名单列表,黑名单列表的域名也没有必要再解析,直接代理服务器自己处理
    povsister
        33
    povsister  
       2024-08-22 19:23:10 +08:00
    @winson030
    routeros 里,也没法实现基于域名的国内外分流啊(摊手
    maybe 大佬的方案本质是 DNS route + conn-track ,分离策略和流量隧道,二者之间依赖路由表决策,而路由表由策略层控制(即 DNS route )
    ellermister
        34
    ellermister  
       2024-08-23 04:14:45 +08:00 via Android
    @zhu327808 我没有考虑到 fakeip 是因为他返回的假 ip 让我调试测试,开发时很懵逼。无法知道命中的哪台服务器。


    我现在有一个问题,我的 dns 解析的基本没问题,但是 ssrp 不会的代理我的 ipv6 。

    有没有简单的办法可以让我的部分 ipv6(黑名单/海外 ip)走代理。或者某些域名,直接不解析 ipv6(op 只有全部开启或者关闭的按钮)
    yyysuo
        35
    yyysuo  
       2024-08-23 08:10:56 +08:00
    @povsister 我没说清楚,列表外的域名,就不用写 rule 了,直接国外就行,这样不会有过多的 rule ,我比较的是带 ecs 通过代理走 8888 的速度,和列表外的域名(小众)直接走国内 dns 的情况,两者速度,8888 反而有优势(几十 ms ),国内 dns 反而有时候会上千 ms 。
    yyysuo
        36
    yyysuo  
       2024-08-23 08:13:49 +08:00
    列表外的这么搞,如果是中国 IP ,直接就使用,如果是国外 IP ,直接发 fakeip 再去远程解析就行了。
    samIIsun
        37
    samIIsun  
       2024-08-23 10:47:18 +08:00
    @winson030 FYI: https://blog.csdn.net/Cx2008Lxl/article/details/126670228
    总体用到组件 mwan3 ,dnsmasq-full ,ipset
    zhu327808
        38
    zhu327808  
       2024-08-23 11:51:35 +08:00
    @ellermister 可以看我之前的方案链接里,代理域名可以用 smartdns 把 ipv6 SOA 掉,只返回 ipv4
    batilo
        39
    batilo  
       2024-08-28 21:15:36 +08:00
    没必要吧。
    chenbin36255
        40
    chenbin36255  
    OP
       2024-08-29 11:12:39 +08:00
    @batilo paopaodns+paopaogatway 已经搭好了 在 ikuai 里面用 docker+虚拟机 算下来 30 分钟就搞定了 已经稳定运行一周 非常丝滑 不再需要 openwrt 旁路由
    orangeChu
        41
    orangeChu  
       2024-09-03 10:56:30 +08:00
    @yyysuo [ecs 你所在城市的 IPV4 地址] 请问这个地址在哪可以查询?
    Kale
        42
    Kale  
       364 天前
    可以 MOSDNS 作为 ADH 的上游。
    Earsum
        43
    Earsum  
       360 天前
    @orangeChu 你直接拿你自己的宽带公网 ip 地址/24 里面随便取一个地址就行了,如果为了隐私可以取/16 的,不过区别其实不大
    orangeChu
        44
    orangeChu  
       360 天前
    @Earsum OK ,感谢解答!
    txydhr
        45
    txydhr  
       323 天前 via iPhone
    自建解析速度很慢,很影响体验
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5291 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:11 · PVG 17:11 · LAX 02:11 · JFK 05:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.