You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu Server 22.04.4下搭建带Let’s Encrypt SSL/TLS证书的安全本地DNS服务器的技术咨询

Ubuntu Server 22.04.4下搭建带Let’s Encrypt SSL/TLS证书的安全本地DNS服务器的技术咨询

嘿,针对你在Ubuntu Server 22.04.4上搭建带Let’s Encrypt SSL/TLS的安全本地DNS服务器的需求,结合你之前用Webmin+BIND9踩过的坑,我给你梳理一套实用的方案,分点解答你的问题:

一、搭建带SSL/TLS的安全本地DNS服务器的最佳路径

整体思路是:选择一款安全、高性能的DNS软件 → 配置域名与Let’s Encrypt证书 → 开启DNS-over-TLS(DoT)或DNS-over-HTTPS(DoH)加密 → 优化性能与访问控制。

核心要注意两点:一是必须拥有一个公网可解析的域名(Let’s Encrypt需要验证域名所有权),二是确保服务器防火墙开放必要端口(53/UDP/TCP用于常规DNS,853/TCP用于DoT,443/TCP用于DoH)。

二、如何用Let’s Encrypt证书保障DNS服务器安全

Let’s Encrypt的证书是免费且受信任的,获取和配置步骤如下:

1. 安装Certbot工具

首先更新包并安装Certbot:

sudo apt update && sudo apt install certbot

2. 获取域名证书

你需要为DNS服务器绑定一个子域名(比如dns.yourdomain.com),然后根据你的网络环境选择验证方式:

  • HTTP-01挑战(适合有公网IP且80端口可访问的情况):
    运行以下命令,Certbot会临时启动一个web服务完成验证:
    sudo certbot certonly --standalone -d dns.yourdomain.com
    
  • DNS-01挑战(适合无公网IP或80端口被占用的情况):
    以Cloudflare域名服务商为例,先安装对应插件:
    sudo apt install python3-certbot-dns-cloudflare
    
    然后创建Cloudflare API配置文件(替换成你的API密钥):
    sudo nano /etc/letsencrypt/cloudflare.ini
    # 写入以下内容
    dns_cloudflare_email = your-cloudflare-email@example.com
    dns_cloudflare_api_key = your-cloudflare-global-api-key
    
    配置文件权限:
    sudo chmod 600 /etc/letsencrypt/cloudflare.ini
    
    最后获取证书:
    sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini -d dns.yourdomain.com
    

3. 证书自动续约

Let’s Encrypt证书有效期90天,添加 cron 任务自动续约并重启DNS服务:

sudo crontab -e
# 添加以下内容
0 0 1 * * /usr/bin/certbot renew --quiet && sudo systemctl restart unbound  # 替换成你的DNS服务名称,比如bind9

三、BIND9的性能与安全替代方案

如果你觉得BIND9配置繁琐或性能达不到预期,这几款工具更适合本地场景:

1. Unbound(推荐)

轻量、专注递归解析,默认安全配置拉满,支持DoT/DoH,性能优异,非常适合本地DNS服务器。

搭建步骤:

  • 安装Unbound:
    sudo apt install unbound
    
  • 备份默认配置并创建自定义配置文件:
    sudo cp /etc/unbound/unbound.conf /etc/unbound/unbound.conf.bak
    sudo nano /etc/unbound/unbound.conf.d/secure-local-dns.conf
    
    写入以下配置(替换你的局域网段和域名):
    server:
        # 监听所有IP
        interface: 0.0.0.0
        interface: ::0
        # 允许本地和局域网访问
        access-control: 127.0.0.0/8 allow
        access-control: 192.168.1.0/24 allow  # 替换成你的局域网段
        # 常规DNS端口
        port: 53
        # 开启DNS-over-TLS
        tls-port: 853
        tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
        certificate: /etc/letsencrypt/live/dns.yourdomain.com/fullchain.pem
        private-key: /etc/letsencrypt/live/dns.yourdomain.com/privkey.pem
        # 开启DNSSEC验证(防止DNS劫持)
        auto-trust-anchor-file: "/var/lib/unbound/root.key"
        # 性能优化
        num-threads: 4
        msg-cache-size: 64m
        rrset-cache-size: 128m
        # 隐藏服务器信息,增强安全性
        hide-identity: yes
        hide-version: yes
    
  • 生成DNSSEC根密钥:
    sudo unbound-anchor
    
  • 验证配置并重启服务:
    sudo unbound-checkconf
    sudo systemctl restart unbound && sudo systemctl enable unbound
    
  • 测试DoT连接:
    dig @dns.yourdomain.com example.com +tls
    

2. Knot DNS

高性能、支持DNSSEC,配置简洁,适合需要管理自定义域名区域的场景,资源占用比BIND9低。

3. CoreDNS

云原生友好,通过插件扩展功能(比如支持DoT/DoH、自定义域名解析),适合有容器或K8s环境的用户。

四、如果你仍想使用BIND9

Ubuntu 22.04的BIND9(9.18版本)已经支持DoT,修正之前的配置问题即可:

  1. 安装BIND9:
    sudo apt install bind9 bind9utils bind9-doc
    
  2. 编辑/etc/bind/named.conf.options,添加TLS配置:
    options {
        directory "/var/cache/bind";
        forwarders {
            8.8.8.8;
            8.8.4.4;
        };
        dnssec-validation auto;
        listen-on-v6 { any; };
        # 开启DoT
        tls-cert-file "/etc/letsencrypt/live/dns.yourdomain.com/fullchain.pem";
        tls-key-file "/etc/letsencrypt/live/dns.yourdomain.com/privkey.pem";
        tls-port 853;
        # 允许局域网访问
        allow-query { localhost; 192.168.1.0/24; };
    };
    
  3. 重启服务并测试:
    sudo systemctl restart bind9 && sudo systemctl enable bind9
    dig @dns.yourdomain.com example.com +tls
    

备注:内容来源于stack exchange,提问作者Wali Haider

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:33:02