网络类-tcpdump抓包

工具教程3个月前发布 hank
271 0 0

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. 条件组合

常用逻辑条件有 andornot。复杂条件建议加括号,方便后续自己回看。

# 源地址为 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
tcpdump 极简模式观察 eth0 流量
极简模式下快速观察源地址、目的地址和协议。

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'
tcpdump 观察 DNS 请求
通过 DNS 报文可以判断解析是否发出、请求的目标 DNS 服务器是谁。

3. 观察 ICMP 连通性

排查连通性时,可以一边开一个 shell 长 ping,另一边用 tcpdump 抓 ICMP,看请求和回包是否都能看到。

tcpdump -i eth0 -nn 'icmp'
tcpdump 观察 ICMP 报文
如果只看到 Echo Request,看不到 Echo Reply,通常要继续排查回程路由、防火墙或对端策略。

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 适合先粗略判断有没有流量,但它不一定保留完整二层信息。需要更精确分析时,建议切到具体网卡,例如 eth0ens33bond0

生产环境注意:tcpdump 本身会增加少量系统开销。高流量机器上建议带上过滤条件、-c 数量限制或写入 pcap,避免终端刷屏和磁盘被写满。

© 版权声明

相关文章