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

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

  •  
  •   Songxwn · 127 天前 · 4036 次点击
    这是一个创建于 127 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

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