IoT网络协议基础:MQTT、CoAP、HTTP/HTTPS、Modbus
说实话,搞IoT安全这么多年,我最大的感触就是——协议是流量的灵魂。你连设备在用什么语言说话都搞不清楚,怎么判断它是不是在说胡话?
这一章,咱们就把IoT世界里最常见的四种协议掰开揉碎聊一遍。MQTT、CoAP、HTTP/HTTPS、Modbus,这四位占了IoT流量的八成以上。你只要摸清它们的脾气,异常流量基本逃不过你的眼睛。
MQTT协议:发布/订阅模式的轻量级选手
MQTT,全称Message Queuing Telemetry Transport。名字挺长,说白了就是一个轻量级的发布/订阅消息协议。我最早接触它是在一个智能路灯项目里,几千个节点同时上报状态,HTTP根本扛不住,换了MQTT之后,服务器负载直接降了70%。
核心机制
- Broker(代理):消息的中转站,所有设备都连它
- Topic(主题):消息的分类标签,比如
sensor/temperature - Publisher(发布者):往某个Topic发消息的设备
- Subscriber(订阅者):订阅某个Topic接收消息的设备
关键特征:MQTT的流量模式是双向异步的。发布者发完就走,不关心谁在收。这种模式在正常流量下非常规律——心跳包固定间隔、数据上报周期稳定。一旦出现突发的大量发布或订阅请求,基本就是异常。
报文结构
MQTT报文非常紧凑,固定头部只有2个字节。我拆一个给你看:
固定头部(2字节):
Byte 1: 报文类型(4位) + 标志位(4位)
Byte 2: 剩余长度(可变编码)
常见报文类型:
0x30 = PUBLISH(发布消息)
0x82 = SUBSCRIBE(订阅主题)
0xE0 = PINGREQ(心跳请求)
我的经验:抓MQTT流量时,先看心跳间隔。正常设备通常是30秒到5分钟一次。如果某个IP在1秒内发了上百个PINGREQ,不用犹豫,直接标记异常。
CoAP协议:UDP上的RESTful小精灵
CoAP,Constrained Application Protocol。这玩意儿是专门给资源受限设备设计的——比如那些只有几十KB内存的传感器节点。它基于UDP,但实现了类似HTTP的请求/响应模型。
我记得有一次排查一个水表抄表系统的丢包问题,发现是CoAP的重传机制跟网络防火墙杠上了。嗯,这里面的坑不少。
核心特征
| 特性 | 说明 |
|---|---|
| 传输层 | UDP(默认),支持DTLS加密 |
| 消息模型 | 请求/响应(类似HTTP),支持观察模式 |
| 报文大小 | 通常不超过1024字节 |
| 默认端口 | 5683(非加密)/ 5684(DTLS) |
报文类型
- CON(Confirmable):需要确认的消息,类似HTTP的请求
- NON(Non-confirmable):不需要确认,丢了就丢了
- ACK(Acknowledgement):对CON的确认响应
- RST(Reset):拒绝消息
避坑指南:我曾经在一个项目中遇到CoAP的放大攻击。攻击者伪造源IP发送CON消息,服务器返回的ACK比请求大好几倍。你想想看,如果同时伪造几万个请求,目标网络直接就瘫了。所以,监控CoAP的响应/请求比例非常重要。
HTTP/HTTPS:IoT世界的通用语言
HTTP在IoT里用得其实比你想的要多。很多智能家居设备、摄像头、网关都跑着HTTP。虽然它重,但胜在生态成熟、调试方便。
不过我得说句实话——HTTP在IoT里是最容易被攻击的协议之一。为什么?因为它太通用了,攻击工具遍地都是。
IoT中的HTTP特征
- 请求路径固定:设备通常只访问几个固定API,比如
/api/v1/status - 请求间隔规律:数据上报周期稳定,比如每5分钟一次
- User-Agent可识别:很多IoT设备会带特定的UA字符串
- Payload格式统一:JSON或XML,结构基本不变
异常信号:正常IoT设备不会突然开始访问 /admin、/login 或 /shell。如果你在流量里看到设备在扫目录、试密码,那基本可以断定——设备被控了。
HTTPS的陷阱
很多人觉得HTTPS加密了就安全了。其实不然。加密只是隐藏了内容,但流量模式依然可见。握手频率、证书特征、TLS版本、加密套件,这些都是线索。
# 正常IoT设备的TLS握手特征
Client Hello:
- TLS 1.2
- 支持的加密套件:3-5个(很少)
- 无SNI扩展(很多设备不带)
# 异常特征
Client Hello:
- TLS 1.3(太新了,老设备不支持)
- 加密套件列表很长(浏览器特征)
- 带SNI且域名可疑
Modbus协议:工业控制的老兵
Modbus,1979年诞生的协议,比我都大。但在工业IoT里,它依然是王者。PLC、RTU、传感器、执行器,到处都有它的身影。
我处理过一个案例:某工厂的Modbus网络突然出现大量写操作,把水泵的寄存器值改成了0,导致整个冷却系统停摆。后来查出来,是一台被勒索软件感染的HMI在搞鬼。
协议结构
| 组成部分 | 长度 | 说明 |
|---|---|---|
| 地址码 | 1字节 | 从站地址(1-247) |
| 功能码 | 1字节 | 操作类型(读/写/诊断等) |
| 数据区 | N字节 | 寄存器地址+数据 |
| 校验码 | 2字节 | CRC16校验 |
关键功能码
- 0x01:读线圈状态(读开关量)
- 0x03:读保持寄存器(读模拟量)
- 0x05:写单个线圈(控制开关)
- 0x06:写单个寄存器(设置参数)
- 0x10:写多个寄存器(批量写入)
重点注意:Modbus原生没有认证和加密。任何能访问网络的人都可以读写寄存器。正常流量中,读操作(0x03、0x04)占绝大多数,写操作(0x05、0x06、0x10)很少出现。如果你看到某个IP在短时间内大量执行写操作,尤其是写关键控制寄存器——立刻断网。
四种协议对比总览
| 维度 | MQTT | CoAP | HTTP/HTTPS | Modbus |
|---|---|---|---|---|
| 传输层 | TCP | UDP | TCP | TCP/RTU |
| 通信模式 | 发布/订阅 | 请求/响应 | 请求/响应 | 主/从 |
| 默认端口 | 1883/8883 | 5683/5684 | 80/443 | 502 |
| 报文开销 | 极低(2字节头) | 低(4字节头) | 高(几百字节) | 极低(4字节头) |
| 安全性 | TLS/ACL | DTLS | TLS | 无(原生) |
| 典型场景 | 传感器数据采集 | 资源受限设备 | 智能家居/摄像头 | 工业控制 |
这张图把四种协议的核心特征和异常检测要点串起来了。你仔细看——每种协议都有自己独特的流量指纹。MQTT的心跳间隔、CoAP的消息类型比例、HTTP的请求路径分布、Modbus的功能码频率,这些都是我们识别异常的利器。
我的建议:刚开始做IoT流量分析时,别急着搞什么AI模型。先把这四种协议的正常基线摸清楚。花一周时间抓正常流量,统计出每个协议的典型特征值。有了基线,异常自然就跳出来了。