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紧急指针
相关推荐
woniu_maggie20 分钟前
SAP DOI EXCEL&宏的使用
后端·excel
Ronin-Lotus1 小时前
上位机知识篇---Linux特殊功能文件
linux·运维·服务器·特殊功能寄存器
二两小咸鱼儿1 小时前
Java Demo - JUnit :Unit Test(Assert Methods)
java·后端·junit
字节源流1 小时前
【spring】配置类和整合Junit
java·后端·spring
Zucker n2 小时前
Ubuntu本地部署Open manus(完全免费可用)
linux·运维·ubuntu
静候光阴2 小时前
python使用venv命令创建虚拟环境(ubuntu22)
linux·开发语言·python
zhuyasen3 小时前
Go语言配置解析:基于viper的conf库优雅解析配置文件
后端·go
2a3b4c3 小时前
读取 Resource 目录下文件内容
后端
Asthenia04123 小时前
NIO:Buffer对象均是在Jvm堆中分配么?听说过DirectByteBuffer和MappedByteBuffer么?
后端
灵山悟空4 小时前
rust语言match模式匹配涉及转移所有权Error Case
linux·开发语言·rust