从 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 加密、固件签名防降级。 传感器是监控网络的末梢,也是攻击者的入口——把每一扇门都关好,系统才真正可靠。