防范DNS劫持需切断攻击链路:禁用resolver动态解析、改用静态IP或可信内网DNS(如CoreDNS/dnsmasq)并启用DNSSEC;配置resolver指向内网DNS且设valid=30s、ipv6=off;禁用proxy_pass变量解析,改用upstream resolve模式;启用proxy_ssl_server_name和proxy_ssl_trusted_certificate实现TLS层校验。

要防止 DNS 劫持影响 Nginx 反向代理转发,核心不是让 Nginx “防劫持”,而是让它不信任不可控的 DNS 响应——必须用内网可信 DNS(如 CoreDNS 或 dnsmasq)做解析,并开启缓存有效性校验,切断恶意响应生效路径。
用内网 DNS 替代公网解析
避免直接使用 8.8.8.8、114.114.114.114 等公网 DNS,它们无法验证响应真实性,且易被中间人干扰。应部署轻量内网 DNS 服务:
- 在集群内部署 CoreDNS 或 dnsmasq,监听内网地址(如 10.1.2.100:53)
- 确保该 DNS 服务器已配置上游转发并启用 DNSSEC 验证(CoreDNS 需启用 dnssec 插件;dnsmasq 需加 dnssec 和 trust-anchor 参数)
- Nginx 中只指向这个内网 DNS:
resolver 10.1.2.100 valid=30s ipv6=off;
强制启用缓存有效性控制
valid 参数不只是“缓存多久”,更是校验窗口:Nginx 仅在缓存有效期内复用结果,超期后必须重新查询并校验。搭配内网 DNS 的 DNSSEC 验证,可拒绝篡改响应:
- 设置 valid=15s–30s(高敏系统用 15s,稳定内网可用 30s)
- 禁用 IPv6(ipv6=off),避免因 AAAA 查询失败导致隐式卡死
- 不配 resolver_timeout 时默认为 30s,建议显式设为 resolver_timeout 3s;,确保单次查询不拖慢请求
限制 upstream 解析行为,杜绝运行时变量风险
即使用了可信 DNS,若配置不当,Nginx 仍可能绕过校验。必须规避两类高危模式:
- 禁用 proxy_pass http://$host 类变量写法——它强制每次请求都查 DNS,且无法受 valid 约束
- 改用 upstream + resolve 模式:
upstream api_backend {
server api.example.com:443 resolve;
}
并确保 Nginx ≥ 1.19.7(resolve 支持 DNS 缓存与 valid 生效) - 所有 upstream server 必须显式带 resolve 关键字,否则仍只启动时解析一次
叠加 SSL 层校验,形成双重防护
DNS 劫持若成功,流量会发往错误 IP。此时需靠 TLS 层拦截异常:
- 启用 SNI 强制匹配:
proxy_ssl_server_name on;
proxy_ssl_name "api.example.com"; - 指定可信证书链:
proxy_ssl_trusted_certificate /etc/nginx/ssl/internal-ca.crt;
拒绝自签、过期或域名不匹配的证书 - 配合重试机制:
proxy_next_upstream error timeout invalid_header http_502 http_503;


















