适用场景
tcpdump 抓包分析是 Linux 服务器运维与安全人员最常用的命令行网络诊断工具。它适用于以下典型场景:排查网站访问异常与连接超时、定位对外发包行为、检测 SYN 洪水与端口扫描等攻击流量、分析第三方服务通信是否正常,以及在无图形界面的服务器上完成抓包取证。与 Wireshark 的图形化操作不同,tcpdump 可直接运行在最小化安装的服务器上,资源占用极低,是生产环境排障的首选工具。
前置条件
- Linux 服务器(CentOS / Ubuntu / Debian 均可),具备 root 权限或 sudo 权限
- 网卡支持 promiscuous(混杂)模式,用于抓取非本机 MAC 的流量
- 本机已安装 libpcap 库(tcpdump 的底层依赖)
原理说明
tcpdump 基于 libpcap 库工作,将网卡设置为混杂模式后,内核会复制经过网卡的数据帧交给 tcpdump 进程,再由 BPF(Berkeley Packet Filter)过滤器对数据包进行匹配。BPF 过滤表达式在内核态完成匹配,因此即使在高流量场景下也能保持较高的抓包性能。抓到的数据包会按照协议层次解析输出,默认显示时间戳、源目 IP、端口、标志位与长度等信息。
操作步骤
步骤一:安装 tcpdump
# CentOS / RHEL
yum install -y tcpdump
# Ubuntu / Debian
apt-get update && apt-get install -y tcpdump
# 验证安装
tcpdump --version
步骤二:基础抓包
# 抓取 eth0 网卡全部流量,输出到屏幕
tcpdump -i eth0
# 抓取 100 个包后自动停止
tcpdump -i eth0 -c 100
# 不解析域名(加快速度、避免 DNS 干扰),显示数字地址
tcpdump -i eth0 -nn
# 抓包并保存到文件(生产环境推荐先落盘再分析)
tcpdump -i eth0 -nn -w /tmp/capture.pcap -c 10000
步骤三:常用过滤表达式
# 按主机过滤
tcpdump -i eth0 -nn host 192.168.1.10
# 按端口过滤
tcpdump -i eth0 -nn port 80
tcpdump -i eth0 -nn port 443 or port 22
# 按协议过滤
tcpdump -i eth0 -nn tcp
tcpdump -i eth0 -nn udp
# 组合条件
tcpdump -i eth0 -nn src 192.168.1.10 and dst port 8080
# 抓 SYN 包(TCP 三次握手第一包)
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0'
步骤四:读取 pcap 文件分析
# 读取保存的抓包文件
tcpdump -r /tmp/capture.pcap -nn
# 从文件统计各源 IP 的连接数(排查扫描/洪水)
tcpdump -r /tmp/capture.pcap -nn 'tcp[tcpflags] & tcp-syn != 0' | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head -20
# 从文件筛选特定主机的流量
tcpdump -r /tmp/capture.pcap -nn host 10.0.0.5
步骤五:攻击流量识别实战
# 实时监控 80 端口,识别 SYN 洪水(大量 SYN 且无 ACK 回包)
tcpdump -i eth0 -nn 'tcp port 80 and (tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0)' -c 500 | wc -l
# 识别全端口扫描(短时间来自同一 IP 的众多目的端口)
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0' -w /tmp/scan.pcap -c 2000
tcpdump -r /tmp/scan.pcap -nn | awk '{print $3}' | cut -d. -f1-4 | uniq -c | sort -rn
配置验证
执行以下命令确认 tcpdump 工作正常:
# 后台抓包 10 秒,然后前台访问本机 Web 服务
tcpdump -i eth0 -nn port 80 -c 10 -w /tmp/verify.pcap &
sleep 10
curl -s -o /dev/null http://127.0.0.1/
# 读取文件,应能看到本机与目标之间的 TCP 三次握手包
tcpdump -r /tmp/verify.pcap -nn
若输出中出现 SYN、SYN-ACK、ACK 三段标志位变化的报文,说明抓包链路正常。
常见问题
FAQ 1:tcpdump 提示 “You don’t have permission to capture on that device” 怎么办?
当前用户没有原始套接字权限。使用 sudo 执行 tcpdump,或将用户加入 wireshark 用户组:usermod -aG wireshark 用户名,重新登录生效。
FAQ 2:抓包文件太大,如何按条件过滤后再保存?
抓包时用 -c 限制包数、用 -s 限制每个包的快照长度(如 -s 96 只保留包头),例如 tcpdump -i eth0 -nn -s 96 -w /tmp/cap.pcap 'tcp port 443',可显著减小文件体积。
总结
tcpdump 是 Linux 环境下进行网络流量排查与安全检测的基础工具,掌握 BPF 过滤表达式、pcap 文件分析与攻击特征识别,能够帮助运维人员快速定位连接异常、发现扫描与洪水攻击。建议将常用过滤命令整理为 Shell 脚本,并在疑似入侵时第一时间抓包落盘保存证据。