被DDoS打进黑洞了怎么办?解封排查实战

被 DDoS 打到一定流量后,很多站长会突然发现:网站打不开了,SSH 也连不上,ping 不通,traceroute 到某一跳之后全是星号。这不是服务器挂了,而是 IP 被打进了黑洞。本文用 9 个问答讲清黑洞怎么触发、怎么在几分钟内确认、解封工单要准备什么,以及解封后怎么避免反复被切。

Q:什么是 DDoS 黑洞?

黑洞(Blackhole,也叫黑洞路由)是上游运营商或云服务商的一种应急保护机制:当某个 IP 的入向流量超过阈值,就把这个 IP 的路由指向一个不存在的下一跳,让所有流量在运营商侧被直接丢弃。

  • 目的:保护同机房、同网段的其他用户不被牵连,也避免攻击流量继续消耗骨干网资源。
  • 实质:不是拦截也不是清洗,而是一刀切地全部丢弃,连正常用户的访问一起丢。
  • 特点:生效极快(秒级到分钟级),通常分自动触发人工触发两种。

一句话:黑洞是拿你的可用性换整个机房的安全

Q:怎么判断自己是不是被黑洞了?

三个现象同时出现,基本可以确认。

# 1. 从外部 ping 你的 IP,完全无回应
ping -c 4 203.0.113.10

# 2. traceroute / mtr 到某一跳之后全是星号
traceroute -n 203.0.113.10
mtr -n --report 203.0.113.10

# 3. 从多个外部节点测试,全部不通(排除本地网络问题)
curl -s --max-time 5 -o /dev/null -w "%{http_code}" http://203.0.113.10/

关键判据:traceroute 能走到运营商骨干的某一跳、之后全部超时,而同一机房里其他 IP 正常,这就是黑洞的典型特征。如果从第一跳就开始超时,更可能是你本地网络的问题。

Q:被黑洞之后,为什么 SSH 和 ping 也一起不通?

因为黑洞是网络层的全量丢弃,它不区分端口和协议。

  • HTTP 80、HTTPS 443 被丢 → 网站打不开。
  • SSH 22 被丢 → 远程登录不上,只能从云控制台的 VNC 或串口进去。
  • ICMP 被丢 → ping 不通,看起来像服务器宕机,实际服务器很可能在正常运行。

所以判断的第一原则是:先分开「服务器挂了」和「链路被切了」。如果能在云控制台监控里看到 CPU、内存、磁盘 IO 仍在正常波动,而外部完全连不上,那就是链路层被处理了,不是系统问题。

Q:黑洞和封 IP、流量清洗有什么区别?

三者目的相同,代价完全不同,选错会吃大亏。

  • 黑洞:全部丢弃,连正常用户一起丢。零成本但业务彻底中断,属于兜底手段。
  • 封 IP:只拦攻击来源,正常用户不受影响。精度依赖识别能力,遇到代理池就会误伤。
  • 流量清洗:把流量牵引到清洗中心,识别并丢弃异常部分,把干净流量回注源站,正常用户不受影响。这是唯一既防攻击又不掉线的方案,代价是要买防护带宽。

所以黑洞是「不让别人受影响」,清洗是「让你自己也不受影响」。能买清洗就不要指望黑洞顶事

Q:确认被黑洞了,第一步做什么?

按「先止损、再恢复、后加固」的顺序,别上来就找服务商理论。

  1. 先确认攻击还在不在:在云控制台看入向带宽曲线。曲线已回落说明攻击停了,解封后大概率稳得住;还在高位,解封了会被立刻再次黑洞。
  2. 把域名切到备用路径:如果已接入 CDN 或高防,先把解析切到防护地址,让攻击流量打到防护节点而不是源站 IP。
  3. TTL 提前降过才有用:解析 TTL 要在平时就降到 60 秒,事发时再改已经来不及。
  4. 准备解封工单,说明业务性质、攻击规模和已采取的处置措施。

Q:怎么申请解封?服务商一般看什么?

各家流程不同,但判断标准高度一致。

  • 攻击是否已停止或明显下降:这是最硬的条件,工单里最好附上入向带宽回落的截图。
  • 你是否已经做了防护安排:比如已接入高防或清洗、已更换源站 IP、已配置限速。服务商最怕解封之后又被立刻打进去。
  • 历史黑洞次数:多次触发黑洞的 IP,往往要求强制接入防护才给解封,或者直接要求换 IP。
# 工单里可以附这三项自查结果,通过率会高很多
# 1) 当前入向峰值带宽(控制台截图)
# 2) 攻击来源 TOP IP 段
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# 3) 已配置的限速规则(证明不会二次触发)
nginx -T 2>/dev/null | grep -A2 "limit_req_zone"

Q:黑洞期间网站怎么尽量保持可访问?

核心思路是不要让域名解析死在一个 IP 上,把换入口的能力提前准备好。

  • 备用 IP 或备用节点:准备一个不同网段、最好不同机房的备用入口,平时只做灰度,出事时改解析顶上。
  • CDN 作为第一层入口:源站被黑洞时,如果 CDN 节点还缓存着内容,静态页面仍可访问;把回源地址改成备用 IP 即可恢复动态内容。
  • DNS 记录提前降 TTL:TTL 从 3600 降到 60,切换生效时间从一小时缩短到一分钟,这一步必须在平时做。
  • 关键页面静态化:首页、文章页提前生成静态页并缓存,后端不可用时也能兜住大部分访问。
# 切换后验证:确认解析已生效且返回的是新入口
dig +short www.example.com @8.8.8.8
curl -sI https://www.example.com/ | head -3

Q:解封之后怎么避免再被打进黑洞?

黑洞触发阈值通常在 1Gbps 到 5Gbps 之间(各家不同),攻击流量超过这个值就会再次被切,所以必须把到源站的流量压到阈值以下。

  • 源站 IP 必须藏起来:只允许防护节点回源,其余一律拒绝。历史 DNS 记录、证书透明度日志、邮件头都会泄露源站 IP,换过 IP 也要复查。
  • 接入上游清洗或高防:这是唯一能把大流量攻击挡在黑洞阈值之外的办法。
  • 源站侧收紧内核与连接参数,让小流量攻击不至于把服务器自己拖死。
# 只允许 CDN / 高防回源 IP 访问,务必精确到段,禁止 0.0.0.0/0
server {
    listen 443 ssl;
    server_name www.example.com;
    allow 1.2.3.0/24;
    allow 1.2.4.0/24;
    deny all;
    set_real_ip_from 1.2.3.0/24;
    set_real_ip_from 1.2.4.0/24;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
}
# 内核侧收紧,降低小流量攻击把服务器打死的概率(/etc/sysctl.d/99-anti-ddos.conf)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 65535
net.netfilter.nf_conntrack_max = 1048576
net.ipv4.tcp_fin_timeout = 15
# sysctl -p /etc/sysctl.d/99-anti-ddos.conf

Q:反复被黑洞,是继续换 IP 还是买防护?

看被黑洞的频率和攻击规模,用数据决策而不是靠感觉。

  • 一个月被打一两次、峰值 2Gbps 以内:换 IP 加临时 CDN 缓存基本够用,重点是藏好源站。
  • 每周都被打,或峰值远超黑洞阈值:换 IP 会变成无效循环——IP 换到第几个都会被找到,成本只会越来越高,这时候清洗或高防更经济。
  • 判断依据看两点:攻击持续时长(持续越久说明对方投入越大),以及业务每小时的中断损失。中断损失超过防护费用,就该买防护。

还有一个容易被忽略的点:黑洞次数会进入服务商的信誉记录。触发太多次,可能被要求强制迁走或者被限速,到那时不是花钱就能解决的问题。

Q:还有什么补充建议?

  • 把黑洞当成最后的保险,不是防护方案:它的定位是保护别人,你的业务在黑洞期间是完全中断的。
  • 平时就准备好切换手册:备用 IP、解析改法、CDN 回源修改位置、服务商工单入口写成一张纸,出事时照着做,别现场翻文档。
  • 监控要覆盖入向带宽:只在服务器本地看网卡,被黑洞之后就看不到任何数据了。入向带宽必须在服务商控制台或外部探针上监控。
  • 保留完整证据链:流量曲线、攻击源分布、时间点记录,申诉和复盘都用得上,也是选购防护容量时的依据。
  • 小站也会被顺手一打:很多黑洞事件不是被针对,而是攻击者拿你的 IP 当压测目标。这类攻击通常持续时间短,撑过去加临时限速就能恢复。