tcpdump 使用详解

tcpdump 使用详解

tcpdump 是 Linux/Unix 系统中最强大、最常用的网络抓包和分析工具,它可以捕获经过网络接口的数据包,并以可读格式显示,用于网络调试、安全分析、性能排查等。


🚀 一、基本语法

bash 复制代码
tcpdump [选项] [过滤表达式]

🔍 二、常用选项(Options)

选项 说明
-i 指定监听的网络接口,如 eth0 , wlan0 , any (所有接口)
-n 不解析主机名(显示 IP 而不是域名)
-nn 不解析主机名和端口名(显示数字端口,如 80 而不是 http)
-v 显示详细信息(可叠加: -vv , -vvv 更详细)
-q 快速模式,减少输出信息(更简洁)
-c 只捕获前 num 个包后自动停止
-s 设置捕获包的长度(字节), -s 0 表示抓完整包
-w 将捕获的数据包写入文件(用于后续分析)
-r 从文件读取数据包进行分析(配合 -w 使用)
-X 以十六进制和 ASCII 格式显示包内容(用于查看数据)
-XX 同 -X ,但包含以太网头部
-e 显示数据链路层(MAC)头部信息

🧩 三、常见用法示例

1. 抓取指定接口的所有流量

bash 复制代码
tcpdump -i eth0

抓取 eth0 接口上的所有数据包。

2. 不解析主机名和端口(推荐)

bash 复制代码
tcpdump -i any -nn

-nn 让输出更清晰,避免 DNS 查询延迟。

3. 只抓 10 个包就停止

bash 复制代码
tcpdump -i wlan0 -c 10 -nn

适合快速查看,避免输出太多。

4. 抓包并保存到文件(用于后续分析)

bash 复制代码
tcpdump -i any -nn -s 0 -w capture.pcap
  • w capture.pcap:将原始包保存为 .pcap 文件
  • 可用 Wireshark、tcpdump -r 打开分析

5. 从文件读取并分析

bash 复制代码
tcpdump -r capture.pcap -nn

查看之前保存的抓包文件。

6. 只抓 TCP 流量

bash 复制代码
tcpdump -i any 'tcp'

使用过滤表达式 'tcp',只抓 TCP 包。

7. 抓指定主机的流量

bash 复制代码
tcpdump -i any 'host 192.168.1.100'

抓与 192.168.1.100 通信的所有包。

8. 抓指定端口的流量

bash 复制代码
tcpdump -i any 'port 80'

抓所有使用 80 端口(HTTP)的包。

9. 抓指定 IP 和端口的组合

bash 复制代码
tcpdump -i any 'host 192.168.1.100 and port 22'

抓 192.168.1.100 的 SSH(端口 22)流量。

10. 抓 HTTP 请求(GET/POST)

bash 复制代码
tcpdump -i any -A 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354)'
  • A:以 ASCII 显示包内容
    这条命令匹配 GET 或 POST 开头的 HTTP 请求。

11. 显示包内容(十六进制 + ASCII)

bash 复制代码
tcpdump -i any -X 'port 53'

查看 DNS 查询的原始内容。

12. 抓 ICMP(ping)包

bash 复制代码
tcpdump -i any 'icmp'

查看 ping 命令产生的流量。

13. 排除某种流量

bash 复制代码
tcpdump -i any 'not port 22 and not port 53'

抓除 SSH 和 DNS 外的所有流量。

📦 四、过滤表达式语法(BPF - Berkeley Packet Filter)

tcpdump 支持强大的过滤语法:

类型 示例
协议 tcp , udp , icmp , ip , arp
主机 host 192.168.1.1
网络 net 192.168.1.0/24
端口 port 80 , portrange 80-8080
方向 src , dst , src or dst
逻辑操作 and , or , not

示例组合:

bash 复制代码
# 源 IP 为 192.168.1.100 且目标端口为 443
tcpdump 'src 192.168.1.100 and dst port 443'

# 来自或去往 192.168.1.0/24 网络的 UDP 流量
tcpdump 'net 192.168.1.0/24 and udp'

🧪 五、实际应用场景

场景 命令示例
调试网页打不开 tcpdump -i any -nn 'host example.com'
检查是否被防火墙 drop 抓包看是否有请求但无响应( drop 无回复, reject 有 RST )
分析 DNS 查询 tcpdump -i any -nn 'port 53'
查看设备是否在发广播 tcpdump -i any 'broadcast'
抓手机 App 流量 tcpdump -i wlan0 -w app.pcap ,用 Wireshark 分析

📂 六、保存和分析

bash 复制代码
# 抓包保存
tcpdump -i any -s 0 -w /tmp/debug.pcap -c 100
# 用 Wireshark 分析
wireshark /tmp/debug.pcap
  • pcap 文件是标准格式,可用 Wireshark、tshark、CloudShark 等工具打开。

⚠️ 七、注意事项

  • 需要 root 权限 或 CAP_NET_RAW 能力:sudo tcpdump ...
  • 抓包可能影响性能,避免长时间全量抓包
  • s 0 抓完整包,否则可能截断数据
  • 生产环境慎用,避免泄露敏感数据

BPF 过滤表达式基本语法

tcpdump 使用 BPF(Berkeley Packet Filter) 作为其过滤语言。它是一种基于表达式的语言,用于描述"哪些数据包需要捕获"。

一、基本结构:

原语 逻辑操作符 原语 ...

  • 原语(Primitives):描述包的某个特征(如端口、IP、协议等)
  • 逻辑操作符:and、or、not(也可用 &&、||、!)

二、可用的过滤属性(原语)

以下是 tcpdump 支持的主要过滤属性,分为几大类:

1. 协议(Protocol)

表达式 说明
tcp 只抓 TCP 包
udp 只抓 UDP 包
icmp 只抓 ICMP 包(如 ping)
ip IPv4 包
ip6 IPv6 包
arp ARP 请求/响应
ether 以太网帧
示例:
bash 复制代码
tcpdump 'tcp'           # 只抓 TCP
tcpdump 'icmp or arp'   # 抓 ICMP 或 ARP

2. 主机(Host)

表达式 说明
host 192.168.1.1 抓与该 IP 通信的所有包
src host 1.1.1.1 只抓源 IP 为 1.1.1.1 的包
dst host 8.8.8.8 只抓目标 IP 为 8.8.8.8 的包
示例:
bash 复制代码
tcpdump 'host 192.168.1.100'
tcpdump 'src host 10.0.0.5'

3. 网络(Network)

表达式 说明
net 192.168.1.0/24 抓与该网段通信的包
src net 10.0.0.0/8 源网络
dst net 172.16.0.0/16 目标网络
示例:
bash 复制代码
tcpdump 'net 192.168.1.0/24'

4. 端口(Port)

表达式 说明
port 80 抓使用 80 端口的包(TCP/UDP)
src port 53 源端口为 53(DNS)
dst port 443 目标端口为 443(HTTPS)
portrange 80-8080 抓端口在 80 到 8080 范围内的包
示例:
bash 复制代码
tcpdump 'port 80 or port 443'        # HTTP 和 HTTPS
tcpdump 'src port 1024-65535'        # 高端口(客户端端口)

5. 方向(Direction)

表达式 说明
src 源(source)
dst 目标(destination)
src or dst 源或目标
src and dst 源和目标(通常用于组合)
示例:
bash 复制代码
tcpdump 'src host 192.168.1.100 and dst port 80'

6. 数据包内容(Payload)

表达式 说明
tcp12 & 0xf0 > 0 查看 TCP 头部长度
tcptcpflags & tcp-syn != 0 抓 SYN 包
tcptcpflags & tcp-ack != 0 抓 ACK 包
ip6 & 0x20 != 0 抓 IP 分片包
高级示例:抓 HTTP GET 请求
bash 复制代码
tcpdump 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420)'

0x47455420 是 "GET " 的十六进制 ASCII 值

7. 广播与多播(Broadcast / Multicast)

表达式 说明
broadcast 抓广播包(如 ARP)
multicast 抓多播包
示例:
bash 复制代码
tcpdump 'broadcast'      # 如 DHCP 请求
tcpdump 'multicast'

8. 包长度(Packet Length)

表达式 说明
greater 100 包大小大于 100 字节
less 500 包大小小于 500 字节
示例:
bash 复制代码
tcpdump 'greater 1500'   # 抓超大包(可能分片)

三、逻辑操作符(Logical Operators)

操作符 说明 优先级
not 或 ! 取反
and 或 &&
or 或 ||

优先级示例:

bash 复制代码
# 等价于: (host 192.168.1.100) and (port 80 or port 443)
tcpdump 'host 192.168.1.100 and port 80 or port 443'

# 更清晰写法(推荐加括号):
tcpdump 'host 192.168.1.100 and (port 80 or port 443)'

⚠️ 注意:and 优先级高于 or,复杂表达式建议使用括号明确逻辑。

四、实用组合示例

需求 命令
抓某 IP 的 HTTP/HTTPS 流量 tcpdump 'host 192.168.1.100 and (port 80 or port 443)'
抓外网入站 SYN 包 tcpdump 'src net 0.0.0.0/0 and dst port 22 and tcptcpflags & tcp-syn != 0'
抓 DNS 查询 tcpdump 'udp port 53 and dst port 53'
抓非本地流量 tcpdump 'not net 192.168.0.0/16'
抓 TCP 建立连接(SYN) tcpdump 'tcptcpflags & tcp-syn != 0'
抓 TCP 断开连接(FIN) tcpdump 'tcptcpflags & tcp-fin != 0'

五、注意事项

  1. 引号:建议用单引号 ' 包裹表达式,防止 shell 解析 ()、$ 等字符。
  2. 括号:复杂逻辑必须用括号 () 明确优先级。
  3. 性能:过滤越精确,性能越好,避免抓全量包。
  4. 权限:需要 root 或 CAP_NET_RAW 权限。
相关推荐
STQY燊桐启元(深圳)电子科技5 小时前
医疗精密电源散热方案:相变陶瓷片保障医疗设备长效稳定低干扰
大数据·网络·人工智能
CDN3607 小时前
节点智能调度实操:解决出海区域访问快慢不均、节点拥堵、跨洋延迟高,CDN 全网择优落地方案
运维·服务器·网络
roman_日积跬步-终至千里8 小时前
【数据治理(6)】DataOps 不是调度工具,而是让数据产品长期可信的运行机制
java·服务器·网络
可乐鸡翅yeah_10 小时前
个人 / 外包流媒体项目交付实战,M3U8 验收与问题闭环完整工作流
运维·网络·python·低代码·django·m3u8·在线播放
黄俊懿11 小时前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第十节:网关安全-单向加密
网络·数据库·计算机网络·安全·架构·系统架构·架构师
Patrick在香港11 小时前
Python 拉取城巴开放数据:406 条路线,香港岛巴士网络的数字画像
网络·python·数据分析·php·数据可视化·香港·开放数据
一直C12 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
Experience-摆渡12 小时前
自建 IP 轮换方案实战:健康探测 + 熔断剔除 + 粘性会话
网络·网络协议·tcp/ip
luj_176812 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法
库玛西12 小时前
Linux网络编程:HTTP/HTTPS协议核心技术全解析
linux·运维·服务器·网络·c++·http·https