发布时间:2026/7/14 14:55:55
凌晨被叫起来:一次 DNS 缓存投毒导致全站 HTTPS 握手失败的排查实录 凌晨被叫起来一次 DNS 缓存投毒导致全站 HTTPS 握手失败的排查实录凌晨 2:17手机狂震。打开监控一看全站 HTTPS 握手失败率飙到 87%。用户刷不出页面支付链路全断。这个锅_DNS 缓存投毒_背了。事情是怎么发生的两周前我们做了一次灰度发布把部分流量切到了新 CDN 供应商。新供应商的 DNS 配置里有个坑TTL 设了 24 小时但他们在全球不同节点的 A 记录返回了不一致的 IP。更坑的是我们的 Nginx 反代层开启了resolver缓存默认缓存时间是 5 分钟。当某个节点的 IP 被运营商 DNS 投毒后Nginx 的 resolver 缓存把这个脏 IP 牢牢锁了 5 分钟。5 分钟在凌晨是 eternity。排查时间线真实记录02:17告警触发HTTPS 握手失败率 87%错误码SSL_ERROR_SYSCALL。02:21我登上故障机器先抓了个包tcpdump-ianyhost故障IP-w/tmp/dns_fail.pcapWireshark 一看TLS ClientHello 发出去服务端直接 RST。根本不是我们的证书链。02:28怀疑证书问题但证书没过期。排查证书路径openssl s_client-connect故障IP:443-servernameourdomain.com返回的证书是*.somecdn.net根本不是我们的通配符。IP 被劫持了。02:35确认 DNS 解析异常# 不同 DNS 服务器返回不同结果dig8.8.8.8 ourdomain.com Adig223.5.5.5 ourdomain.com Adig114.114.114.114 ourdomain.com A三个结果两个是脏 IP。运营商 DNS 缓存被投毒了。02:42紧急止血切回旧 CDNDNS 切换5 分钟生效清空 Nginx resolver 缓存nginx -s reload临时把被污染域名写进/etc/hosts指向已知干净的 IP02:50握手失败率降到 3%业务恢复。03:10开始根因定位。发现新 CDN 的 DNS 配置问题不同 Anycast 节点返回不同 A 记录且 TTL 不一致。运营商 DNS 在递归解析时某些区域拿到了被投毒的结果。根因分析DNS 缓存投毒的三层防线是怎么破的第一层DNSSEC我们没有开。开了 DNSSEC 的域名运营商 DNS 在返回结果时会校验 RRSIG 签名投毒难度指数级上升。但 DNSSEC 在国内普及率不到 5%很多解析商甚至不支持。第二层HTTPS 证书校验浏览器在 TLS 握手阶段会校验证书域名。如果 IP 被劫持到钓鱼站点证书域名对不上浏览器会拦截。但我们的问题更隐蔽劫持到的 IP 也是 CDN 节点证书是*.somecdn.net虽然域名不匹配但某些老版本客户端或内部 API 调用没有严格校验 SNI导致握手失败而不是安全拦截。第三层应用层健康检查我们的 Nginx upstream 健康检查是 30 秒一次 TCP 连通性探测。TCP 能通但 TLS 握手失败健康检查没报异常。这是个盲区。修复方案四层加固1. DNS 层DNSSEC 多解析商# 在域名注册商开启 DNSSECdnssec-keygen-aRSASHA256-b2048-fKSK ourdomain.com dnssec-keygen-aRSASHA256-b1024-fZSK ourdomain.com# 上传 DS 记录到注册商同时部署两个独立解析商主 备任何一方异常可快速切换。2. Nginx 层缩短 resolver 缓存 SNI 严格校验resolver 8.8.8.8 223.5.5.5 valid10s; # 默认 5 分钟改为 10 秒牺牲一点点性能换实时性 # 强制 SNI 校验不匹配直接 444 server { listen 443 ssl; server_name ourdomain.com; if ($host ! $server_name) { return 444; } }3. 监控层HTTPS 握手成功率 证书域名校验# Prometheus 告警规则-alert:HTTPSHandshakeFailureRateexpr:|( sum(rate(nginx_http_requests_total{status~4..|5..}[1m])) / sum(rate(nginx_http_requests_total[1m])) ) 0.05for:30slabels:severity:criticalannotations:summary:HTTPS 握手失败率超过 5%再加一个主动探测#!/bin/bash# check_ssl.shforhostinourdomain.com api.ourdomain.com;docert_name$(echo|openssl s_client-connect$(dig short $host|head-1):443-servername$host2/dev/null|openssl x509-noout-subject2/dev/null|grep-oPCN\K[^,])if[$cert_name!*.ourdomain.com];thenechoALERT:$hostcert mismatch:$cert_namefidone4. 架构层DNS-over-HTTPSDoH兜底在移动端和内部服务集成 DoH 客户端绕过运营商 DNS// Go 示例transport:http.Transport{DialContext:func(ctx context.Context,network,addrstring)(net.Conn,error){// 使用 DoH 解析returndohResolver.DialContext(ctx,network,addr)},}踩坑记录Nginx resolver 缓存默认 5 分钟很多人不知道resolver指令的valid参数默认缓存时间是由 DNS 响应的 TTL 决定。如果上游 DNS 返回 24 小时 TTLNginx 也会缓存 24 小时。dig 命令不显示 DNS 缓存层级dig trace才能看到完整的递归解析路径普通dig只返回最终结果看不出是哪层缓存出了问题。SSL 证书不匹配 ≠ 浏览器拦截某些内部 API 客户端比如老版本 curl、Java 8 默认不校验 SNI只会握手失败日志里很难直接看出是 DNS 问题。DNS 切换后不要急着走A 记录 TTL 是 24 小时切换解析后全球 DNS 缓存刷新需要的时间 TTL 传播延迟。我们第一次切回旧 CDN 后5 分钟就以为恢复了结果欧洲节点 20 分钟后还在连脏 IP。写在最后DNS 是互联网的「基石」但也是最容易被忽视的环节。这次事故教会我三件事DNS 配置要审计不要只盯着代码和服务器DNS 解析链、TTL 设置、多供应商策略都是生产环境的一部分。监控要覆盖握手层TCP 连通不代表服务可用TLS 握手、证书校验、HTTP 响应内容都应该在监控里。止血要快要全清空 Nginx 缓存、切解析、写 hosts三板斧一起上不要一步一步试。DNS 投毒不常见但一旦发生就是全站级别。希望这篇记录能帮你在凌晨 2 点少熬一个小时。附排查 Checklistdig trace检查完整解析路径openssl s_client验证证书链tcpdump抓包确认 RST 来源nginx -s reload清空 resolver 缓存检查 DNSSEC 状态dig dnssec ourdomain.com DNSKEY

相关新闻

2026/7/14 14:55:55

15分钟完成黑苹果EFI配置:OpCore-Simplify图形化工具完全指南

15分钟完成黑苹果EFI配置:OpCore-Simplify图形化工具完全指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而头…

2026/7/15 9:54:40

01 白话容器基础:从进程说开去

系列专栏《深入剖析 Kubernetes》 基于张磊极客时间专栏思想整理 适合 CSDN 发布01 白话容器基础:从进程说开去 很多人把容器想得很神秘——好像它是一种全新的"虚拟化技术",和虚拟机并列。其实不然。容器技术没有任何黑魔法,它的…

2026/7/15 9:54:39

深入解读PMIC数据手册:LDO与负载开关电气特性与设计实践

1. 项目概述与核心价值 在为一个复杂的片上系统(SoC)设计供电网络时,电源管理芯片(PMIC)的选择和配置往往是决定项目成败的关键细节之一。它不像处理器或内存那样引人注目,但一旦电源出问题,整个…

2026/7/15 9:49:39

【C# 实战精讲】字典(Dictionary)的性能优化与高级应用

1. Dictionary的内部实现原理与性能基础 Dictionary在C#中是基于哈希表实现的键值对集合,理解它的内部工作机制是性能优化的前提。每次插入新元素时,Dictionary会先计算键的哈希码(通过GetHashCode方法),然后通过哈希函…

2026/7/14 12:47:32

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/14 19:23:19

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/14 18:30:06

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/15 0:08:29

【LINUX】驱动

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

2026/7/15 0:08:29

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

2026/7/15 0:08:29

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…

2026/7/14 12:47:31

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…