关键词:带宽异常、tcpdump、Docker、netshoot、网络排查、运维实战
风格:偏实战 + 可复制 + 一步步定位(适合线上应急)
一、问题背景
线上服务器突然出现:
- 带宽飙升
- 网络延迟变高
- 甚至影响业务访问
但常见工具(top / htop)只能看到 CPU、内存,却看不到是谁在疯狂占用网络带宽。
本文给你一套可直接复制执行的排查方案,专治:
- Docker 容器场景
- 不知道哪个进程在发流量
- 无日志、无监控的"黑盒问题"
二、整体思路(非常关键)
整个排查分 4 步:
text
抓包 → 找高频IP/端口 → 反查进程 → 定位容器
核心工具:
- tcpdump(抓流量)
- awk / grep(统计)
- ss / netstat(查端口)
- docker(定位容器)
三、开始实战
1️⃣ 清理旧容器(避免冲突)
bash
docker rm -f network-analyzer
2️⃣ 启动网络抓包容器(关键步骤)
bash
docker run -d --name network-analyzer \
--net=host \
--privileged \
-v $(pwd):/captured_logs \
nicolaka/netshoot \
/bin/sh -c "tcpdump -i any -nn -tttt -l > /captured_logs/traffic_scan.log 2>&1"
参数解释(重点理解)
| 参数 | 作用 |
|---|---|
--net=host |
直接抓宿主机网络 |
--privileged |
允许抓包 |
tcpdump -i any |
监听所有网卡 |
-nn |
不解析域名(提升性能) |
-tttt |
输出时间(关键!) |
-l |
实时输出 |
👉 本质:用容器跑 tcpdump,不污染宿主机环境
3️⃣ 验证抓包是否生效
bash
tail -f traffic_scan.log
如果看到类似:
text
2026-03-24 03:44:01 IP 10.0.0.1.12345 > 8.8.8.8.53: UDP
说明抓包成功 ✅
⚠️ 注意:
- 日志文件会快速膨胀
- 建议只抓几分钟
四、核心分析步骤
4️⃣ 找出"最活跃"的 IP 和端口
示例:分析某一分钟
bash
grep "2026-03-24 03:44" traffic_scan.log \
| awk '{print $3, $5}' \
| sort \
| uniq -c \
| sort -nr \
| head -n 10
输出示例:
text
1200 10.0.0.5.34567 8.8.8.8.53
980 10.0.0.5.9999 1.1.1.1.443
👉 说明:
9999端口流量很高- 很可能是问题源
5️⃣ 反查端口属于哪个进程
假设目标端口是 9999
在宿主机执行:
bash
sudo ss -ntlp | grep :9999
输出类似:
text
LISTEN 0 128 0.0.0.0:9999 users:(("node",pid=12345))
👉 已定位到进程:node (pid=12345)
6️⃣ 如果是 Docker 容器产生的
很多时候端口在容器内,需要进一步定位:
bash
docker ps | xargs -I {} sh -c \
"docker exec {} netstat -tunlp 2>/dev/null | grep :9999 && echo 'Container: {}'"
👉 输出示例:
text
tcp 0 0 0.0.0.0:9999 LISTEN 123/node
Container: abc123
7️⃣ 精确定位 veth → 容器(进阶)
如果你拿到的是网卡(如 vethxxxxxx),可以用:
bash
for container in $(docker ps -q); do
ifindex=$(docker exec $container cat /sys/class/net/eth0/iflink 2>/dev/null)
veth=$(ip link | grep "^$ifindex:" | sed -n 's/.*\(veth[0-9a-z]*\)@.*/\1/p')
if [ "$veth" == "vethxxxxxx{{请修改这里}}" ]; then
echo "Found it! Container ID: $container"
docker inspect --format '{{.Name}}' $container
fi
done
👉 适用于:
- 抓包只看到网卡
- 无法直接看到端口
8️⃣ 进入容器内部排查
bash
docker exec -it <容器ID> top
或:
bash
docker exec -it <容器ID> netstat -tunlp
如果没有 netstat:
bash
docker exec -it <容器ID> cat /proc/net/tcp
五、完整排查链路总结
text
带宽异常
↓
tcpdump 抓包
↓
grep + awk 找高频端口
↓
ss / netstat 找进程
↓
docker 定位容器
↓
进入容器分析业务
👉 一句话总结:
先找"谁在发流量",再找"是谁启动的它"
六、实战经验总结(重点)
✅ 1. tcpdump 是核心
没有它,你只能"猜"
✅ 2. 时间维度很重要
bash
grep "具体时间"
👉 可以精准定位"异常瞬间"
✅ 3. 优先看:
- 443(外部请求)
- 53(DNS)
- 自定义端口(异常服务)
⚠️ 4. 常见元凶
| 类型 | 说明 |
|---|---|
| 爬虫 | 被刷接口 |
| DDOS | 外部攻击 |
| 内部 bug | 死循环请求 |
| 日志/上报 | 无限上报 |
| 数据同步 | 未限速 |
⚠️ 5. 日志清理
抓完记得删:
bash
rm -f traffic_scan.log
否则磁盘会爆 ❗
七、进阶优化(建议)
如果你经常遇到这种问题,可以:
1️⃣ 做自动分析脚本
- 自动统计 TOP IP / 端口
2️⃣ 接入监控系统
- Prometheus + Grafana
- 网络流量可视化
3️⃣ 做带宽限流
- tc / iptables
- 或云厂商限速
八、总结
这套方案的核心价值:
✔ 不依赖业务日志
✔ 不依赖应用代码
✔ 直接从"网络层"定位问题
适用于:
- Docker / K8s
- 黑盒系统
- 紧急线上事故