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域名服务商为例,先安装对应插件:
然后创建Cloudflare API配置文件(替换成你的API密钥):sudo apt install python3-certbot-dns-cloudflare
配置文件权限: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.inisudo 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.confserver: # 监听所有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,修正之前的配置问题即可:
- 安装BIND9:
sudo apt install bind9 bind9utils bind9-doc - 编辑
/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; }; }; - 重启服务并测试:
sudo systemctl restart bind9 && sudo systemctl enable bind9 dig @dns.yourdomain.com example.com +tls
备注:内容来源于stack exchange,提问作者Wali Haider

