tcpdump 是 Linux 下常用的抓包工具,适合在服务器侧快速确认网络连通性、DNS 请求、ICMP 报文、端口流量和业务请求是否到达。这里整理基础格式、常用过滤表达式和几个业务排查场景。
安装和注意点
一般基础镜像里会自带 tcpdump,如果没有可以直接安装。
# CentOS / RHEL / Rocky / AlmaLinux yum install -y tcpdump # Ubuntu / Debian apt install -y tcpdump
权限说明:tcpdump 通常需要 root 权限或抓包能力权限。直接排查时一般使用 root 执行。
常见报错:如果提示 tcpdump: Couldn't find user 'tcpdump',可以在参数里加 -Z root,让 tcpdump 不切换到 tcpdump 用户。
tcpdump -i eth0 -nn -Z root
tcpdump 格式
tcpdump 的基础格式可以理解为:前面是控制参数,后面是抓什么流量的 BPF 过滤表达式。
tcpdump [基础控制参数] '[BPF 过滤表达式]'
1. 基础控制参数
| 参数 | 作用 | 示例 |
|---|---|---|
-i |
指定网卡。可以写具体网卡名,也可以写 any。 |
-i eth0、-i any |
-n |
不把 IP 解析成主机名,减少 DNS 解析干扰,也能提升性能。 | -n |
-nn |
不解析 IP,也不把端口号解析成服务名。日常排查建议默认带上。 | -nn |
-c |
限制抓包数量,达到数量后自动停止。 | -c 100 |
-w |
写入 pcap 文件,后续可以用 Wireshark 打开分析。 | -w eth0.pcap |
-r |
读取已有 pcap 文件。 | -r eth0.pcap |
-q |
简洁输出,适合快速观察源地址、目的地址和协议。 | -q |
-vvv |
输出更详细的报文信息。 | -vvv |
-s 0 |
抓完整报文,写 pcap 时常用,避免报文被截断。 | -s 0 -w eth0.pcap |
-Z root |
避免因找不到 tcpdump 用户导致执行失败。 | -Z root |
查看可抓包网卡
tcpdump -D ip link
如果不确定流量走哪张网卡,可以先用 -i any 粗看,再切到具体网卡精确抓包。
BPF 过滤表达式
BPF 过滤表达式一般建议用单引号包起来,避免 shell 对特殊字符做额外解释。过滤条件通常围绕 IP、网段、端口和协议展开。
1. IP 类过滤
# 抓取 eth0 网卡下,源地址为 192.168.1.100 的报文 tcpdump -i eth0 -nn -vvv 'src 192.168.1.100' # 抓取 eth0 网卡下,目的地址为 10.0.0.5 的报文 tcpdump -i eth0 -nn -vvv 'dst 10.0.0.5' # 抓取 eth0 网卡下,和 192.168.1.1 有关的报文 tcpdump -i eth0 -nn -vvv 'host 192.168.1.1' # 抓取 eth0 网卡下,和 192.168.1.0/24 网段有关的报文 tcpdump -i eth0 -nn -vvv 'net 192.168.1.0/24'
| 表达式 | 含义 |
|---|---|
src 192.168.1.100 |
源 IP 是 192.168.1.100。 |
dst 10.0.0.5 |
目的 IP 是 10.0.0.5。 |
host 192.168.1.1 |
源 IP 或目的 IP 包含 192.168.1.1。 |
net 192.168.1.0/24 |
匹配指定网段。 |
2. 端口和协议过滤
# 源端口为 80 tcpdump -i eth0 -nn -vvv 'src port 80' # 目的端口为 443 tcpdump -i eth0 -nn -vvv 'dst port 443' # 端口范围 10000-20000 tcpdump -i eth0 -nn -vvv 'portrange 10000-20000' # 抓取 TCP 80 端口 tcpdump -i eth0 -nn -vvv 'tcp port 80' # 抓取 UDP 53 端口 tcpdump -i eth0 -nn -vvv 'udp port 53' # 抓取 ICMP tcpdump -i eth0 -nn -vvv 'icmp'
3. 条件组合
常用逻辑条件有 and、or、not。复杂条件建议加括号,方便后续自己回看。
# 源地址为 192.168.1.100,且 TCP 端口为 80 的报文 tcpdump -i eth0 -nn -vvv 'src 192.168.1.100 and tcp port 80' # 抓取 80 或 443 端口 tcpdump -i eth0 -nn -vvv 'tcp port 80 or tcp port 443' # 排除 SSH,避免远程连接刷屏 tcpdump -i eth0 -nn -vvv 'not port 22' # 抓取某个主机访问 80/443 的报文 tcpdump -i eth0 -nn -vvv 'host 192.168.1.100 and (tcp port 80 or tcp port 443)'
业务场景
1. 极简模式快速观察流量
使用 -q 可以快速观察 eth0 的出入站 IP 组合和协议栈,适合先判断有没有流量、流量大概从哪里来、到哪里去。
tcpdump -i eth0 -nn -q -c 1000

2. 观察 DNS 请求
观察 eth0 的 DNS 请求是否正常,或者当前机器正在解析哪些域名。DNS 常用 UDP 53,也可能存在 TCP 53。
# 常见 DNS 查询 tcpdump -i eth0 -nn 'udp port 53' # 同时观察 UDP/TCP 53 tcpdump -i eth0 -nn 'port 53'

3. 观察 ICMP 连通性
排查连通性时,可以一边开一个 shell 长 ping,另一边用 tcpdump 抓 ICMP,看请求和回包是否都能看到。
tcpdump -i eth0 -nn 'icmp'

ICMP 常见类型
| 类型 | 含义 | 常见判断 |
|---|---|---|
Type 8 |
Echo Request,回显请求。 | 本机或对端正在发起 ping。 |
Type 0 |
Echo Reply,回显应答。 | 说明 ping 有正常回包。 |
Type 3, Code 0 |
Network Unreachable,网络不可达。 | 路由或上游网络不可达。 |
Type 3, Code 1 |
Host Unreachable,主机不可达。 | 网段可能可达,但目标主机不可达。 |
Type 3, Code 3 |
Port Unreachable,端口不可达。 | 常见于 UDP 端口没有服务监听。 |
Type 11, Code 0 |
TTL expired in transit,传输期间 TTL 超时。 | 常见于 traceroute 或路由环路排查。 |
4. 抓取业务端口并保存 pcap
如果终端输出看不清,或者要给别人分析,可以直接写入 pcap 文件,再传到 PC 端用 Wireshark 打开。
# 抓取 eth0 上 80/443 端口流量,保存为 pcap tcpdump -i eth0 -nn -s 0 -c 5000 -w web.pcap 'tcp port 80 or tcp port 443' # 读取 pcap 文件 tcpdump -nn -r web.pcap
建议:写 pcap 时加上 -s 0,尽量保存完整报文;同时加 -c 控制数量,避免长时间抓包把磁盘写满。
常用补充
1. 先确认流量是否到机器
很多业务排障可以先用 tcpdump 判断“包有没有到机器”。如果包没到,优先看上游路由、安全组、防火墙、负载均衡;如果包到了但业务无响应,再看本机防火墙、监听端口、服务日志。
# 查看服务是否监听 ss -tlnp # 抓取访问某个业务端口的流量 tcpdump -i eth0 -nn 'tcp port 8080'
2. 排除 SSH 连接干扰
远程登录服务器时,抓包容易把自己的 SSH 流量也抓出来。可以排除 22 端口,输出会干净很多。
tcpdump -i eth0 -nn 'not port 22'
3. any 网卡和具体网卡的区别
-i any 适合先粗略判断有没有流量,但它不一定保留完整二层信息。需要更精确分析时,建议切到具体网卡,例如 eth0、ens33、bond0。
生产环境注意:tcpdump 本身会增加少量系统开销。高流量机器上建议带上过滤条件、-c 数量限制或写入 pcap,避免终端刷屏和磁盘被写满。