服务器带宽异常排查实战:用 tcpdump + Docker 精准定位“吃带宽”的进程

关键词:带宽异常、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
  • 黑盒系统
  • 紧急线上事故
相关推荐
LJianK12 小时前
《Java 数据分组的四种姿势:从 for 循环到 Stream API》
java·linux·服务器
草青工作室2 小时前
Spring Boot 环境变量配置详解:从 IDEA 到 Docker 部署
spring boot·docker·intellij-idea
白鸽梦游指南2 小时前
docker部署和常规使用方法
运维·docker·容器
vpk1122 小时前
Docker Compose 部署 GitLab
docker·容器·gitlab
l1t10 小时前
用docker安装测试crate数据库
数据库·docker·容器·cratedb
xdscode11 小时前
Linux云服务器安装openclaw,并对接飞书通道
linux·服务器·飞书·openclaw
lswzw12 小时前
win11家庭版 安装 openclaw
服务器
枕书12 小时前
实战记录:如何使用 Docker 一键部署长亭 PandaWiki 智能知识库
运维·docker·容器
LegendNoTitle12 小时前
计算机三级等级考试 网络技术 选择题考点详细梳理
服务器·前端·经验分享·笔记·php