Linux下如何监控特定进程产生的所有网络流量?
监控并记录特定进程网络流量的方法
以下是几种实用方案,满足按进程(PID/用户)过滤、端口过滤及流量记录的需求:
1. lsof + tcpdump 组合方案
先通过lsof定位进程关联的网络连接信息,再用tcpdump精准捕获流量:
- 查找目标进程(PID为1234)的所有网络连接:
参数说明:lsof -i -P -n -p 1234-i显示网络连接,-P不解析端口名称,-n不解析IP地址,-p指定目标进程PID。 - 从输出中提取本地/远程端口(例如80、443),用tcpdump捕获并记录流量:
若按用户过滤,先获取该用户的所有进程PID:tcpdump -i eth0 port 80 or port 443 -w process_traffic.pcappgrep -u username,再重复上述步骤。
2. nethogs 实时监控+记录
nethogs直接按进程维度展示实时流量,支持端口过滤,也可导出记录:
- 实时监控指定网卡(eth0)的进程流量:
界面会显示进程PID、程序名、上传/下载速率及连接端口。nethogs eth0 - 过滤特定端口(如80)并记录到文件:
nethogs -p 80 eth0 -t > traffic_log.txt-t参数以文本格式输出,方便后续分析。
3. strace 追踪进程网络系统调用
strace可捕获进程发起的所有网络相关系统调用(如connect、send、recv),详细记录每一次网络交互:
- 追踪目标进程(PID为1234)的网络调用:
strace -e trace=network -p 1234 -o process_network.log-e trace=network仅追踪网络类系统调用,-o将输出写入指定文件。 - 如需过滤端口,可结合grep:
strace -e trace=network -p 1234 2>&1 | grep '80\|443'
4. bpftrace 高效eBPF追踪
基于eBPF的bpftrace性能损耗极低,适合长期监控,支持复杂的进程+端口过滤:
- 追踪PID为1234的进程发起的所有TCP连接:
bpftrace -e 'tracepoint:tcp:tcp_connect { if (pid == 1234) printf("PID %d 连接到 %s:%d\n", pid, args->saddr, args->dport); }' - 过滤特定目标端口(如80)并记录:
bpftrace -e 'tracepoint:tcp:tcp_connect { if (pid == 1234 && args->dport == 80) printf("PID %d 连接到 %s:%d\n", pid, args->saddr, args->dport); }' > tcp_connect.log
5. iptables标记+ tcpdump过滤
通过iptables给特定进程/用户的流量打标记,再用tcpdump捕获标记后的流量:
- 给用户
username的输出流量打标记(标记值100):iptables -A OUTPUT -m owner --uid-owner username -j MARK --set-mark 100 - 捕获标记为100的流量并记录,同时过滤端口80:
tcpdump -i eth0 fwmark 100 and port 80 -w marked_traffic.pcap
内容的提问来源于stack exchange,提问作者use56132
相关产品推荐
相关产品推荐

