DDoS攻击损失怎么算?停机一分钟亏多少钱

说不清一次攻击亏多少,防护预算永远批不下来。本文用 10 个问答讲清 DDoS攻击损失 怎么核算,以及怎么把账算成一页纸。

Q:为什么讲损失比讲攻击峰值有用?

  • 老板不关心 300G 还是 500G,他关心停一小时亏多少钱。峰值是技术参数,损失是决策语言。
  • 把三个数摆在一起,决策自然出来:单次损失、年化损失(单次乘以近 12 个月攻击次数)、防护年费。
  • 这三个数比任何技术方案对比图都有说服力,因为它用的是同一套货币单位。

Q:一次攻击的损失分哪几块?

  • 直接营收:下单中断、支付失败、预约流失。
  • 投放浪费:广告还在按点击烧钱,落地页却打不开。
  • 人力成本:应急加班、外部技术支持、事后复盘。
  • 赔付与违约:对客户的 SLA 赔付、无法履约的合同罚金。
  • 客户流失:被打期间走了的用户,按生命周期价值折算。
  • 隐性损失:搜索权重下滑、口碑、客服激增,这部分最难量化,但经常是最大的一块。

Q:每分钟营收怎么算才站得住?

  • 电商:日均 GMV 除以有效营业分钟,再乘以被打时段的分时系数。晚八点和凌晨三点,同样的分钟数损失差几倍。
  • B2B 与官网:日均询盘数乘以单条线索价值,再除以营业分钟。线索价值可以用成交率乘客单价估算。
  • 内容与广告站:日均广告收入除以每分钟,多按 CPM 与 PV 折算。
  • 一条纪律:没有分时数据就用保守系数 1.0,并在报告里写明口径。宁可数字偏低,不要在会议室里被一个小数点推翻整份材料。

Q:停机分钟怎么统计才不被质疑?

  • 口径提前写死:1 分钟粒度,连续 3 次探测失败计 1 分钟不可用。这个口径公开写在报告首页。
  • 三个探测点缺一不可:走 CDN 边缘、直连源站、移动网络。只测一个点,经常测的是自己家网络。
  • 区分完全不可用与部分降级:5xx 比例超过 5% 按折半计,别按满分算,否则容易被质疑夸大。
  • 攻击结束后的恢复期也要算。缓存回温和队列消化通常还要十几分钟。

Q:怎么从访问日志里把失败请求算出来?

  • 按分钟聚合 5xx 与 upstream 超时,能直接看出哪几分钟是真挂了,比凭印象吵架靠谱。
  • 失败请求数不等于损失,但它是佐证停机分钟的最好材料,尤其是对方质疑”只是慢了一下”的时候。
# 按分钟统计失败率(nginx 默认 combined 格式)
awk '{
  split($4, t, ":");
  m = t[2] ":" t[3];
  total[m]++;
  if ($9 ~ /^5/ || $0 ~ /upstream timed out/) fail[m]++;
} END {
  for (k in total)
    printf "%s fail=%d total=%d rate=%.2f%%\n", k, fail[k], total[k], fail[k]*100/total[k];
}' access.log | sort | head -40
# 独立探测:每分钟一次,连续 3 次失败判 1 分钟不可用
fails=0
for i in $(seq 1 1440); do
  code=$(curl -s -o /dev/null -m 5 -w "%{http_code}" https://www.example.com/health)
  if [ "$code" != "200" ]; then
    fails=$((fails+1))
    echo "$(date +%F_%H:%M) fail=$code streak=$fails" >> /var/log/uptime.log
  else
    fails=0
  fi
  sleep 60
done

Q:投放浪费和客户流失要不要算进去?

  • 要。投放是按时间烧钱的,网站挂着一小时,这一小时的点击费基本全废,按 60% 折算比较保守。
  • 流失用户的算法:被打时段的活跃用户数,乘以一个流失率(一般取 1% 到 3%),再乘以单客获取成本。这是补救成本,不是虚数。
  • 这两块加起来常常能和直接营收损失打平,只算 GMV 会明显低估。

Q:供应商的 SLA 赔付能抵掉多少损失?

  • 几乎抵不掉。绝大多数 SLA 赔的是月度服务费的代金券,按不可用时长比例计算。
  • 算一笔账就很清楚:一个月按 43200 分钟算,停 60 分钟只有 0.14%,几百块的套餐赔下来是几块钱。
  • 所以别把 SLA 赔付算进损失回收,它顶多覆盖心理预期。真正要谈的是赔付口径和攻击期间是否计入可用性。

Q:怎么把整笔账算成一页纸?

  • 顺序:先算分时营收,再乘停机分钟,加上投放浪费、人力、流失,得到单次损失。
  • 再乘以近 12 个月的攻击次数,得到年化损失,与防护年费做比值。
  • 决策线可以简化成三条:比值大于 3,该买;1 到 3 之间,先补应急流程与源站抗压;小于 1,把钱花在备份与演练上更划算。
  • 一页纸只放一个请求:要预算、要换厂商、还是要一次演练。想同时要三样,通常一样也拿不到。
# 单次损失核算(参数换成自己的真实数据)
gmv_per_day  = 100000    # 日均成交额
peak_factor  = 2.4       # 被打时段分时系数(晚高峰 2 到 3)
down_minutes = 95        # 折算后的不可用分钟
ad_per_hour  = 800       # 投放小时花费
lost_users   = 300       # 估算流失用户
cac          = 60        # 单客获取成本
labor        = 4000      # 应急人力

per_min = gmv_per_day / (18 * 60) * peak_factor
loss = per_min * down_minutes + ad_per_hour * down_minutes / 60 * 0.6 \
       + lost_users * cac + labor
print("单次损失约 %.0f 元,其中营收部分 %.0f 元" % (loss, per_min * down_minutes))

Q:不同规模的站,损失量级差在哪?

  • 差别不在公式,在结构和系数:小站损失以人力和口碑为主,营收占比低;交易型站点反过来,营收占大头。
  • 内容站、官网类:主要损失是询盘与投放浪费,量级通常在人力成本附近。
  • 电商与本地生活:晚高峰停机最贵,还要叠加大促系数和退款成本。
  • 游戏与直播:除了营收,还有在线人数下滑带来的连带付费下降和退款,恢复期比前面几类都长。
  • 结论:别照抄同行的数字,只借结构,系数必须用自己的数据填。

Q:账算清楚之后,还能拿它做什么?

  • 预算谈判:年化损失与防护年费同时出现在一页纸上,采购流程会顺很多。
  • 合同条款:知道自己的真实损失量级,才谈得动赔付上限。反过来,供应商写”攻击期间不计入可用性”这类条款时要当场争。
  • 保险与合规:部分网络安全险按年营收和防护措施定费率,一份规范的损失模型能压低费率。
  • 复盘指标:每次攻击后更新参数,特别是分时系数和流失率,两次之后模型就相当准了。
  • 反常识的一条:算出来的损失如果比防护费低一个量级,就老实承认现在不该买大规格。把钱投到源站抗压、备份和应急演练上,往往比买清洗带宽更能减少损失。