1. 项目背景与核心需求
最近在排查一个网络问题时,发现某些网站的访问经常出现异常。经过抓包分析,确认是DNS解析结果被篡改导致的。传统UDP协议的DNS查询存在明显的安全缺陷,而基于HTTPS的DNS-over-HTTPS(DoH)技术能有效解决这个问题。
在Linux环境下手动配置DoH需要修改多个系统文件,过程繁琐且容易出错。于是开发了这个一键配置脚本,帮助Linux用户快速部署安全的DNS解析方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. DoH技术原理详解
2.1 传统DNS的安全隐患
传统DNS协议采用UDP明文传输,存在三大安全隐患:
- 中间人攻击:攻击者可以篡改DNS响应报文
- 监听风险:所有查询内容都可被第三方监控
- 缓存投毒:恶意DNS服务器可能返回错误记录
2.2 DoH的核心优势
DNS-over-HTTPS通过以下机制提升安全性:
- 传输加密:所有查询通过HTTPS加密传输
- 身份验证:基于TLS证书验证服务器身份
- 数据完整:防止响应内容在传输中被篡改
主流DoH服务提供商包括:
- Cloudflare (1.1.1.1)
- Google (8.8.8.8)
- 阿里云DoH
- 腾讯云DoH
3. 一键配置脚本实现
3.1 环境准备
支持的系统:
- Ubuntu/Debian
- CentOS/RHEL
- Arch Linux
- Fedora
依赖组件:
- curl (用于测试DoH连接)
- systemd-resolved (Ubuntu 18.04+)
- NetworkManager (可选)
3.2 脚本核心功能
bash复制#!/bin/bash
# 配置Cloudflare DoH
configure_cloudflare() {
echo "配置Cloudflare DoH服务器..."
sudo mkdir -p /etc/systemd/resolved.conf.d
sudo tee /etc/systemd/resolved.conf.d/doh.conf > /dev/null <<EOF
[Resolve]
DNS=1.1.1.1 1.0.0.1
DNSOverTLS=yes
FallbackDNS=8.8.8.8 8.8.4.4
EOF
}
# 测试DNS解析
test_dns() {
echo "测试DoH连接..."
if ! dig +short @1.1.1.1 example.com > /dev/null; then
echo "错误:无法连接到DoH服务器"
exit 1
fi
echo "测试通过!"
}
3.3 完整部署流程
- 下载脚本并赋予执行权限:
bash复制wget https://example.com/install-doh.sh
chmod +x install-doh.sh
- 执行安装:
bash复制sudo ./install-doh.sh
- 重启网络服务:
bash复制sudo systemctl restart systemd-resolved
- 验证配置:
bash复制systemd-resolve --status | grep "DNS Servers"
4. 高级配置选项
4.1 自定义DoH服务器
编辑/etc/systemd/resolved.conf.d/doh.conf:
code复制[Resolve]
DNS=自定义DoH_IP
DNSOverTLS=yes
4.2 禁用IPv6解析
在配置文件中添加:
code复制Domains=~.
LLMNR=no
MulticastDNS=no
DNSSEC=yes
DNSOverTLS=yes
4.3 企业网络适配
对于需要代理的企业网络:
bash复制sudo mkdir -p /etc/systemd/system/systemd-resolved.service.d/
sudo tee /etc/systemd/system/systemd-resolved.service.d/proxy.conf > /dev/null <<EOF
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
EOF
5. 常见问题排查
5.1 连接超时问题
检查防火墙设置:
bash复制sudo ufw allow out 443/tcp
sudo ufw allow out 853/tcp
5.2 解析速度慢
测试不同DoH提供商响应时间:
bash复制for provider in 1.1.1.1 8.8.8.8 9.9.9.9; do
echo "测试 $provider:"
time dig +short @$provider example.com
done
5.3 服务不生效
检查systemd-resolved状态:
bash复制journalctl -u systemd-resolved -f
6. 安全加固建议
- 启用DNSSEC验证:
bash复制sudo sed -i 's/#DNSSEC=/DNSSEC=yes/g' /etc/systemd/resolved.conf
- 禁用传统DNS:
bash复制sudo mv /etc/resolv.conf /etc/resolv.conf.bak
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
- 定期更新根证书:
bash复制sudo apt update && sudo apt install --only-upgrade ca-certificates
7. 性能优化方案
7.1 启用本地缓存
安装dnsmasq作为本地缓存:
bash复制sudo apt install dnsmasq
sudo systemctl enable dnsmasq
配置dnsmasq:
bash复制echo "cache-size=1000" | sudo tee -a /etc/dnsmasq.conf
7.2 多服务器负载均衡
创建/etc/systemd/resolved.conf.d/fallback.conf:
code复制[Resolve]
DNS=1.1.1.1 8.8.8.8 9.9.9.9
DNSOverTLS=yes
7.3 监控DNS性能
使用netdata实时监控:
bash复制docker run -d --name=netdata \
-p 19999:19999 \
-v /etc/passwd:/host/etc/passwd:ro \
-v /etc/group:/host/etc/group:ro \
-v /proc:/host/proc:ro \
-v /sys:/host/sys:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--cap-add SYS_PTRACE \
--security-opt apparmor=unconfined \
netdata/netdata
8. 不同发行版适配
8.1 Ubuntu/Debian方案
bash复制sudo apt install resolvconf
sudo tee /etc/resolvconf/resolv.conf.d/head > /dev/null <<EOF
nameserver 1.1.1.1
nameserver 1.0.0.1
options use-vc
EOF
8.2 CentOS/RHEL方案
bash复制sudo yum install NetworkManager
sudo nmcli con mod eth0 ipv4.dns "1.1.1.1 1.0.0.1"
sudo nmcli con mod eth0 ipv4.ignore-auto-dns yes
8.3 Arch Linux方案
安装dns-over-https:
bash复制yay -S dns-over-https
sudo systemctl enable doh-client
9. 移动环境适配
9.1 笔记本电脑配置
创建网络切换脚本:
bash复制#!/bin/bash
case "$1" in
home)
sudo resolvectl dns wlan0 1.1.1.1
;;
office)
sudo resolvectl dns eth0 内部DNS_IP
;;
esac
9.2 双网卡绑定配置
bash复制sudo tee /etc/NetworkManager/dispatcher.d/99-doh <<'EOF'
#!/bin/bash
interface=$1
status=$2
if [ "$status" = "up" ]; then
case "$interface" in
eth0)
resolvectl dns $interface 1.1.1.1
;;
wlan0)
resolvectl dns $interface 8.8.8.8
;;
esac
fi
EOF
10. 企业级部署建议
- 搭建内部DoH中继:
bash复制docker run -d --name doh-proxy \
-p 53:53/udp \
-p 53:53/tcp \
-p 80:80 \
-e UPSTREAM_DNS_SERVER="1.1.1.1" \
satishweb/doh-proxy
- 配置ACL访问控制:
bash复制iptables -A INPUT -p tcp --dport 53 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j DROP
iptables -A INPUT -p udp --dport 53 -j DROP
- 日志审计配置:
bash复制sudo tee /etc/rsyslog.d/doh.conf > /dev/null <<EOF
:msg, contains, "DNS" /var/log/dns.log
EOF
