nethogs不能直接配告警,因其无daemon模式、不输出结构化数据、无内置阈值逻辑,且ansi控制符和列宽不定导致脚本解析不可靠。

为什么nethogs不能直接配告警
nethogs 本身不支持告警功能,它只是个交互式终端工具,没有 daemon 模式、不输出结构化数据(比如 JSON/CSV)、也没有内置阈值判断逻辑。你运行 nethogs -d 1 看到的动态刷新界面,底层混着 ANSI 控制符和不定宽列,脚本根本没法稳定解析——$4 对应 SENT 列?那得看当前进程名长度是否把列顶歪了。想靠 timeout 10 sudo nethogs -t -d 1 eth0 | awk '{sum+=$4}' 做判断,只适合临时试一下,生产环境一跑就错。
用iftop + shell 脚本实现秒级阈值触发
真正能落地的轻量告警,推荐 iftop 配合文本解析,因为它支持批量模式(-t)且输出相对规整:
- 执行
sudo iftop -i eth0 -nBP -t -s 5:禁 DNS(-n)、显端口(-P)、文本模式(-t)、采样 5 秒(-s 5) - 提取“2s”列(单位 KB/s),取前 3 条连接:
awk '/=>/ {print $4}' | head -3 - 写进 cron 每 30 秒跑一次:
*/30 * * * * /path/to/alert.sh >> /var/log/iftop-alert.log 2>&1 - 告警动作别用弹窗或桌面通知——服务器没 GUI;改用
logger -t iftop-alert "outbound >5MB/s"写 syslog,再由 rsyslog 转发到中心日志平台
用vnstat建基线,避免误报峰值
瞬时流量高≠异常,比如备份任务跑一次就拉满带宽。可靠告警必须带历史对比:
- 先初始化:
sudo vnstat -u -i eth0,服务会自动每 5 分钟采样一次 - 查昨日小时级流量:
vnstat -h -d yesterday | grep 'h ' | awk 'NR==12 {print $3}'(取中午 12 点的 KB 值) - 当前 5 分钟增量用:
vnstat -i eth0 --oneline | cut -d';' -f9 | awk '{print $1}' - 比较逻辑别硬写倍数,用标准差更稳:
bc计算是否超均值 + 3σ,而不是简单$current > $baseline * 3 - 注意
vnstat数据存在/var/lib/vnstat/,首次运行后需等至少一个完整周期(5 分钟)才有有效 baseline
tcpdump 捕获协议层异常,不是看带宽而是看行为
当你要识别攻击而非拥堵时,tcpdump 才是关键:
- 检测 SSH 暴力破解:
sudo tcpdump -i eth0 -c 100 'port 22 and tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn' 2>/dev/null | wc -l - 返回 ≥15 就该触发封禁,配合
iptables -A INPUT -s $IP -j DROP - 统计高频源 IP:
sudo tcpdump -i eth0 -c 200 port 80 2>/dev/null | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -nr | head -3 - 别长期后台跑
tcpdump -w,文件膨胀快、IO 压力大;按需触发、限时采集(-c 100)、完即删
真正难的不是写脚本,而是定义“什么算异常”——同一阈值在办公网和 CDN 边缘节点意义完全不同。基线得按业务时段建(比如夜间低峰期的 95 分位值),告警渠道得区分等级(邮件 for warning,企微机器人 for critical)。这些细节不调好,再准的工具也白搭。











