Bootstrap

Linux 网络抓包分析工具tcpdump详细使用方式 使用方式与wieshark协同工作

目录

tcpdump 工具详解

一、核心原理

1. 抓包机制

2. 协议解析

二、基础使用方式

1. 基本语法

2. 常用选项

3. 过滤表达式

三、高级使用案例

案例 1:捕获 TCP 握手与挥手

案例 2:检测网络重传问题

案例 3:提取 HTTP 请求内容

案例 4:分析 DNS 查询问题

案例 5:统计 TCP 连接状态

四、性能优化技巧

五、与 Wireshark 的协作

六、总结


tcpdump 工具详解

  • tcpdump 是 Linux/Unix 系统中最强大的网络抓包分析工具之一
  • 基于 libpcap 库实现,能够捕获和解析网络接口上的流量。
  • 其核心原理是通过操作系统的网络协议栈获取原始数据包,并根据用户定义的过滤规则进行筛选和展示。
  • 以下是其核心原理、使用方式及高级案例的完整解析。

一、核心原理

1. 抓包机制
  • 混杂模式(Promiscuous Mode)
    默认情况下网卡仅接收目标 MAC 地址为本机的数据包,但 tcpdump 会将网卡设置为混杂模式,捕获经过网卡的所有流量(包括广播和组播包)。

  • BPF(Berkeley Packet Filter)
    通过内核态的 BPF 虚拟机实现高效过滤,用户定义的过滤表达式(如 port 80)会被编译为 BPF 字节码,直接在内核中过滤数据包,避免无用的数据拷贝到用户空间。

  • 内存缓冲机制
    捕获的数据包先存入内核缓冲区,用户空间程序(tcpdump)定期读取缓冲区内容,防止高频流量导致丢包。

2. 协议解析

tcpdump 支持对常见协议(TCP/IP、UDP、ICMP、HTTP 等)的解析,自动解码数据包头部和负载内容。


二、基础使用方式

1. 基本语法
tcpdump [选项] [过滤表达式]
2. 常用选项
选项作用
-i eth0指定网卡(默认抓取第一个非 loopback 接口)
-n禁用 DNS 反向解析(提升速度)
-X以十六进制和 ASCII 显示数据包内容
-c 10捕获 10 个包后自动退出
-w file.pcap将原始数据包保存为 pcap 文件
-r file.pcap读取 pcap 文件进行分析
-s 1500设置抓包长度(默认 262144 字节)
-v/-vv/-vvv增加输出详细度
3. 过滤表达式
  • 按主机/IP
    host 192.168.1.1
    src 10.0.0.5
    dst 8.8.8.8

  • 按端口
    port 80
    dst port 443
    src port 22

  • 按协议
    tcp
    udp
    icmp

  • 逻辑操作符
    and(与)、or(或)、not(非)
    示例:tcp port 80 and host google.com


三、高级使用案例

案例 1:捕获 TCP 握手与挥手
# 捕获与目标服务器的 TCP 三次握手和四次挥手
tcpdump -i eth0 'tcp port 80 and (tcp-syn or tcp-fin)'

输出解析:

11:22:33.456789 IP client.54321 > server.http: Flags [S], seq 123456789
11:22:33.457101 IP server.http > client.54321: Flags [S.], seq 987654321, ack 123456790
11:22:33.457301 IP client.54321 > server.http: Flags [.], ack 987654322
  • Flags [S]:SYN 包
  • Flags [S.]:SYN-ACK 包
  • Flags [F.]:FIN-ACK 包
案例 2:检测网络重传问题
# 捕获 TCP 重传包(重复的 ACK 或超时重传)
tcpdump -i eth0 'tcp[tcpflags] & (tcp-ack) != 0 and tcp[8:4] < tcp[12:4]'
  • 原理:检查数据包的确认号(ACK)是否小于当前序列号,标识数据包丢失。
案例 3:提取 HTTP 请求内容
# 捕获 HTTP GET/POST 请求的 URL 和头部
tcpdump -i eth0 -s 0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0' | egrep --line-buffered "^........(GET|POST) |[^A-Za-z0-9-]User-Agent:"
  • 解析:通过计算 IP 和 TCP 头部偏移量提取 HTTP 负载。
案例 4:分析 DNS 查询问题
# 捕获 DNS 请求与响应
tcpdump -i eth0 -n 'udp port 53 and (udp[10] & 0x80 = 0 or udp[10] & 0x80 = 0x80)'
  • 输出示例:
    12:34:56.789012 IP 192.168.1.100.54321 > 8.8.8.8.53: 12345+ A? google.com (28)
    12:34:56.812345 IP 8.8.8.8.53 > 192.168.1.100.54321: 12345 1/0/0 A 172.217.160.110 (44)
    
    • A? google.com:DNS 查询请求
    • A 172.217.160.110:DNS 响应结果
案例 5:统计 TCP 连接状态
# 统计 SYN/FIN/RST 包数量(用于分析连接异常)
tcpdump -i eth0 -n 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0' -c 1000 | awk '{print $NF}' | sort | uniq -c
  • 输出:
     623 Flags [S]
     12 Flags [F.]
     5 Flags [R]
    
    • 大量 SYN 包可能表示 SYN Flood 攻击。

四、性能优化技巧

  1. 减少抓包量

    • 精确过滤:避免使用 tcpdump -i eth0 无过滤抓包。
    • 限制包长度:-s 128 仅捕获头部信息。
  2. 提升处理速度

    • 禁用解析:-n(禁用 DNS)、-q(简略输出)。
    • 使用 BPF 过滤:在内核态完成过滤,如 tcp port 80
  3. 避免丢包

    • 增大缓冲区:-B 4096 设置 4MB 缓冲区。
    • 使用内核抓包工具:如 dumpcap(Wireshark 底层工具)。

五、与 Wireshark 的协作

  1. 保存为 pcap 文件

    tcpdump -i eth0 -w traffic.pcap 'tcp port 80'
    
    • 在 Wireshark 中打开 traffic.pcap,使用图形界面深入分析。
  2. 实时远程抓包

    # 在服务器上捕获流量并实时发送到本地 Wireshark
    ssh user@server "tcpdump -i eth0 -U -w - 'port 22'" | wireshark -k -i -
    

六、总结

  • tcpdump 是网络工程师的“听诊器”,可用于排查连接问题、分析协议交互、检测攻击行为。
  • 高阶技巧:结合 BPF 过滤、协议偏移量计算、统计命令(如 awk)实现自动化分析。
  • 注意事项:抓包可能涉及隐私信息,需遵守法律法规。

喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

;