家用住宅主机Linux eBPF实时监控服务器流量
为什么选eBPF监控家用服务器流量
如果你有一台在家运行的Linux服务器,想实时看到是哪个进程占用了带宽、连了哪些IP,传统做法是用iptables记日志或tcpdump抓包,但这两者要么性能开销大,要么需要很多后处理。
eBPF(扩展伯克利包过滤器)可以在内核中安全高效地收集网络数据,而且对系统几乎无侵入。
本文用eBPF生态中最易上手的BCC工具集,让你在十分钟内就能看到一个实时刷新的流量面板。
第一步:检查环境并安装BCC
eBPF要求较新的Linux内核。
大多数Ubuntu 20.04+、Debian 11+、CentOS 8+都满足条件。
你可以先确认内核版本:
uname -r
输出如果大于4.8,通常就可以。
接着安装BCC工具(不同发行版命令不同,此处以Ubuntu为例):
sudo apt update
sudo apt install bpfcc-tools linux-headers-$(uname -r)
安装完成后,BCC工具会放在 /usr/sbin/ 下,名称后缀带有 -bpfcc,例如 tcptop-bpfcc。
你可以先试运行一个命令看是否正常:
sudo tcptop-bpfcc -C
如果终端开始每秒刷新连接统计,说明环境就绪。
第二步:用tcptop查看实时流量
tcptop-bpfcc 可以按进程显示每个TCP连接的收发速率。
常用参数:
sudo tcptop-bpfcc -C # 每1秒刷新一次,显示所有连接
sudo tcptop-bpfcc -C 5 # 每5秒刷新一次
sudo tcptop-bpfcc -C -p 1234 # 只监控PID为1234的进程
输出示例:
13:45:01 loadavg: 0.12 0.08 0.05 1/345 6789
PID COMM LADDR RADDR RX_KB TX_KB
1234 nginx 192.168.1.2:80 10.0.0.5:54321 12.3 8.7
4567 python3 127.0.0.1:9090 ::ffff:127.0.0.1: 0.2 0.1
如果你只关心总流量而不关心每个连接,可以用 tcplife-bpfcc 记录连接生命周期和收发字节:
sudo tcplife-bpfcc
这个命令会实时打印每一笔新建连接的信息,适合抓大文件传输或异常连接。
第三步:用bpftrace写一个简单的流量统计(可选)
如果你喜欢更轻量的方式,可以安装bpftrace,然后用一行脚本对本机所有网络出口进行计数。
注意这一步需要额外安装bpftrace:
sudo apt install bpftrace
然后执行:
sudo bpftrace -e 'kfunc:napi_gro_receive { @[prog]=count(); }'
这个命令会统计每个网卡驱动接收的数据包次数,虽然不是精确的字节数,但能帮你快速判断哪个网口流量大。
对于家用服务器通常只有一个网口,这个命令可以让你看到流量是否突发。
常见问题与避坑指南
- 命令找不到? Ubuntu 21.10之后,BCC工具包名改为
bpfcc-tools,命令后缀从-bpfcc变为-bpfcc,但执行时仍需用完整名称如tcptop-bpfcc。如果提示“command not found”,先运行dpkg -L bpfcc-tools | grep bin查看工具的实际安装路径。 - Permission denied? 所有eBPF工具都需要root权限,记得加
sudo。如果sudo后仍报错,检查/proc/sys/kernel/unprivileged_bpf_disabled是否为1,如果是1则只能root使用,属于正常。 - 没有输出? 确认你有活跃的网络连接。可以开启一个
ping baidu.com看是否能在tcptop中看到连接。 - 性能影响? eBPF本身开销极低,但频繁刷新用户态数据会有一点CPU占用。在低配树莓派上建议把刷新间隔设为5秒以上。
验证监控结果
启动tcptop后,在另一台设备上用scp或iperf3向服务器发送数据,观察tcptop中对应进程的RX_KB是否增长。
或者自己用浏览器访问服务器的web服务,tcptop应当显示nginx(或你用的web服务器)的连接和流量。
如果一切正常,你已经成功用eBPF实时监控了服务器流量。
后续你可以将tcptop命令放入cron或systemd服务中,把输出重定向到日志文件,实现历史流量记录。
如果你对eBPF编程感兴趣,推荐学习BCC官方示例或bpftrace one-liners,进一步定制自己的监控脚本。