Linux tcpdump 抓包实战:网卡、主机、端口过滤与 PCAP 分析
1. 服务介绍
tcpdump 是命令行网络抓包工具,使用 pcap 过滤表达式选择数据包,可实时查看接口流量,也可保存为 PCAP 文件供 Wireshark 等工具离线分析。它常用于定位 DNS 解析、TCP 建连、端口不可达、重传、TLS 握手和客户端/服务器链路问题。
tcpdump 不会自动判断故障根因:抓包前要选对接口、确认流量经过当前主机,并根据问题组合主机、协议和端口过滤条件。本文演示 Debian/Linux 上的安装、网卡选择、常用过滤、保存与读取抓包、链路验证和排错。
2. 准备运行环境
• 操作系统:Debian 系 Linux;其他发行版按包管理器调整安装命令。
• 权限:抓取网络接口通常需要 root 或 CAP_NET_RAW 权限;建议用 sudo tcpdump,不要长期给普通用户授予额外能力。
• 网络信息:准备待检查的本机网卡、对端地址、协议和端口;本文用 192.0.2.10、192.0.2.20 作为文档示例地址。
• 工具:安装 tcpdump;读取和显示 PCAP 也可使用 Wireshark/tshark。
• 存储:保存抓包前确认磁盘空间和目录权限;长时间抓包应设置时长、包数或文件轮转。
• 操作建议:先用短时、小范围过滤验证条件,再扩大采集范围;抓包文件可能包含账号、地址和业务数据,按敏感资料保护。
3. 相关知识
• tcpdump -D 列出可抓取接口;-i eth0 指定接口,-i any 监听 Linux 上所有可用接口,但部分链路层信息和重复包表现可能不同。
• -n 不做地址反向解析,-nn 同时不解析主机名和端口服务名,能减少延迟并保持地址、端口原样。
• 过滤表达式使用 and、or、not 组合;混合条件时用括号分组。Shell 中的括号通常要用引号包住整个过滤表达式。
• host 匹配源或目的地址;src host、dst host 分别限制方向;net 匹配网段;port 匹配源或目的端口。
• -w 保存原始包,-r 读取 PCAP;保存时过滤器决定哪些包进入文件,后期无法恢复未采集的流量。
• -s 0 使用 tcpdump 默认快照长度;超出快照长度的报文仍可能被截断。文件会更大,也可能记录敏感载荷。排障时只采集必要时间段和字段。
• TCP 三次握手、DNS 请求/响应、ICMP 和 TLS 握手可用于判断链路阶段。单机抓包只能看到经过该接口的流量;交换网络中的其他主机流量通常需要镜像端口或在端点抓包。
4. 实验步骤
4.1 安装并列出接口
bash
sudo apt update
sudo apt install -y tcpdump
tcpdump --version
ip -br link
ip -br addr
tcpdump -D
从接口列表确认实际流量经过的网卡,例如 ens33、eth0 或 wlan0。不要假定第一张网卡一定是当前业务接口。
4.2 实时查看指定接口
查看接口上所有 IP 流量,数字方式显示地址和端口:
bash
sudo tcpdump -i ens33 -nn
只抓取 20 个包后自动退出:
bash
sudo tcpdump -i ens33 -nn -c 20
监听所有接口并只显示 DNS 流量:
bash
sudo tcpdump -i any -nn 'port 53'
4.3 按主机、网段和方向过滤
抓取与单台主机有关的流量:
bash
sudo tcpdump -i ens33 -nn 'host 192.0.2.10'
分别匹配源地址或目的地址:
bash
sudo tcpdump -i ens33 -nn 'src host 192.0.2.10'
sudo tcpdump -i ens33 -nn 'dst host 192.0.2.10'
只看两个主机之间的通信:
bash
sudo tcpdump -i ens33 -nn 'host 192.0.2.10 and host 192.0.2.20'
抓取某个网段的流量:
bash
sudo tcpdump -i ens33 -nn 'net 192.0.2.0/24'
组合条件时用引号包住过滤器,并显式加括号:
bash
sudo tcpdump -i ens33 -nn '(host 192.0.2.10 and (port 80 or port 443))'
排除某个主机:
bash
sudo tcpdump -i ens33 -nn 'host 192.0.2.10 and not host 192.0.2.20'
4.4 按协议和端口过滤
抓取 TCP 443:
bash
sudo tcpdump -i ens33 -nn 'tcp port 443'
抓取 UDP 123(常见 NTP):
bash
sudo tcpdump -i ens33 -nn 'udp port 123'
抓取 DNS UDP 和 TCP 53:
bash
sudo tcpdump -i ens33 -nn 'port 53'
观察 SSH 建连和 TCP 标志:
bash
sudo tcpdump -i ens33 -nn -vv 'tcp port 22'
只匹配 SYN 且未设置 ACK 的初始建连包:
bash
sudo tcpdump -i ens33 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn'
4.5 保存抓包并限制采集量
抓取与服务器有关的 DNS 流量,最多保存 500 个包:
bash
sudo install -d -m 700 /var/tmp/pcap
sudo tcpdump -i ens33 -nn -s 0 -c 500 \
-w /var/tmp/pcap/dns-test.pcap 'host 192.0.2.10 and port 53'
按时间观察时,使用 timeout 限制抓包时长:
bash
sudo timeout 60 tcpdump -i ens33 -nn -s 0 \
-w /var/tmp/pcap/https-60s.pcap 'host 192.0.2.10 and tcp port 443'
PCAP 可能包含内部地址、DNS 查询、未加密协议载荷和其他敏感信息。采集前确认授权与范围,分析后按组织保留策略存储或删除。
4.6 读取和分析 PCAP
用 tcpdump 读取文件,不再访问网卡:
bash
sudo tcpdump -nn -r /var/tmp/pcap/dns-test.pcap
读取时追加过滤条件,只显示指定主机或端口:
bash
sudo tcpdump -nn -r /var/tmp/pcap/dns-test.pcap 'host 192.0.2.10'
sudo tcpdump -nn -r /var/tmp/pcap/dns-test.pcap 'tcp port 443'
提高协议细节显示级别:
bash
sudo tcpdump -nn -vvv -r /var/tmp/pcap/dns-test.pcap
保存为 .pcap 后,也可用 Wireshark/tshark 查看协议树、流重组、重传和时间间隔。
5. 验证结果
5.1 验证接口与抓包权限
bash
tcpdump -D
sudo tcpdump -i ens33 -nn -c 5
能列出接口并捕获到匹配流量,说明接口选择、权限和基本抓包链路正常。若无包,先确认目标流量是否真的经过该主机和接口。
5.2 用本机流量验证端口过滤
在终端 A 抓取本机 DNS 请求:
bash
sudo tcpdump -i any -nn -c 10 'port 53'
终端 B 生成 DNS 查询:
bash
getent hosts example.com
如果系统使用缓存解析器或查询已命中缓存,抓包可能看不到外部 DNS 包。可改用已授权的 DNS 服务器直接查询,并在对应接口抓包。
5.3 验证 PCAP 文件
bash
sudo tcpdump -i ens33 -nn -c 20 -w /var/tmp/pcap/check.pcap
sudo tcpdump -nn -r /var/tmp/pcap/check.pcap -c 20
file /var/tmp/pcap/check.pcap
能写入并重新读出包记录,说明保存、文件权限和离线读取流程正常。
5.4 验证 TCP 建连过程
服务端启动临时测试监听后,客户端连接并同时抓包:
bash
# 服务端
nc -l 9090
# 抓包端
sudo tcpdump -i any -nn -vv 'tcp port 9090'
# 客户端
nc -vz 192.0.2.10 9090
看到 SYN、SYN/ACK、ACK 表示 TCP 建连完成;只有 SYN 重传通常表示回程路由、防火墙或监听端存在问题。
6. 常见问题
6.1 没有抓到数据包
确认接口、过滤器、路由方向和抓包位置;先去掉过滤器验证接口是否有流量,再逐步加回条件:
bash
sudo tcpdump -i any -nn -c 30
若流量不经过本机接口,需要在实际端点抓包或使用交换机镜像端口。
6.2 提示权限不足
用 sudo tcpdump 运行,并检查当前账号是否具备抓包所需能力。不要为了方便对所有用户开放抓包权限,因为抓包可读取其他进程的网络元数据或明文载荷。
6.3 过滤表达式解析失败
Shell 特殊字符如 (、)、!、& 会被解释。将整个 BPF 表达式放入单引号中,并检查协议、地址和端口表达式拼写。
6.4 主机名解析导致启动慢
使用 -n 或 -nn 禁用地址和端口解析,避免 DNS 反查影响输出速度和结果可读性。
6.5 PCAP 文件过大
缩小接口、主机、协议和端口范围;加 -c 限制包数,或用 timeout 限制时长。不要无过滤地长期写入磁盘。
6.6 抓包看到校验和错误
网卡 checksum offload 可能让本机发送方向的抓包显示校验和未完成;这不一定代表线上报文损坏。应结合接收方向抓包、对端抓包或网卡卸载设置进一步确认。