tcpdump 无法直接按端口分类保存,需结合脚本实现:一、用 portrange 捕获指定范围流量;二、循环启动多实例实时分流;三、用 tshark 对已有 pcap 离线拆分;四、用 awk 实时解析文本日志。

使用 tcpdump 捕获指定端口范围的流量并按端口号分类保存,关键在于结合过滤表达式与 shell 循环(或 awk 等工具)实现自动分流。原生命令不支持直接“按端口分类写入不同文件”,需借助脚本逻辑完成。
一、用 tcpdump 过滤端口范围的流量
先确认目标端口范围(例如 8000–8010),使用 portrange 表达式高效捕获:
tcpdump -i eth0 'portrange 8000-8010' -w all_in_range.pcap
说明:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
portrange 8000-8010匹配源端口或目的端口在此区间的 TCP/UDP 流量; -
-i eth0替换为你的实际网卡名(可用ip link查看); -
-w保存为 pcap 文件,便于后续分析或分流处理。
二、捕获时实时按端口分流(推荐:单命令 + shell 循环)
若希望每个端口一个独立文件(如 port_8000.pcap, port_8001.pcap),可在捕获同时用 tcpdump -G + 循环启动多个实例(适用于端口数不多、系统资源允许场景):
for port in {8000..8010}; do
tcpdump -i eth0 "port $port" -w "port_${port}.pcap" -q -W 1 -G 3600 &
done说明:
-
"port $port"精确匹配该端口(含源或目的); -
-q减少控制台输出干扰; -
-W 1 -G 3600可选:每小时轮转一次(防止单文件过大),此处设为 1 个文件+3600 秒周期; -
&后台运行,实现并发捕获; - 结束时用
killall tcpdump或记下 PID 统一终止。
三、对已有 pcap 文件按端口拆分(离线处理更稳妥)
若已保存了大 pcap(如 all_in_range.pcap),推荐用 tshark(Wireshark 命令行工具)精准提取并分类:
for port in {8000..8010}; do
tshark -r all_in_range.pcap -Y "tcp.port == $port || udp.port == $port" \
-w "port_${port}.pcap"
done说明:
-
-Y使用显示过滤器(display filter),语义清晰且支持 TCP/UDP 分开判断; - 比用
tcpdump -r二次过滤更可靠(tcpdump的读取过滤语法不支持||逻辑或写法); - 确保已安装
tshark:sudo apt install tshark(Debian/Ubuntu)或sudo yum install wireshark-cli(RHEL/CentOS)。
四、进阶:用 awk 实时解析 + 多路输出(轻量级无依赖方案)
若不想装 tshark,又需实时分类,可用 tcpdump -n -l 输出文本流,配合 awk 提取端口并重定向:
tcpdump -i eth0 -n -l 'portrange 8000-8010' | \
awk '{
for(i=1; i<=NF; i++) {
if ($i ~ /:[0-9]+[[:space:]]*$/ && substr($i,length($i)-4) ~ /:[0-9]+$/) {
# 简化:匹配类似 "IP:PORT" 格式,取 PORT 部分(实际建议用更稳正则)
if (match($i, /:([0-9]{4,5})[[:space:]]*$/) || match($i, /\.([0-9]{4,5})[[:space:]]*$/)) {
port = substr($i, RSTART+1, RLENGTH-1)
if (port >= 8000 && port <= 8010) {
print $0 > ("port_" port ".log")
}
}
}
}
}'⚠️ 注意:该方式保存的是文本日志(非 pcap),适合快速查看;如需保留原始二进制包,仍应优先用前两种 pcap 方式。
不复杂但容易忽略:端口过滤默认同时匹配源和目的端口;若只关心某一方(如仅目的端口为 8000 的请求),请改用 dst port 8000 或 src port 8000 显式指定。

















