V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
Songxwn
V2EX  ›  程序员

建立自有递归 DNS 服务器 - 让 DNS 解析无限速

  •  
  •   Songxwn · 2024-07-26 10:20:11 +08:00 · 4965 次点击
    这是一个创建于 399 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

    由于最近国内的阿里的公共 DNS 服务器也进行了限速,之前腾讯的 DNS 也限速了。

    所以本教程教大家自建一个递归 DNS 服务器,让所有 DNS 查询请求向权威服务器进行查询。

    DNS 服务器软件使用 Unbound

    系统使用 Rocky Linux 8/9

    关闭防火墙和 SElinux

    !注意:国内递归 DNS 服务器若对公网开放,需要进行备案。

    递归 DNS 服务器与权威 DNS 服务器

    1.权威 DNS:

    权威 DNS 是经过上一级授权对域名进行解析的服务器,同时它可以把解析授权转授给其他人,如 COM 顶级服务器可以授权 dns.com 这个域名的的权威服务器为 NS.ABC.COM ,同时 NS.ABC.COM 还可以把授权转授给 NS.DDD.COM ,这样 NS.DDD.COM 就成了 ABC.COM 实际上的权威服务器了。平时我们解析域名的结果都源自权威 DNS 。比如 dns.com 的权威 DNS 服务器就是 ns1.dns.comns2.dns.com 。然后通过 ns1.dns.com 即可查询域名的具体 IP 地址或其他记录。

    2.递归 DNS:

    负责接受用户对任意域名查询,并返回结果给用户。递归 DNS 可以缓存结果以避免重复向上查询。我们平时使用最多的就是这类 DNS ,他对公众开放服务,一般由网络运营商提供,大家都自己可以架递归 DNS 提供服务。递归 DNS 一定要有可靠的互联网连接方可使用。比如谷歌的 8.8.8.8 和 8.8.4.4 以及 114 的 114.114.114.114 和 114.114.115.115 都属于这一类 DNS 。你本地电脑上设置的 DNS 就是这类 DNS 。

    3.转发 DNS:

    负责接受用户查询,并返回结果给用户。但这个结果不是按标准的域名解析过程得到的,而是直接把递归 DNS 的结果转发给用户。它也具备缓存功能。他主要使用在没有直接的互联网连接,但可以连接到一个递归 DNS 那里,这时使用转发 DNS 就比较合适。其缺陷是:直接受递归 DNS 的影响,服务品质较差。比如我们用的路由器里面的 DNS 就是这一类,用路由器的朋友可以看下本地电脑的 DNS 一般都是 192.168.1.1 。

    查看 DNS 递归服务器解析过程跟踪

    安装工具、关闭防火墙、关闭 SELinux

    
    systemctl disable --now firewalld
    
    sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config && setenforce 0
    
    dnf install tree vim bash-completion tar bind-utils -y
    
    
    

    dig 查看

    dig +trace baidu.com
    
    
    ; <<>> DiG 9.11.36-RedHat-9.11.36-5.el8_7.2 <<>> +trace baidu.com
    ;; global options: +cmd
    .			9981	IN	NS	g.root-servers.net.
    .			9981	IN	NS	j.root-servers.net.
    .			9981	IN	NS	c.root-servers.net.
    .			9981	IN	NS	m.root-servers.net.
    .			9981	IN	NS	i.root-servers.net.
    .			9981	IN	NS	k.root-servers.net.
    .			9981	IN	NS	b.root-servers.net.
    .			9981	IN	NS	f.root-servers.net.
    .			9981	IN	NS	d.root-servers.net.
    .			9981	IN	NS	l.root-servers.net.
    .			9981	IN	NS	e.root-servers.net.
    .			9981	IN	NS	h.root-servers.net.
    .			9981	IN	NS	a.root-servers.net.
    
    # 通过 114 获取到 root C 的 IP 地址
    
    ;; Received 824 bytes from 114.114.114.114#53(114.114.114.114) in 0 ms
    
    com.			172800	IN	NS	a.gtld-servers.net.
    com.			172800	IN	NS	d.gtld-servers.net.
    com.			172800	IN	NS	l.gtld-servers.net.
    com.			172800	IN	NS	c.gtld-servers.net.
    com.			172800	IN	NS	m.gtld-servers.net.
    com.			172800	IN	NS	h.gtld-servers.net.
    com.			172800	IN	NS	e.gtld-servers.net.
    com.			172800	IN	NS	j.gtld-servers.net.
    com.			172800	IN	NS	b.gtld-servers.net.
    com.			172800	IN	NS	i.gtld-servers.net.
    com.			172800	IN	NS	g.gtld-servers.net.
    com.			172800	IN	NS	f.gtld-servers.net.
    com.			172800	IN	NS	k.gtld-servers.net.
    
    # 通过 root C 服务器,获取到所有.com 权威服务器
    
    ;; Received 1197 bytes from 192.33.4.12#53(c.root-servers.net) in 197 ms
    
    baidu.com.		172800	IN	NS	ns2.baidu.com.
    baidu.com.		172800	IN	NS	ns3.baidu.com.
    baidu.com.		172800	IN	NS	ns4.baidu.com.
    baidu.com.		172800	IN	NS	ns1.baidu.com.
    baidu.com.		172800	IN	NS	ns7.baidu.com.
    
    # 通过.com 权威服务器,获取到 baidu.com 的权威服务器。
    
    ;; Received 845 bytes from 192.43.172.30#53(i.gtld-servers.net) in 237 ms
    
    baidu.com.		600	IN	A	39.156.66.10
    baidu.com.		600	IN	A	110.242.68.66
    baidu.com.		86400	IN	NS	dns.baidu.com.
    baidu.com.		86400	IN	NS	ns7.baidu.com.
    baidu.com.		86400	IN	NS	ns4.baidu.com.
    baidu.com.		86400	IN	NS	ns2.baidu.com.
    baidu.com.		86400	IN	NS	ns3.baidu.com.
    
    # 通过 ns3.baidu.com 权威服务器,获取到 baidu.com 的 ip 解析为 112.80.248.64
    
    ;; Received 356 bytes from 112.80.248.64#53(ns3.baidu.com) in 26 ms
    
    

    安装

    dnf install unbound -y
    
    

    配置

    vim /etc/unbound/unbound.conf
    
    server:
        interface: 0.0.0.0
        interface: ::0
        
        access-control: 0.0.0.0/0 allow
        access-control: ::/0 allow
        
        
    # 在 server 下,修改如上配置,监听所有 IPv4 和 IPv6 地址,和允许所有 IPv4 地址和 IPv6 访问使用 DNS 服务器。    
    
    

    启动和验证

    systemctl enable --now unbound
    
    # 启动服务并设置开机启动
    
    systemctl status unbound
    
    # 查看服务状态
    
    dnf install bind-utils -y
    
    dig @localhost www.qq.com
    
    # 安装 dig ,指定本地 dns 服务器,查询域名测试可用性。
    
    dig +short TXT whoami.ds.akahelp.net  @127.0.0.1
    
    # 查询 dns 服务器访问权威服务器使用的公网 IP 。
    
    

    抓包验证

    tcpdump -i eth0  port domain -w ./dns.pcap 
    
    # 可在服务器指定接口抓包 dns 报文进行分析,使用 Wireshark 打开。
    
    

    博客

    https://songxwn.com/

    技术交流群

    发送邮件到 ➡️ [email protected]

    或者关注 WX 公众号:网工格物

    微信扫码

    32 条回复    2024-07-27 21:06:35 +08:00
    hefish
        1
    hefish  
       2024-07-26 10:30:32 +08:00
    直接用 bind 也可以吧。
    brader
        2
    brader  
       2024-07-26 10:33:59 +08:00
    那么问题来了,备案这关怎么过
    silverwolf
        3
    silverwolf  
       2024-07-26 10:34:06 +08:00   ❤️ 1
    用 AdGuard Home
    xiaoz
        4
    xiaoz  
       2024-07-26 10:34:26 +08:00
    直接用 adguardhome ,docker 就搞定了,还可以开启广告屏蔽。
    xiaoz
        5
    xiaoz  
       2024-07-26 10:34:42 +08:00
    @xiaoz 同时还自带 WEB 管理界面。
    DAPTX4869
        6
    DAPTX4869  
       2024-07-26 10:41:21 +08:00
    @xiaoz #4 adg 要是能用自签证书就完美了
    zliea
        7
    zliea  
       2024-07-26 10:41:45 +08:00
    @xiaoz adguardhome 不支持指定域名使用指定域名解析服务器。。。。。
    xiaoz
        8
    xiaoz  
       2024-07-26 10:45:45 +08:00
    @DAPTX4869 #6 ,这个和自签名证书啥关系?
    xiaoz
        9
    xiaoz  
       2024-07-26 10:46:59 +08:00
    @zliea #7 ,可以的呀,过滤器里面 >> DNS 重写,你再看看呢。
    Songxwn
        10
    Songxwn  
    OP
       2024-07-26 10:49:43 +08:00
    @brader 内网用呗
    snachx
        11
    snachx  
       2024-07-26 10:50:22 +08:00
    @zliea DNS 设置里面可以自己写配置啊
    [/example.local/]94.140.14.140: 指定为特定域名的上游服务器;
    Goooooos
        12
    Goooooos  
       2024-07-26 10:51:50 +08:00
    限速主要影响到哪些方面?
    Songxwn
        13
    Songxwn  
    OP
       2024-07-26 10:52:38 +08:00
    @Goooooos 超过限速的频率就会丢弃你的 dns 解析请求
    DAPTX4869
        15
    DAPTX4869  
       2024-07-26 10:57:12 +08:00
    @xiaoz #8 doh, dot
    poorcai
        16
    poorcai  
       2024-07-26 10:58:21 +08:00 via Android
    @xiaoz 请问这个一般是安装在路由器上面的吗?
    march1993
        17
    march1993  
       2024-07-26 11:01:23 +08:00
    https://github.com/semihalev/sdns golang 的方案更方便。。。
    xiaoz
        18
    xiaoz  
       2024-07-26 11:02:34 +08:00
    @poorcai #16 ,可以安装到路由器或者 NAS 上,支持 docker 就能安装。
    daimaosix
        19
    daimaosix  
       2024-07-26 11:34:48 +08:00
    @silverwolf
    @xiaoz
    AdGuard Home 在这个帖子下似乎并无意义? AdGuard Home 需要配置上游啊,OP 说的是自建上游.....
    cubecube
        20
    cubecube  
       2024-07-26 11:50:46 +08:00
    @daimaosix 自建的上游不也得有 ta 的上游,其实是一样的
    Songxwn
        21
    Songxwn  
    OP
       2024-07-26 11:58:37 +08:00
    @cubecube 递归解释器的上游是权威 DNS 服务器,不一样的
    vsomeone
        22
    vsomeone  
       2024-07-26 12:04:33 +08:00
    afaik, 权威 DNS 服务器不支持 DoH 之类的加密 DNS ,这中间很容易被运营商劫持之类的吧
    vsomeone
        23
    vsomeone  
       2024-07-26 12:06:48 +08:00
    @vsomeone Sorry, 不是权威 DNS, 是那几个 root nameserver
    adrianzhang
        24
    adrianzhang  
       2024-07-26 12:22:10 +08:00
    @vsomeone 可以看下 dnscec 在根 dns 的运用。
    vsomeone
        25
    vsomeone  
       2024-07-26 12:28:05 +08:00
    @adrianzhang DNSSEC 只能用于验证结果的 integrity ,不能用于保证 correctness 。如果运营商劫持了,DNSSEC 也只能发现被劫持的事情,无法用来获取正确的结果
    NoOneNoBody
        26
    NoOneNoBody  
       2024-07-26 13:09:13 +08:00
    个人用没必要,改改 TTL 缓存一天够了,也就首次请求慢些,后面就从缓存读了
    maxus
        27
    maxus  
       2024-07-26 13:15:48 +08:00 via iPhone
    mosdns 也可以
    cnbatch
        28
    cnbatch  
       2024-07-26 13:46:39 +08:00
    直接来个软路由,完事
    adrianzhang
        29
    adrianzhang  
       2024-07-26 13:52:31 +08:00
    @vsomeone 运营商并不会污染 TLD ,因为这样会导致正常网站也打不开。所以 root DNS 没必要去检查 correctness.
    QlanQ
        30
    QlanQ  
       2024-07-26 15:44:58 +08:00
    用阿里和腾讯的 DNS 目的不是为了快么?自建的话,是不是解析起来就慢了?
    chenduke
        31
    chenduke  
       2024-07-26 20:41:59 +08:00
    一年 20 块就不限速了,有必要花更多的钱买个服务器搭建 dns 服务器吗?
    Songxwn
        32
    Songxwn  
    OP
       2024-07-27 21:06:35 +08:00
    @chenduke 更多的是给企业使用吧
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5231 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:39 · PVG 11:39 · LAX 20:39 · JFK 23:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.