0x01 前言
作为一名 VPS 用户,最担心的不是服务器宕机,而是半夜醒来发现服务器被 DDoS 攻击,导致流量包耗尽甚至产生巨额扣费。虽然我们可以通过隐藏 IP、设置 404 等方式规避攻击,但面对大流量冲击,这些手段往往力不从心。
如果黑客针对你的 IP 发起 DDoS 攻击,即便你设置了 404 或空响应,你的流量依然会飞速消耗。
1.为什么 404 挡不住流量消耗?
流量计费通常是在机房的出口路由器上统计的。
• 下行流量(入站): 黑客发给你的 10GB 数据,即使你的服务器选择“丢弃”或“拒绝”,这些数据也已经跑过了机房的网线,算进了你的入站流量。
• 上行流量(出站): 虽然 404 返回的数据很小,但在大规模攻击下(每秒几万次请求),成千上万个 404 响应累积起来也是一笔可观的流量。
2.针对 服务器流量 的“保命”建议
为了防止流量被刷光,我们可以采取以下几阶策略:
第一阶:利用防火墙(内核级拦截)
不要让请求到达 你的各种面板 直接在系统底层把它杀掉。
• 设置 IP 白名单: 如果你只有自己用,且有固定 IP 或者能通过 DDNS 获得 IP,直接封死端口。
第二阶:套用 CDN(隐藏真实 IP)
这是防止流量被刷的终极手段。
使用 Cloudflare 等服务,将域名指向 CF,然后在服务器防火墙上只允许 Cloudflare 的 IP 访问。
效果: 黑客只能攻击到 Cloudflare 的节点,打不到你的 VPS。Cloudflare 免费版提供无上限的 DDoS 防护,你不用担心流量被刷。
第三阶:就是今天的“断路器”方案脚本自动关机(止损)
通过脚本监控实时流量,一旦超标立即触发 Formspree 邮件告警并自动关机。
0x02 核心原理
该方案基于 Linux 的轻量级流量监控工具vnstat。
监控:每 2 分钟检查一次过去 1 小时的入站+出站总流量。
判断:如果流量超过预设阈值(如 50GB/小时),判定为异常攻击。
告警:利用 Formspree 的 HTTPS 接口绕过机房对 SMTP 端口的封锁,发送邮件通知。
自保:执行 shutdown 关机指令,切断流量计费。
0x03 准备工作
在开始之前,我们需要安装必要的依赖工具。以 Debian/Ubuntu 为例:
你需要安装 vnstat。
# Ubuntu/Debian
sudo apt update && sudo apt install vnstat -y然后确认网卡名称
你需要告诉脚本监控哪张网卡。执行以下命令:
ip add你会看到类似 eth0、ens3 或者 venet0 的名字。记住这个名字。
Debian 系统需要安装 bc 来处理数字计算,安装 jq 来解析 vnstat 的数据:
apt update && apt install bc jq -y安装后,请确保它正在运行:
systemctl enable --now vnstatvnstat 安装后需要一点时间来记录流量。如果提示 Not enough data available yet,不用担心,等 5 分钟数据就出来了。
这会儿你可以先运行:
vnstat -i eth0 # 把 eth0 换成你刚才查到的网卡名 0x04 思考一下我们需不需要一个流量告警关机的推送
在正式开始创建熔断脚本时候,需要思考你需要在熔断的时候让vps给你一个推送吗?
由于这两天折腾了自己的个人简历,使用了Formspree(实际就是一个表单链接,有人给这个链接发消息,他就帮你转到你邮箱去),我问了下Gemini,
实际上我目前能想到的方法有几种
1.用自己的微信公众号推送
2.用telegram推
3.用邮箱推
4.反正方法挺多,大家可以自行发散
我当时去问Gemini一开始让我用电报,然后用邮箱,我给他提的用 Formspree,结果Gemini说Formspree 是一个非常聪明的办法!
它完全绕过了 VPS 服务商对 SMTP(25/465/587 端口)的封锁,因为它使用的是标准的 HTTPS (443 端口) 发送数据。
这种方式本质上是把服务器的告警信息当作一个“表单提交”发给 Formspree,然后由 Formspree 转发到你的邮箱。
OK,那我这一次就用Formspree。
准备 Formspree
- 前往 Formspree.io 注册个账号。
- 创建一个新表单 (New Form),命名为“VPS Guard”。
- 复制它给你的 Endpoint URL,这个URL再这儿https://formspree.io/forms/xbddrngq/integration
(看起来像 https://formspree.io/f/xoqyzabc)。这个xoqyzabc就是你的ID。
正式开始写脚本,我们把脚本放在 /root/guard.sh:
nano /root/guard.sh“邮件/Formspree版”脚本
我们利用 curl 来提交表单。编辑 /root/guard.sh:
0x05 正式开始编写这套保险丝脚本
#!/bin/bash
# --- 配置区 ---
INTERFACE="eth0"
LIMIT_GB=50
FORMSPREE_URL="https://formspree.io/f/你的id"
HOSTNAME=$(hostname)
# --- 核心逻辑 ---
# 获取过去一小时流量 (JSON 格式提取)
DATA=$(vnstat -i $INTERFACE --json h 1)
RX=$(echo $DATA | jq '.interfaces[0].traffic.hour[0].rx // 0')
TX=$(echo $DATA | jq '.interfaces[0].traffic.hour[0].tx // 0')
TOTAL_BYTES=$((RX + TX))
TOTAL_GB=$(echo "scale=2; $TOTAL_BYTES / 1024 / 1024 / 1024" | bc)
# 打印状态到日志
echo "$(date): 当前一小时已用 $TOTAL_GB GB" >> /tmp/guard.log
# 触发判断
if (( $(echo "$TOTAL_GB > $LIMIT_GB" | bc -l) )); then
MSG="🚨【流量熔断】服务器 $HOSTNAME 流量已达 ${TOTAL_GB}GB,超过阈值,正在强制关机!"
# 发送告警
curl -s -X POST "$FORMSPREE_URL" -d message="$MSG"
sleep 3
/sbin/shutdown -h now
fiOK,脚本编写完毕在脚本正式部署前,手动跑一行测试,看看邮箱能不能收到:
curl -X POST "https://formspree.io/f/你的ID" -d "message=测试:Formspree告警通道正常"
到这一步,如果你的邮箱能够正确的接收到推送。
再等几分钟
- 验证日志
运行几分钟后,你可以输入以下命令查看你的VPS保镖是否在正常记录:
cat /tmp/guard.log
0x06 自动化部署
赋予权限与计划任务
# 赋予执行权限
chmod +x /root/guard.sh
# 写入计划任务 (每2分钟检查一次)
(crontab -l 2>/dev/null; echo "*/2 * * * * /bin/bash /root/guard.sh") | crontab -至此你的VPS 现在已经具备了“自动保险丝”。
⚠️ 特别提醒(如果你和我一样用的 Racknerd)
流量额度计算: Racknerd 的套餐流量通常是单向计费(入站或出站取大值),但攻击发生时,入站流量会远大于出站。脚本中计算的是 RX+TX(总流量),这比官方统计更严格,能更早触发保护。
手动开机: 一旦脚本执行了 shutdown,你必须登录 Racknerd 的 SolusVM 面板 点击 "Start" 才能重新启动。
重置计数: 开机后如果攻击停了,记得运行 vnstat -i eth0 --xml --clear,否则在当前这个小时结束前,它可能还会把你关掉。
抖音来的 整的可以🤩
好好谈谈家