TCPdump-Linux抓包

目标

  1. 能使用基本指令抓取数据包
  2. 能读懂抓取到的数据

基本指令

TCPdump指令规则概括如下:

  • tcpdump 选项 过滤项

tcpdump教程

选项

  • -i 网卡:指定网卡
  • -w xxx.pcap:将结果写入文件中
  • -r xxx.pcap:从文件中读取数据,可以使用过滤语法获得输出
  • -s 0:截取前n个字节,为0则全部显示
  • -l:按行输出
  • -n/nn:不把ip/(ip与端口)转化为域名
  • -v/vv/vvv:产生详细/(更详细)的输出,比如TTL
  • -t/tt:每行输出不会输出时间/时间与时间戳
  • -X/XX:以16进制和ASCii形式输出每个包的数据(包括连接层)
  • -A:ASCii显示所有数据包(当不显示链路层头部信息)
  • -e:显示链路层头部信息

过滤项

限定数据包

1. proto

  • tcp、upd、icmp等
  • ip
    • ipv4:ip proto 6
    • ipv6:ip6 proto 6
  • 举例
    • tcpdump tcp:这会把ipv4和ipv6都包括

2. dir

后面必须跟主机地址host或端口port或net或portrange

  • src 过滤条件设定的来源地址
  • dsc 设定的是目标地址
  • src or dst
  • tcpdump src port 22

3.1 host

  • 指定 host ip 进行过滤
  • tcpdump host 192.168.10.100

3.2 net

  • 指定网段
  • tcpdump net 192.168.10.0/24
  • tcpdump net 192.168

3.3 port

  • 指定端口
  • tcpdump port 8088
  • tcpdump port 80 or port 8088

3.4 portrange

  • 指定多个连续端口
  • tcpdump portrange 8000-8080

4. 混合

  • not > and > or
  • 如果需要括号,由于括号是特殊字符,需要将过滤项使用引号包起来
  • proto和src相当于是后面type的修饰限定,只是proto可以单独使用,而src后面必须跟type
  • tcpdump tcp port 23 or src port 22
  • tcpdump eth0 'src net 192.168.0.0/24 and (tcp port 22 or udp port 53)'

5. 高级过滤

  1. 高级过滤技巧
  • 按 TCP 标志位过滤
    • proto [ expr:size ]:读取协议头部的第expr到expr+size字节

    • tcp的标志位在13字节,可以使用关键字tcpflags来替代,该字节每个比特代表不同标志,如下所示,所以可以按照tcp[tcpflags]的取值来决定报文类型

Bash 复制代码
# 以下都是抓取syn + ack 包,既第二次握手
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'
tcpdump -i eth0 'tcp[13] == 2 or tcp[13] == 16'
tcpdump -i eth0 "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"
tcpdump -i eth0 'tcp[13] = 18'
  • 按数据内容过滤
Bash 复制代码
tcpdump -A 'tcp port 80 | grep "GET /"'    # 抓取 HTTP GET 请求
  1. 实用场景示例
  • 抓取 HTTP 请求头
Bash 复制代码
tcpdump -i eth0 -A -s0 'tcp port 80' | egrep "Host:|User-Agent:"
  • 分析 DNS 查询
Bash 复制代码
tcpdump -n udp port 53                     # 显示原始 IP 和端口

数据格式

pcap 复制代码
21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
  1. 第一列:时分秒毫秒 21:26:49.013621
  2. 第二列:网络协议 IP
  3. 第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而15605 是端口号
  4. 第四列:箭头 >, 表示数据流向
  5. 第五列:接收方的ip地址+端口号,其中 172.20.20.2 是 ip,而5920 是端口号
  6. 第六列:冒号
  7. 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1且带了ack确认,更多标识符见下面,部分之间可组合,如[S.]:SYN + ACK(三次握手第二次报文)
    • [S] : SYN(开始连接)
    • [P] : PSH(推送数据)
    • [F] : FIN(结束连接)
    • [R] : RST(重置连接)
    • [.] : 只有ACK(纯确认报文)或还有URG紧急指针
相关推荐
翻滚吧键盘4 分钟前
opensuse tumbleweed上安装显卡驱动
linux
不死的精灵1 小时前
【Java21】在spring boot中使用ScopedValue
java·spring boot·后端
cui_win1 小时前
【内存】Linux 内核优化实战 - net.ipv4.tcp_tw_reuse
linux·网络·tcp/ip
M1A11 小时前
TCP/IP协议精解:IP协议——互联网世界的邮政编码系统
后端·网络协议·tcp/ip
逸风尊者2 小时前
开发易掌握的知识:GeoHash查找附近空闲车辆
java·后端
程序猿阿越3 小时前
Kafka源码(一)Controller选举与创建Topic
java·后端·源码
程序员爱钓鱼3 小时前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin
Jiude3 小时前
MinIO 社区版被故意阉割,Web管理功能全面移除。我来试试国产RustFS
后端·docker·架构
仰望星空@脚踏实地3 小时前
Spring Boot Web 服务单元测试设计指南
spring boot·后端·单元测试
羊小猪~~3 小时前
数据库学习笔记(十七)--触发器的使用
数据库·人工智能·后端·sql·深度学习·mysql·考研