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

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

  •  
  •   chenbin36255 · 122 天前 · 4954 次点击
    这是一个创建于 122 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
       122 天前
    mosdns yyds
    povsister
        2
    povsister  
       122 天前 via iPhone
    fakeip 谈不上精巧,现在一堆软件都提供打包解决方案。这个方案核心不在于要不要自建 dns ,核心在于你如何做 dns 分流,国内用运营商 dns 总是最好的,海外直接走梯子过 cf/google 落地区域的 dns 就行了。
    lxh1983
        3
    lxh1983  
       122 天前
    这相当于为了喝口牛奶养了头奶牛
    chenbin36255
        4
    chenbin36255  
    OP
       122 天前
    @povsister 个人感觉还是不错的思路 至少这个分流可以做到完全不影响国内的访问 所有非 CN 域名解析通过静态路由全部由 fake ip 网关处理
    araaaa
        5
    araaaa  
       122 天前
    自己写的监听 127.0.0.1:53 ,通过 adblock 列表转到不同的 dns server 上
    chenbin36255
        6
    chenbin36255  
    OP
       122 天前
    @povsister 运营商的 dns 还是担忧劫持的风险 公共 dns 又纷纷限速 自建的话还是比较需要的
    chenbin36255
        7
    chenbin36255  
    OP
       122 天前
    @araaaa 国内的流量也是经过科学网关出吗
    lin41411
        8
    lin41411  
       122 天前
    @chenbin36255 #6
    劫持可能只占你日常访问的 0.01%甚至远远低于 0.01%,单独把 0.01%的域名单独指定可信的 dns 来解析就好。不要大费周章去解决那些低概率事件。
    araaaa
        9
    araaaa  
       122 天前
    @chenbin36255 #7 不过,国外 dns server 过
    maybeonly
        10
    maybeonly  
       122 天前
    分流说白了都是名单问题。
    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  
       122 天前
    如果真的非常需要每次请求都精确且实时,就建吧
    我就 client 改个 TTL 直接 cache 一天,就第一次慢而已,二次开始就快了,如果出现错误就重启清 cache 再来
    要走梯子的那些也跟这个无关
    shenjinpeng
        12
    shenjinpeng  
       122 天前
    对分流需求不高, 一般回去就刷刷视频玩玩游戏, 只是用 adguard home 代替了 hosts 文件 让局域网所有设备直接解析跳转方便开发 ,并且拦截了部分广告 dns
    chenbin36255
        13
    chenbin36255  
    OP
       122 天前
    @maybeonly 我可能没有说清楚 我说的精巧不是 dns 的分流
    是通过 dns 把非大陆 IP 解析成 FAKE IP 然后直接转发到科学网关
    实现了国内流量直接走主路由 外网流量走科学网关
    不需要让科学网关处理国内的流量 降低延迟和性能
    而且不会有节点挂掉全家断网的风险
    这个思路是比较巧妙的
    povsister
        14
    povsister  
       122 天前 via iPhone
    @maybeonly
    正解,用一份黑名单,无条件走海外 dns ,剩下的走国内,不用去赌那 0.0001%的漏网之鱼。
    不过,黑名单以外的网站我是用国内解析一遍,如果是国内 ip 就采用,如果是海外 ip ,就用地理位置较近的海外机器再解析一遍,以海外结果为准。
    dns 泄露?只要你不是 50w 真有人查这东西吗
    maybeonly
        15
    maybeonly  
       122 天前
    @povsister 这是一个可以考虑的权衡方向。不过我选择不告诉境内我在解析什么,怕反炸上门。
    maybeonly
        16
    maybeonly  
       122 天前
    @chenbin36255
    emmmm 直连用 fakeip 就更奇怪了
    所以说有可靠 ip 列表的前提下用路由表直接分流啊
    路由表本来就可以让一部分流量直接过去的
    科学网关坏掉为什么会全家断网?因为大部分梯子都是为了单机而不是路由器上用的
    所以他们实际上做了调度器+隧道的组合,而良好的路由器上运行的梯子应该把调度器和隧道分开,
    甚至把不过梯部分和梯子调度器进一步分开。
    关于这方面的问题,我的解决方案是 /t/1034955
    yyysuo
        17
    yyysuo  
       122 天前
    fake 网关现在已经很流行了,opn 、op 、爱快、ros 都可以实现,op 最简单。
    yyysuo
        18
    yyysuo  
       122 天前
    粘个 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
       122 天前
    @maybeonly #16 直连是 real ip 的 把非 cn 的做 fake ip
    你的方案是个高度定制化且复杂的网络架构 而且纯 cli 的配置对于大部分用户来说可能过于复杂了
    samIIsun
        20
    samIIsun  
       122 天前
    在用方案:mwan3,dnsmasq,ipset
    winson030
        21
    winson030  
       122 天前 via iPhone
    @maybeonly 想问一下 openwrt 能不能实现这个?
    samIIsun
        22
    samIIsun  
       122 天前
    @winson030 (不请自答) 可以
    tsanie
        23
    tsanie  
       122 天前
    在墙内解析获得一个黑名单域名的真实 ip 没有必要且耗时,所以 fakeip 才能流行起来。
    sleepm
        24
    sleepm  
       122 天前
    没必要
    fakeip 是因为
    访问一个网站,域名解析为 ip
    如果 dns 返回的 ip 是被污染的,体验不好(打不开)
    如果没有被污染,但是 ecs 是相对于用户的,不是相对于落地,体验也不好(速度慢)
    fakeip 把域名对应关系交给内核,但是直连的体验就不行了
    dns 分别解析,就可以不需要 fakeip ( mihomo dns mode 支持 normal ,也就是单纯 dns 转发)
    运营商的 dns ,因为不止你一个用户在用,同地区几百上千个人在用,大部分解析都直接命中缓存,速度最快,结果最优
    yyysuo
        25
    yyysuo  
       122 天前
    @povsister 最近也尝试了用国内 dns 去解析列表外的域名,发现还不如好的代理呢,小众的域名,国内 dns 查起来也很慢的。
    zhu327808
        26
    zhu327808  
       122 天前
    完全没必要,只算国内网站的话,运营商 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  
       122 天前
    @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  
       122 天前
    @yyysuo 列表外直接走默认运营商 dns ,ipv4 也好,ipv6 也好都没关系的
    povsister
        29
    povsister  
       122 天前 via iPhone
    @yyysuo 国内 dns 先解析一次的作用,是在不写过多 domain rule 的情况下,尽可能优选节点,同时避免 dns 污染。
    国内 dns 可以保证如果目标网站国内有节点,可以直接访问,同时碰到 dns 污染( 99%的 dns 污染返回的是海外 ip )时,会自动调用海外 dns
    frankilla
        30
    frankilla  
       122 天前
    我的看法就是瞎折腾。
    winson030
        31
    winson030  
       122 天前 via iPhone
    @samIIsun 卧槽那真是太好了!可以给我几个搜索的关键词或者网页或者教程吗?我现在想实现在 op 主路由里完成国内外分流,像 router os 那样。
    zzzmode
        32
    zzzmode  
       122 天前
    构建自己的域名黑名单列表,黑名单列表的域名也没有必要再解析,直接代理服务器自己处理
    povsister
        33
    povsister  
       122 天前
    @winson030
    routeros 里,也没法实现基于域名的国内外分流啊(摊手
    maybe 大佬的方案本质是 DNS route + conn-track ,分离策略和流量隧道,二者之间依赖路由表决策,而路由表由策略层控制(即 DNS route )
    ellermister
        34
    ellermister  
       121 天前 via Android
    @zhu327808 我没有考虑到 fakeip 是因为他返回的假 ip 让我调试测试,开发时很懵逼。无法知道命中的哪台服务器。


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

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