在Rocky Linux中使用tcpdump捕获特定端口流量时,我通常通过tcpdump -nni <网卡> port <端口>
命令实现,同时总结以下实践经验:
-
精确过滤
通过tcp port 80
或udp port 53
区分协议类型,避免无关流量干扰。当需要抓取多个端口时使用(port 80 or port 443)
逻辑语法,注意括号需用反斜杠转义 -
网卡选择痛点
在拥有多网卡的服务器中,必须通过-i eth0
明确指定目标网卡。曾因未指定网卡导致抓取到本地回环流量(lo接口)而浪费数小时排查时间 -
性能调优
高流量场景下添加-B 4096
调整缓冲区大小防止丢包,配合-c 1000
限制抓包数量避免磁盘溢出。某次抓取10Gbps业务流量时因未限制包数量导致系统OOM崩溃 -
输出解析技巧
使用-w capture.pcap
保存原始数据后用Wireshark分析。直接查看实时输出时建议添加-l
启用行缓冲,避免多行日志穿插影响可读性 -
特权与权限
默认需要root权限执行,但可通过setcap CAP_NET_RAW+ep /usr/sbin/tcpdump
赋予普通用户抓包权限。该操作需权衡安全风险
遇到的典型挑战:
- Docker等容器环境流量经veth设备转发时,需在宿主机抓取veth接口而非物理网卡
- 部分Kubernetes CNI插件(如Calico)会加密VXLAN流量,需搭配
-K
参数跳过checksum验证 - 当目标端口存在NAT转换时,需根据Pre/Post-routing阶段选择抓包位置
推荐组合命令示例:
tcpdump -nn -i eth0 -s0 -B 2048 'tcp port 8080 and host 10.0.0.5' -w app_debug.pcap
该命令实现了全量抓取(-s0)、防止IP分片(-B缓冲)、过滤特定主机和端口的TCP流量