tcpdump 是什么
tcpdump 通过 libpcap 把网卡上经过的数据帧按过滤表达式筛选后打印出来。它的价值在于提供不可争辩的证据:在服务端抓不到 SYN,说明请求根本没到这台机器;抓到 SYN 却没有 SYN-ACK,说明是本机协议栈没有应答或出方向被拦。排查「网络还是应用」这类争执时,抓包比翻配置和日志都快。需要记住它的视野边界——只能看到流经本机网卡的流量,交换机上其他主机之间的通信不在其中。
基本信息
| 适用平台 | Linux、macOS、BSD(tcpdump 4.x);Windows 上一般用 Wireshark 或 npcap 自带工具 |
|---|---|
| 命令语法 | tcpdump [选项] [过滤表达式] |
| 常用选项 | -i 指定接口(any 表示所有)、-nn 不做名称与端口解析、-c 抓取包数、-s 快照长度、-w 写入 pcap 文件、-r 读取 pcap、-A 以 ASCII 显示载荷、-X 十六进制加 ASCII、-e 显示链路层头部、-D 列出可用接口 |
| 过滤表达式 | host / net / port / portrange 限定对象,tcp、udp、icmp 限定协议,and、or、not 组合条件,tcp[tcpflags] 可按标志位筛选 |
| 权限要求 | 需要 root 或 CAP_NET_RAW(部分发行版还需要 CAP_NET_ADMIN);容器里抓包通常要 --cap-add=NET_RAW 或使用宿主网络 |
典型使用场景
- 确认请求是否到达:应用说没收到请求,抓包看有没有对应的 SYN 或数据包
- 验证握手是否完成:SYN 有而 SYN-ACK 没有,问题在本机响应或出方向策略
- 排查 DNS 解析:抓 udp port 53 看有没有发出查询、有没有收到应答
- 审计可疑外联:按目标网段或端口过滤,确认机器是否在连接不该连的地址
- 存档给图形工具分析:-w 写出 pcap,再用 Wireshark 做时序与协议解码
- 查看明文协议内容:HTTP 之类未加密协议用 -A 直接看请求与响应头
常用示例
常用示例
tcpdump -i any -nn -c 20
tcpdump -i eth0 -nn 'tcp port 443 and host 10.0.0.5'
tcpdump -i eth0 -nn -A 'tcp port 80' -c 5 # 看 HTTP 明文
tcpdump -i any -nn 'tcp[tcpflags] & tcp-syn != 0' -c 20 # 只看 SYN
tcpdump -i eth0 -nn 'udp port 53' -c 10 # 看 DNS 查询
tcpdump -i eth0 -nn -w /tmp/cap.pcap 'host 10.0.0.9 and port 8080' # 存盘待分析
tcpdump -nn -r /tmp/cap.pcap 'tcp.port == 8080' 2>/dev/null || tcpdump -nn -r /tmp/cap.pcap 'port 8080'
tcpdump -i eth0 -nn -e 'arp' -c 10 # 看链路层与 ARP常用过滤器
| 写法 | 含义 | 场景 |
|---|---|---|
| host 10.0.0.5 | 限定某个 IP(双向) | 锁定单台对端 |
| src/dst host | 只匹配源或目的地址 | 区分调用方与服务方 |
| port 8080 / portrange | 按端口或端口范围过滤 | 验证服务端口是否有流量 |
| tcp[tcpflags] & tcp-syn | 按 TCP 标志位筛选 | 只看建连请求,快速判断是否到达 |
| not port 22 | 排除自身管理流量 | 避免 SSH 会话把结果刷满 |
| and / or / not | 条件组合,注意优先级 | 复杂条件用双层引号包裹整体 |
过滤在抓包环节就由内核的 BPF 完成,比先抓全部再 grep 高效得多。高流量网卡上不加过滤地抓包可能来不及处理,输出里会出现 packets dropped by kernel 的提示,那说明抓到的数据已经不完整。
写文件用 -w 时不打印摘要,适合长时间抓取;配合 -c 限制包数、-C 与 -W 做按大小轮转,避免把磁盘写满。pcap 文件之后可以用 -r 回放,也可以拷到本地用 Wireshark 分析。
抓包内容可能包含明文凭据、会话令牌与个人数据。只抓与问题相关的范围(用 host 与 port 收窄),文件设置最小权限并及时删除;在生产机器上长时间抓包还要评估 CPU 与磁盘 IO 的影响。
快照长度的取舍:老教程常写 -s0 表示抓取完整报文,而现代 tcpdump 的默认快照长度已经是 262144 字节,足以容纳常见报文;如果显式用 -s 96 只抓头部,写出的 pcap 里就没有应用层内容,事后无法分析载荷。要留档分析就不要限制快照长度。