linux中配置doh需通过cloudflared代理实现:禁用systemd-resolved,锁定/etc/resolv.conf指向127.0.0.1,运行cloudflared proxy-dns监听本地53端口并上联阿里云doh地址,再配置为systemd服务持久运行,最后用dig、tcpdump和chaos查询验证加密解析生效。

Linux中配置DoH(DNS over HTTPS)能有效防止DNS查询被监听、劫持或污染,核心思路是用加密的HTTPS通道替代传统明文DNS(端口53),让解析流量看起来像普通网页访问。关键不是直接改/etc/resolv.conf填一个DoH地址——那行不通,因为系统解析器不支持原生DoH。真正可行的方式是:在本地启动一个DoH代理服务(如cloudflared),让它监听127.0.0.1:53或其它端口,再把系统DNS指向它。
禁用systemd-resolved避免端口冲突
现代Linux发行版(Ubuntu 20.04+、Debian 12、Fedora等)默认启用systemd-resolved,它会独占127.0.0.53:53并接管/etc/resolv.conf,与DoH代理冲突。
- 停用并禁止开机自启:
sudo systemctl disable --now systemd-resolved - 删除软链接并重建静态
resolv.conf:sudo rm -f /etc/resolv.conf && echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf - 锁定文件防覆盖:
sudo chattr +i /etc/resolv.conf
用cloudflared快速部署DoH代理
cloudflared是Cloudflare官方维护的轻量级工具,支持DoH/DoT,安装简单、无需额外依赖,适合大多数桌面和服务器环境。
- Ubuntu/Debian添加官方源安装:
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo gpg --dearmor -o /usr/share/keyrings/cloudflare-main.gpgecho "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared jammy main" | sudo tee /etc/apt/sources.list.d/cloudflared.listsudo apt update && sudo apt install cloudflared - 启动DoH代理(监听本地53端口,使用阿里DNS):
sudo cloudflared proxy-dns --address 127.0.0.1 --port 53 \--upstream https://223.5.5.5/dns-query \--upstream https://223.6.6.6/dns-query - 验证是否生效:
dig @127.0.0.1 google.com +short,有IP返回即成功
可选:设置为系统服务长期运行
手动运行命令会在终端退出后停止服务。建议配置为systemd服务,开机自启且后台运行。
- 创建服务文件:
sudo nano /etc/systemd/system/cloudflared-dns.service - 写入以下内容(注意路径和上游DNS按需调整):
[Unit]
Description=Cloudflared DNS-over-HTTPS Proxy
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/cloudflared proxy-dns --address 127.0.0.1 --port 53 \
--upstream https://223.5.5.5/dns-query \
--upstream https://223.6.6.6/dns-query
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target - 启用并启动:
sudo systemctl daemon-reload && sudo systemctl enable --now cloudflared-dns
验证与日常检查要点
配置完成后别只看dig通不通,还要确认是否真走加密通道、没被绕过。
- 查进程监听:
sudo ss -tuln | grep ':53',应看到cloudflared在127.0.0.1:53上监听 - 抓包确认加密:
sudo tcpdump -i lo port 443 and host 223.5.5.5 -c 2,执行一次dig example.com,应捕获到HTTPS请求(非53端口明文) - 检查实际解析来源:
dig CHAOS TXT id.server @127.0.0.1,返回结果应含cloudflared或上游DNS标识,而非systemd-resolved - 留意时间同步:
timedatectl status,若系统时间偏差过大,DoH证书校验会失败导致解析中断











