> 技术文档 > 【Linux】抓包工具-tcpdump_linux抓包工具

【Linux】抓包工具-tcpdump_linux抓包工具

tcpdump 的全面技术详解,涵盖核心功能、高级用法及实战场景,帮助您从基础到精通掌握这一网络诊断工具。


一、tcpdump 基础

1. 工具定位
  • 核心作用:命令行网络抓包工具,基于 libpcap 库实现,支持 BPF(Berkeley Packet Filter) 语法过滤。
  • 适用场景
    • 网络故障排查(连接超时、丢包、协议异常)
    • 安全分析(恶意流量检测、数据泄露追踪)
    • 协议逆向工程(解析自定义协议格式)
    • 性能调优(流量统计、延迟分析)
2. 安装与权限
  • 安装命令
    # Ubuntu/Debiansudo apt-get install tcpdump# CentOS/RHELsudo yum install tcpdump# macOS (通过Homebrew)brew install tcpdump
  • 权限要求
    • rootCAP_NET_RAW 权限(推荐使用 sudo
    • 普通用户可访问 /dev/bpf* 设备(部分系统需配置)

二、核心命令行选项

1. 接口与输出控制
选项 说明 -i eth0 指定网卡(any 表示所有接口) -D 列出可用网卡列表 -n / -nn 禁用 DNS 解析(-nn 同时禁用端口服务名转换) -q 简洁输出(减少协议层级显示) -v, -vv, -vvv 递增详细模式(显示 TTL、校验和等)
2. 捕获与存储
选项 说明 -c 100 捕获 100 个包后停止 -s 1500 设置抓包长度(-s0 表示捕获完整数据包) -w output.pcap 原始数据保存为 PCAP 文件 -r input.pcap 读取 PCAP 文件进行分析 -G 3600 每小时轮转一个文件(配合 -w 使用,文件名需含 %Y%m%d%H%M%S 格式) -C 100 文件大小超过 100MB 后轮转
3. 数据展示格式
选项 说明 -A ASCII 格式输出(适合 HTTP/文本协议) -X 十六进制 + ASCII 混合输出 -e 显示链路层头部(MAC 地址) -l 行缓冲模式(实时输出到管道或文件)

三、过滤表达式详解

1. BPF 语法结构
[协议] [方向] [类型] [值] [逻辑操作] ...
  • 协议tcp, udp, icmp, arp, ip6, ether, wlan
  • 方向src, dst, src or dst, src and dst
  • 类型host, net, port, portrange, proto, gateway
  • 逻辑操作and (&&), or (||), not (!)
2. 常用过滤规则
  • IP 过滤
    host 192.168.1.1 # 指定主机net 10.0.0.0/24 # 指定网段src 172.16.0.5 and dst 8.8.8.8 # 源与目标组合
  • 端口过滤
    port 80  # 单一端口dst port 53  # 目标端口portrange 8000-8080 # 端口范围not port 22  # 排除 SSH
  • 协议组合
    tcp and port 443 # HTTPS 流量icmp or arp  # ICMP 或 ARPudp and not port 53 # 非 DNS 的 UDP
3. 高级过滤技巧
  • 按包内容过滤
    # 匹配 HTTP GET 请求(0x47455420 是 \"GET \" 的十六进制)tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420
  • 按 TCP 标志位过滤
    \'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0\' # SYN 或 ACK 包\'tcp[13] & 2 != 0\' # SYN 包(第13字节第2位)
  • 按包长度过滤
    greater 1024 # 长度 > 1024 字节less 64 # 长度 < 64 字节

四、实战场景示例

1. 基础抓包
# 捕获 eth0 接口的 HTTP 流量(显示ASCII内容)sudo tcpdump -i eth0 -A -s0 port 80# 捕获所有 ICMP 包(Ping 测试)sudo tcpdump -n icmp
2. 高级分析
# 捕获 DNS 查询和响应(UDP 53端口)sudo tcpdump -n -i any udp port 53# 捕获 TCP 三次握手(SYN包)sudo tcpdump \'tcp[tcpflags] & tcp-syn != 0 and not src net 192.168.1.0/24\'# 捕获 HTTP POST 请求(匹配 \"POST\" 字符串)sudo tcpdump -s0 -A \'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354\'
3. 文件操作
# 保存加密流量供后续分析sudo tcpdump -w ssl_traffic.pcap -s0 port 443# 读取文件并过滤 SSH 连接tcpdump -r ssl_traffic.pcap \'tcp port 22\'

五、输出解读与协议分析

1. 典型输出结构
15:30:45.123456 IP 192.168.1.10.54892 > 172.217.14.206.443: Flags [S], seq 123456789, win 64240, options [mss 1460], length 0
  • 字段分解
    • 15:30:45.123456:时间戳(微秒精度)
    • IP:协议类型(IPv4)
    • 192.168.1.10.54892:源IP + 端口
    • >:方向分隔符
    • 172.217.14.206.443:目标IP + 端口
    • Flags [S]:TCP标志(SYN)
    • seq 123456789:序列号
    • win 64240:窗口大小
    • length 0:数据长度
2. 关键协议特征
  • TCP
    • 标志位:[S] (SYN), [.] (ACK), [F] (FIN), [P] (PSH), [R] (RST)
    • 重传检测:重复序列号 + [S][.] 标志
  • HTTP
    • ASCII 可见的 GET / POST / HTTP/1.1 等请求头
  • DNS
    • UDP 53端口,包含 A?(查询)或 A(响应)标识

六、高级技巧与性能优化

1. 多条件组合过滤
# 捕获来自特定子网的 HTTPS 流量(排除本地端口)sudo tcpdump -i eth0 \'tcp port 443 and src net 10.0.0.0/24 and not dst port 8080\'
2. 流量统计与采样
# 每 60 秒统计一次 HTTP 请求量sudo tcpdump -G 60 -W 1 -w http_%H%M%S.pcap \'tcp port 80\'
3. 性能调优参数
# 增加缓冲区大小(减少丢包)sudo tcpdump -B 4096 -i eth0# 限制捕获包长度(提升性能)sudo tcpdump -s 512 -i eth0

七、安全与注意事项

1. 敏感信息防护
  • 避免捕获明文协议(如 HTTP、FTP)
  • 使用 -w 保存后加密处理文件:
    gpg -c traffic.pcap # 使用 GPG 加密
2. 资源管理
  • 限制文件大小:-C 100(每文件 100MB)
  • 定期清理旧文件:结合 -Gfind 命令
3. 法律合规
  • 企业内网需遵守数据隐私政策
  • 公网抓包可能违反当地法律法规

八、扩展工具链整合

1. 与 Wireshark 协同
  • 保存为 PCAP 文件:tcpdump -w file.pcap
  • 使用 Wireshark 图形化分析:过滤、统计、协议解析
2. 使用 tshark 增强分析
# 实时统计 HTTP 状态码tcpdump -i eth0 -w - | tshark -r - -Y \"http\" -T fields -e http.response.code | sort | uniq -c
3. 结合 awk/grep 处理输出
# 提取所有访问的域名(DNS查询)tcpdump -n -l port 53 | awk \'/A\\?/{print $NF}\'