suricata学习杂记(一)

一、概念理解

1.PDU

PDU = Protocol Data Unit,协议数据单元,表示 某一层协议认为的"数据单位"。

例如:
对 HTTP

一个 HTTP 请求报文 = 一个 PDU

一个 HTTP 响应报文 = 一个 PDU
对 DNS(UDP)

一个 DNS 查询 = 一个 PDU

一个 DNS 响应 = 一个 PDU
对 TLS

一个 TLS Record = 一个 PDU
对 Modbus、DNP3 等 SCADA 协议

一个 Modbus ADU = 一个 PDU

PDU 在 TCP 流中的特殊点:

TCP 是流式的,没有边界,因此 PDU 边界需要由解析器自己识别,例如:

HTTP 通过 CRLF、Content-Length、chunked 等判断一个 PDU 的结束。

TLS 根据 Record Header(5 bytes)得知一个 Record 的长度,从而识别一个 PDU。

DNS over TCP 依靠前两个字节的 length prefix 决定 PDU 边界。

Suricata 的 parser 会做:stream data → reassembly → detect protocol → parse PDU。

一句话总结

PDU 是某一层协议的"完整数据单元"。

Suricata 解析器按 PDU 切片 TCP/UDP 流,并以 PDU (泛指)为单位生成 TX(事务)用于规则匹配。

**

二、Modbus ADU

**

ADU = Application Data Unit(应用数据单元),它是 Modbus 协议实际在网络上传输的完整数据单位,包含 Modbus 报文头 + PDU。

PDU(Protocol Data Unit)是 Modbus 通用的部分,格式是:Function Code + Data,全世界的 Modbus 都使用相同的 PDU。

Modbus 的三种主要传输方式:

传输类型 ADU 结构 说明
Modbus TCP MBAP Header + PDU 在 TCP 上,无 CRC
Modbus RTU Addr + PDU + CRC 定长 CRC
Modbus ASCII Start + Addr + PDU + LRC + End 文本编码

Suricata 只支持解析 Modbus TCP,不解析 Modbus RTU / Modbus ASCII,因为Modbus RTU 与 ASCII都是通过串口传输的。

Modbus TCP 的 ADU = MBAP Header + PDU。
1)MBAP Header(7 字节)

字段 长度 说明
Transaction ID 2 bytes 请求/响应匹配
Protocol ID 2 bytes 一般为 0
Length 2 bytes 后续 PDU 的长度
Unit ID 1 byte 设备地址(从站地址)

2)Modbus PDU

Function Code (1 byte)

Data (N bytes)

完整例子(Modbus TCP ADU)

一个读取寄存器(Function Code = 0x03)的请求如下:

bash 复制代码
00 01       # Transaction ID
00 00       # Protocol ID
00 06       # Length
01          # Unit ID
03          # Function Code
00 6B 00 03 # Data (address 0x006B, count 3)

这里整段数据 = ADU

后面那部分(03 006B 0003)就是 PDU。

Suricata 中 Modbus ADU 的意义

Suricata app-layer parser 会解析:

①MBAP Header(用于判断 PDU 长度、TX 切分)

②PDU(用于提取寄存器地址、数量、响应值等)

③每一个 ADU 都会作为一个 TX(事务) 交给规则引擎匹配
suricata以PDU为单位生成TX(事务),Modbus TCP中,ADU就相当于PDU。

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习