从 RJ45 到云端:以太网温湿度变送器通过 TCP/IP 上云,同时暴露 SNMP 与 UDP 服务的安全策略
从 RJ45 到云端:以太网温湿度变送器通过 TCP/IP 上云,同时暴露 SNMP 与 UDP 服务的安全策略
近期在调试一套工业环境监控系统时,遇到了关于 Modbus 连接保持的问题。现场部署了一批 恒湿净化设备(包括 @恒湿消毒净化一体机 等),主要用来维持特定环境的温湿度指标。在长时间运行后,发现设备偶尔会掉线。把 Modbus TCP、SNMP、UDP 三协议跑通之后,新的问题浮出水面:传感器直接暴露 SNMP 和 UDP 服务,等于在监控网络里开了三扇门。如果只管连通不管安全,弱电井里随便接一台笔记本就能读走所有数据、甚至写寄存器改设定值。这篇把"从 RJ45 到云端"这条链路上,三协议并存时的安全策略拆开讲清楚。
一、威胁模型:三扇门各自的风险面
先明确攻击面,再谈防护。
以太网温湿度变送器
├── TCP 502 Modbus TCP → 可读全量寄存器,可写下发设定值
├── UDP 161 SNMP Agent → 可读系统信息、配置,可写(如果 RW community)
└── UDP 9000 私有 Trap → 可被伪造源 IP 发送虚假越限事件
三类风险:
|
协议 |
暴露面 |
典型威胁 |
后果 |
|---|---|---|---|
|
Modbus TCP |
502 端口 |
未授权读写、寄存器篡改 |
改设定值导致环境失控、固件被写坏 |
|
SNMP |
161 端口 |
默认 community(public/private)、GETBULK 遍历 |
信息泄露、配置被改、设备被劫持 |
|
UDP 私有 Trap |
9000 端口 |
伪造 Trap、UDP 泛洪 |
虚假告警、pbuf 池耗尽、网关误联动 |
关键认知:传感器在弱电井/吊顶里,物理安全约等于零。任何能接入监控 VLAN 的设备都是潜在威胁源。安全策略不能假设"内网可信",必须按零信任思路设计。
二、网络层隔离:VLAN + ACL 是第一道防线
2.1 VLAN 划分
监控网络拓扑:
管理 VLAN 10(交换机管理、NMS)
│
监控 VLAN 20(传感器、网关、SCADA)
│
控制 VLAN 30(恒湿机、新风机、风阀 DO)
│
上云 VLAN 40(边缘网关 → 腾讯云 IoT Explorer)
原则:传感器只待在监控 VLAN 20,不跨 VLAN 通信。SNMP 查询只来自 NMS(VLAN 10),通过三层交换机 ACL 放行。Modbus TCP 只来自边缘网关(VLAN 20/40)。
2.2 交换机 ACL 规则
# 传感器网段:10.10.20.0/24
# 边缘网关:10.10.20.1
# NMS:10.10.10.5
# 规则 1:传感器 → 只允许响应 Modbus TCP,不主动发起连接
deny tcp any 10.10.20.0/24 established # 阻断传感器主动建连
# 规则 2:Modbus TCP 只允许边缘网关访问
permit tcp host 10.10.20.1 10.10.20.0/24 eq 502
deny tcp any 10.10.20.0/24 eq 502
# 规则 3:SNMP 只允许 NMS
permit udp host 10.10.10.5 10.10.20.0/24 eq 161
deny udp any 10.10.20.0/24 eq 161
# 规则 4:私有 UDP Trap 只允许传感器 → 网关
permit udp 10.10.20.0/24 host 10.10.20.1 eq 9000
deny udp any any eq 9000
# 规则 5:传感器禁止访问互联网(上云走网关代理)
deny ip 10.10.20.0/24 any
关键点:传感器本身不直接连互联网。上云路径是"传感器 → 边缘网关 → MQTT over TLS → 腾讯云 IoT Explorer"。传感器只和网关通信,不暴露公网 IP。
三、Modbus TCP 安全:从"裸奔"到认证
3.1 现状问题
标准 Modbus TCP 没有任何认证机制。连上 502 端口就能读、就能写。这是工业协议的历史包袱。
3.2 加固方案
方案 A:边缘网关做"协议代理 + 认证"(推荐)
云端/SCADA → 边缘网关(认证、鉴权、审计)
│
└── Modbus TCP → 传感器(内网,VLAN 隔离)
- 云端下发指令到边缘网关,网关验证来源、签名、权限
- 网关到传感器走内网,VLAN 隔离 + MAC 绑定
- 传感器侧不需要改固件
方案 B:传感器固件层加认证(需厂商支持)
Modbus TCP 连接建立后,第一个请求必须是"认证帧":
Function Code: 0x2B (Device Identification, 或私有功能码)
Data: HMAC-SHA256(timestamp, device_id, shared_secret)
认证通过后,该 TCP 连接后续请求才被处理
超时未认证 → RST
方案 C:VPN/隧道
边缘网关和传感器之间建立 IPsec / WireGuard 隧道
传感器只接受隧道内的 Modbus TCP 流量
3.3 寄存器写保护
Holding Register 分区:
0x0020–0x002F 设定值/下发 → 需要写保护密码
写流程:
1. 写 0x003F = unlock_key (32-bit)
2. 写目标寄存器
3. 自动重新锁定(或超时锁定)
四、SNMP 安全:从 v1/v2c 到 v3
4.1 禁用 v1/v2c
# 错误配置(默认):
community = "public" # 只读
community = "private" # 读写
# 任何能 ping 通的人都能 snmpwalk 走全部数据
4.2 启用 SNMPv3
SNMPv3 安全模型:
- USM (User-based Security Model)
- 认证:MD5/SHA
- 加密:DES/AES
- 用户:独立凭证,可撤销
配置示例(Net-SNMP 风格):
createUser sensor_monitor SHA "auth_password" AES "priv_password"
rwuser sensor_monitor priv
传感器固件侧(如果支持):
- 禁用 v1/v2c
- 只开 v3,配置只读用户
- 写操作用独立用户 + 更高权限
4.3 如果固件只支持 v2c
缓解措施:
1. 改 community 为随机长字符串(32 字符),不用 public/private
2. ACL 限制 SNMP 源 IP(只允许 NMS)
3. 只读 community,禁用 RW community
4. 交换机端口安全:绑定 NMS MAC
五、UDP 私有 Trap 安全
5.1 问题:UDP 无连接、无认证
任何主机都可以伪造源 IP 向网关发送 UDP Trap,网关无法区分真伪。
5.2 加固方案
方案 A:共享密钥 + HMAC
UDP Trap 帧结构(扩展):
Header (8 bytes):
Magic: 0xAA55
Version: 0x02 ← 升级版本
Sensor ID: 0x00010023
Payload Len: 0x0020 ← 扩展
Payload (32 bytes):
Timestamp: 0x5f3a_2c1b
Temperature: 0x00e2
Humidity: 0x0216
Dew Point: 0x00c3
Alert Flags: 0x0001
Nonce: 0x12345678 ← 防重放
HMAC: 16 bytes ← HMAC-SHA256(key, payload + nonce)
网关侧验证:
- 检查 Sensor ID 是否在白名单
- 检查 Timestamp 与本地时间偏差 < 5s(防重放)
- 用预共享密钥计算 HMAC,比对
- 验证通过才处理 Trap,否则丢弃
方案 B:DTLS(如果 MCU 性能允许)
UDP + DTLS 1.2
握手:证书/PSK 认证
加密:AES-128-GCM
完整性:AEAD
方案 C:IP 白名单 + 速率限制(最低限度)
网关侧:
1. 只接受已知传感器 IP 的 UDP Trap
2. 每个 IP 每秒最多 5 个 Trap
3. 超出则丢弃 + 记录日志
六、上云安全:MQTT over TLS + 设备认证
6.1 连接路径
传感器 → 边缘网关(内网,VLAN 20)
│
边缘网关 → 腾讯云 IoT Explorer(MQTT over TLS 8883)
│
├── 设备认证:X.509 证书 / PSK
├── 数据加密:TLS 1.2+
└── 云端鉴权:CAM 策略
传感器不直接上云,通过边缘网关代理。网关负责:
- 采集传感器数据(Modbus TCP)
- 接收传感器 Trap(UDP)
- 汇聚后通过 MQTT 上报云端
- 云端下发指令 → 网关 → 传感器
6.2 边缘网关安全配置
# 腾讯云 IoT Explorer 连接
client = mqtt.Client(client_id=device_id)
client.tls_set(
ca_certs="root_ca.pem",
certfile="device_cert.pem",
keyfile="device_key.pem",
tls_version=ssl.PROTOCOL_TLSv1_2
)
client.connect(endpoint, port=8883)
6.3 云端安全策略
1. 设备级:每个边缘网关独立证书,不可复用
2. 权限级:设备只能发布/订阅自己的 topic
$thing/up/property/{ProductID}/{DeviceName}
$thing/down/property/{ProductID}/{DeviceName}
3. 规则引擎:数据流转到 InfluxDB 前做鉴权
4. 审计:所有下发指令记录日志,可追溯
七、固件安全:传感器侧的最后一道防线
7.1 固件签名
固件更新流程:
1. 云端签名固件(RSA-2048 / ECDSA)
2. 网关下载固件 + 签名
3. 传感器验证签名 → 写入 Flash
4. 启动前再次验证签名
7.2 安全启动
Bootloader 验证 Application 签名
→ 失败则进入恢复模式
→ 拒绝未签名固件
7.3 调试接口关闭
生产固件:
- JTAG/SWD 关闭
- 串口调试关闭(或加密)
- 默认密码修改
八、安全配置检查表
|
项目 |
检查内容 |
通过标准 |
|---|---|---|
|
VLAN 隔离 |
传感器是否只在监控 VLAN |
是,不跨 VLAN |
|
ACL |
502/161/9000 是否限制源 IP |
是,只允许授权设备 |
|
Modbus |
是否有写保护机制 |
是,unlock + write + lock |
|
SNMP |
是否禁用 v1/v2c |
是,只开 v3 或改 community |
|
SNMP |
是否有 RW 权限 |
否,只读 |
|
UDP Trap |
是否有认证/HMAC |
是,或 IP 白名单 + 限速 |
|
上云 |
是否 MQTT over TLS |
是,8883 端口 |
|
上云 |
设备证书是否独立 |
是,一机一证 |
|
固件 |
是否签名验证 |
是,拒绝未签名固件 |
|
调试 |
JTAG/SWD 是否关闭 |
是 |
九、一句话总结
从 RJ45 到云端,安全不是"加个防火墙"就完事,而是逐层递进:VLAN 隔离限制暴露面、ACL 控制端口访问、Modbus 加认证防篡改、SNMP 升 v3 防泄露、UDP Trap 加 HMAC 防伪造、上云走 TLS 加密、固件签名防降级。 传感器是监控网络的末梢,也是攻击者的入口——把每一扇门都关好,系统才真正可靠。

浙公网安备 33010602011771号