

近期在调试一套工业环境监控系统时,遇到了关于 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 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)。
# 传感器网段: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 没有任何认证机制。连上 502 端口就能读、就能写。这是工业协议的历史包袱。
方案 A:边缘网关做"协议代理 + 认证"(推荐)
云端/SCADA → 边缘网关(认证、鉴权、审计)
│
└── Modbus TCP → 传感器(内网,VLAN 隔离)方案 B:传感器固件层加认证(需厂商支持)
Modbus TCP 连接建立后,第一个请求必须是"认证帧":
Function Code: 0x2B (Device Identification, 或私有功能码)
Data: HMAC-SHA256(timestamp, device_id, shared_secret)
认证通过后,该 TCP 连接后续请求才被处理
超时未认证 → RST方案 C:VPN/隧道
边缘网关和传感器之间建立 IPsec / WireGuard 隧道
传感器只接受隧道内的 Modbus TCP 流量Holding Register 分区:
0x0020–0x002F 设定值/下发 → 需要写保护密码
写流程:
1. 写 0x003F = unlock_key (32-bit)
2. 写目标寄存器
3. 自动重新锁定(或超时锁定)# 错误配置(默认):
community = "public" # 只读
community = "private" # 读写
# 任何能 ping 通的人都能 snmpwalk 走全部数据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传感器固件侧(如果支持):
缓解措施:
1. 改 community 为随机长字符串(32 字符),不用 public/private
2. ACL 限制 SNMP 源 IP(只允许 NMS)
3. 只读 community,禁用 RW community
4. 交换机端口安全:绑定 NMS MAC任何主机都可以伪造源 IP 向网关发送 UDP Trap,网关无法区分真伪。
方案 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)网关侧验证:
方案 B:DTLS(如果 MCU 性能允许)
UDP + DTLS 1.2
握手:证书/PSK 认证
加密:AES-128-GCM
完整性:AEAD方案 C:IP 白名单 + 速率限制(最低限度)
网关侧:
1. 只接受已知传感器 IP 的 UDP Trap
2. 每个 IP 每秒最多 5 个 Trap
3. 超出则丢弃 + 记录日志传感器 → 边缘网关(内网,VLAN 20)
│
边缘网关 → 腾讯云 IoT Explorer(MQTT over TLS 8883)
│
├── 设备认证:X.509 证书 / PSK
├── 数据加密:TLS 1.2+
└── 云端鉴权:CAM 策略传感器不直接上云,通过边缘网关代理。网关负责:
# 腾讯云 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)1. 设备级:每个边缘网关独立证书,不可复用
2. 权限级:设备只能发布/订阅自己的 topic
$thing/up/property/{ProductID}/{DeviceName}
$thing/down/property/{ProductID}/{DeviceName}
3. 规则引擎:数据流转到 InfluxDB 前做鉴权
4. 审计:所有下发指令记录日志,可追溯固件更新流程:
1. 云端签名固件(RSA-2048 / ECDSA)
2. 网关下载固件 + 签名
3. 传感器验证签名 → 写入 Flash
4. 启动前再次验证签名Bootloader 验证 Application 签名
→ 失败则进入恢复模式
→ 拒绝未签名固件生产固件:
- 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 加密、固件签名防降级。 传感器是监控网络的末梢,也是攻击者的入口——把每一扇门都关好,系统才真正可靠。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。