随机
Enter 搜索 ↑↓ 切换 Esc 清空

tcpdump

命令

数据包抓取分析工具

tcpdump

数据包抓取分析工具

补充说明

tcpdump 是命令行网络数据包抓取工具,用于捕获和分析网络流量。是网络故障排查和安全分析的核心工具。

语法

tcpdump [OPTIONS] [expression]

基本使用

# 抓取所有流量
tcpdump

# 抓取指定接口
tcpdump -i eth0
tcpdump -i any                    # 所有接口

# 抓取指定数量的包
tcpdump -c 10
tcpdump -c 100 -i eth0

# 不解析主机名(更快)
tcpdump -n
tcpdump -nn                       # 不解析主机名和端口名

# 显示详细信息
tcpdump -v
tcpdump -vv
tcpdump -vvv

# 显示十六进制和 ASCII
tcpdump -X
tcpdump -XX                       # 包含链路层

# 显示时间戳
tcpdump -t                        # 不显示时间
tcpdump -tt                       # Unix 时间戳
tcpdump -ttt                      # 相对时间
tcpdump -tttt                     # 日期时间

# 实时输出(不缓冲)
tcpdump -l

主机过滤

# 抓取指定主机的流量
tcpdump host 192.168.1.1
tcpdump host www.example.com

# 抓取源主机
tcpdump src host 192.168.1.1
tcpdump src 192.168.1.1

# 抓取目标主机
tcpdump dst host 192.168.1.1
tcpdump dst 192.168.1.1

# 抓取多个主机
tcpdump host 192.168.1.1 or host 192.168.1.2
tcpdump host 192.168.1.1 && host 192.168.1.2

端口过滤

# 抓取指定端口
tcpdump port 80
tcpdump port 443
tcpdump port ssh

# 抓取源端口
tcpdump src port 80
tcpdump src port 8080

# 抓取目标端口
tcpdump dst port 80
tcpdump dst port 443

# 抓取端口范围
tcpdump portrange 80-88
tcpdump portrange 8000-9000

# 抓取多个端口
tcpdump port 80 or port 443
tcpdump port 80 || port 443

协议过滤

# TCP 流量
tcpdump tcp
tcpdump tcp port 80

# UDP 流量
tcpdump udp
tcpdump udp port 53

# ICMP 流量
tcpdump icmp

# ARP 流量
tcpdump arp

# IP 流量
tcpdump ip

# IPv6 流量
tcpdump ip6

# HTTP 流量
tcpdump tcp port 80

# DNS 流量
tcpdump udp port 53
tcpdump port 53

# SSH 流量
tcpdump port 22

# SMTP 流量
tcpdump port 25

# 组合过滤
tcpdump tcp and port 80
tcpdump udp and port 53
tcpdump icmp and host 192.168.1.1

网络过滤

# 抓取指定网段
tcpdump net 192.168.1.0/24
tcpdump net 192.168.1.0 mask 255.255.255.0

# 抓取源网段
tcpdump src net 192.168.1.0/24

# 抓取目标网段
tcpdump dst net 192.168.1.0/24

# 抓取广播流量
tcpdump broadcast

# 抓取组播流量
tcpdump multicast

组合过滤

# AND (&& 或 and)
tcpdump host 192.168.1.1 && port 80
tcpdump host 192.168.1.1 and port 80

# OR (|| 或 or)
tcpdump port 80 || port 443
tcpdump port 80 or port 443

# NOT (! 或 not)
tcpdump not port 22
tcpdump ! port 22

# 复杂过滤
tcpdump host 192.168.1.1 && (port 80 || port 443)
tcpdump src host 192.168.1.1 && dst port 80
tcpdump tcp && (port 80 || port 443 || port 8080)
tcpdump ip host 192.168.1.1 && ! port 22

TCP 标志过滤

# TCP 标志
# SYN: S, ACK: A, FIN: F, RST: R, PSH: P, URG: U

# 抓取 SYN 包
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
tcpdump 'tcp[tcpflags] & (tcp-syn) != 0'

# 抓取 SYN-ACK 包
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn|tcp-ack'

# 抓取 FIN 包
tcpdump 'tcp[tcpflags] & tcp-fin != 0'

# 抓取 RST 包
tcpdump 'tcp[tcpflags] & tcp-rst != 0'

# 抓取新连接(SYN 包)
tcpdump 'tcp[tcpflags] == tcp-syn'
tcpdump 'tcp[13] & 2 != 0'       # 使用数字

# 抓取握手包
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'

保存与读取

# 保存到文件
tcpdump -w capture.pcap
tcpdump -w capture.pcap -c 1000
tcpdump -w capture.pcap port 80

# 从文件读取
tcpdump -r capture.pcap
tcpdump -r capture.pcap -nn

# 保存时显示内容
tcpdump -w capture.pcap -v

# 限制文件大小
tcpdump -w capture.pcap -C 10    # 每个 10 MB
tcpdump -w capture.pcap -C 10 -W 5  # 最多 5 个文件

# 循环写入
tcpdump -w capture.pcap -G 60    # 每 60 秒一个文件
tcpdump -w capture_%Y%m%d_%H%M%S.pcap -G 60 -W 10

# 读取时过滤
tcpdump -r capture.pcap port 80
tcpdump -r capture.pcap tcp

包大小过滤

# 抓取大于指定大小的包
tcpdump greater 100
tcpdump greater 500

# 抓取小于指定大小的包
tcpdump less 100
tcpdump less 500

# 抓取指定大小的包
tcpdump greater 100 && less 200

# 指定抓包长度(截断)
tcpdump -s 0                     # 抓取完整包
tcpdump -s 100                   # 只抓前 100 字节
tcpdump -s 1500                  # 抓取 MTU 大小

高级过滤

# 基于字节过滤
tcpdump 'tcp[13] & 8 != 0'       # PSH 标志
tcpdump 'tcp[13] & 16 != 0'      # ACK 标志

# HTTP 过滤(端口 80)
tcpdump port 80 and 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'  # GET
tcpdump port 80 and 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'  # POST

# 抓取 HTTP 请求
tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

# 显示 ASCII
tcpdump -A port 80
tcpdump -A port 25

# 显示十六进制和 ASCII
tcpdump -XX port 80

实用组合

# 抓取 Web 流量
tcpdump -i eth0 -nn -XX port 80

# 抓取 DNS 查询
tcpdump -i eth0 -nn port 53

# 抓取 SSH 流量(不包含本机)
tcpdump -i eth0 -nn 'port 22 and not host 192.168.1.100'

# 抓取 ICMP 流量(ping)
tcpdump -i eth0 -nn icmp

# 抓取 MySQL 流量
tcpdump -i eth0 -nn -XX port 3306

# 抓取完整的 HTTP 会话
tcpdump -i eth0 -A -s 0 port 80

# 抓取特定主机的 TCP SYN 包
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0' and host 192.168.1.1

# 抓取并保存
tcpdump -i eth0 -w /tmp/capture.pcap -c 1000

# 实时分析 HTTP
tcpdump -i eth0 -A -s 0 port 80 | grep -i 'GET\|POST\|Host'

# 监控网络流量统计
tcpdump -i eth0 -q