本节摘要:Modbus 没有内建安全,加固的对象因此不是协议而是环境——用网络分区、访问白名单、写保护、行为监控、物理防护五层纵深,把裸协议的风险压到可接受水平。本节给出每层的具体做法与预算有限时的优先级。
一个能收到总线帧的设备,可以伪装主站向变频器下发停机指令;一条接入办公网的 Modbus TCP 链路,任何能路由到它的主机都能读完全部寄存器;一次没有日志的写操作,事后无从追查是谁、何时、改了什么。这三句话描绘的就是未加固 Modbus 网络的日常。说这些不是为了贩卖焦虑——绝大多数此类风险从未被利用,因为工厂物理封闭——而是为了把加固方案的逻辑立起来:**协议不改,环境来防。**让攻击者根本够不到总线、够到了也发不出写指令、发出了也立刻被发现,三道环环相扣,裸协议也能稳住阵脚。
阅读完本节,你应当能够:
第一层,网络分区——最重要的一层,做的是"够不到"。控制网络与办公网络之间必须有边界:物理隔离是上限(两者根本没有物理连接),逻辑隔离是常态(工业隔离网关或防火墙分隔,只放行明确需要的流量)。分区方案落成纸面规则:"办公网到控制网,仅允许运维工作站访问历史网关的指定端口,方向单向,禁止控制网主动发起对外连接"。规则一旦成文,所有例外都要走变更评审——分区的溃败从来不是技术突破,而是一次次"临时接一下"的累积。
第二层,访问白名单——"够到了也进不来"。Modbus TCP 服务端可以配置允许的客户端地址列表;串行总线虽然天然没有 IP 概念,但网关可以按串行侧只允许指定主站 ID 发起事务。原则是最小访问面:能不开放的端口不开,能限地址的不放开,能只读的绝不给写。
第三层,写保护——"进来了也写不了"。在网关层面把点表分成读写区与只读区:工艺必须远程控制的点位进读写区,其余全部只读。许多网关支持"寄存器写过滤",未列入白名单的写请求直接拒绝并记日志。这一层把 1.2 节谈到的"安全差距"用工程手段补掉一半——最危险的写操作被收敛到了明确的小清单里。
第四层,行为监控——"写了也会被发现"。正常流量有稳定的统计特征:主站 ID 固定、轮询周期规律、寄存器访问范围固定。监控引擎基线化这些特征后,异常立刻显形——出现第二个主站 ID、深夜突发大量写请求、访问了从未用过的寄存器区。这类 anomaly 检测不需要高深技术,网关日志加一条规则引擎就能起步,但它把"静默滥用"变成了"即时告警",是纵深里性价比最高的一层。
第五层,物理与运维防护——最朴素也最容易被忽略:控制柜上锁、串口与网口贴封条、调试口默认关闭、人员离场收回调试账号。多数真实入侵的起点不是黑客,是"上次调试完没拔的笔记本电脑"。

把第二层与第三层落成配置,看一个网关侧与网络侧配合的实例。网关作为 Modbus TCP 服务端只对两个地址开放,且禁止写功能码直达串行侧的只读区;防火墙只放行运维段到该端口:
防火墙策略(文字版规则,实际设备按语法转换) 规则一 允许 源=运维工作站段 目的=网关 端口=502 协议=TCP 方向=入 规则二 拒绝 其余一切到网关502的流量 并记录日志 规则三 禁止 控制网段发起的任何对外连接 方向=出 全部协议 网关侧 Modbus 访问控制(文字版) 客户端白名单:仅运维工作站 与 SCADA服务器 两个地址 功能码过滤:05 06 15 16 写类功能码 仅接受目标在读写区白名单内的请求 只读区范围:除控制字与设定值两组寄存器外 全部只读 日志级别:全部被拒请求记录 源地址 功能码 目标地址 时间戳
两份配置合起来构成的语义是:全网络里只有两台机器能碰这个网关,碰的时候能写的只有两组寄存器,写了什么、谁写的、何时写的,全有记录。攻击面从"任意主机任意寄存器"收缩到"两台已知主机两组寄存器",这已经把风险压低了几个数量级。
不必上重型平台,三步起步。第一步,取两周的正常流量日志,统计出每条总线的主站清单、轮询周期分布、寄存器访问范围清单,作为基线。第二步,定三条告警规则:出现基线外主站地址、非轮询时段的写请求、访问范围外的寄存器。第三步,给告警定响应路径——谁在值守、五分钟内做什么、误报怎么反馈调整基线。监控的有效性在响应而不在算法:一条每周看一次的告警等于没有告警。
⚠️ 常见坑:把加固做成一次性项目。网络在变、设备在加、人员在流动,分区规则三个月不review就会被某个临时需求凿穿。加固措施的半衰期以月计,5.4 的清单之所以强调"定期复检",就是这个原因。
用一次真实改造把五层落地次序演一遍。某仓储企业二十座库房的采集网段原与办公网同交换机,预算有限只能分两期。第一期的决策依据就是优先级:网络分区(部署一对工业隔离网关,办公到控制单向放行两个地址)加白名单(网关与各采集服务器配置客户端限制),一期完工后用端口扫描与渗透演练验证——从办公网发起的全量探测只命中两个预期端口,越权访问全部被拒。第二期上写保护与监控:点表读写分区把可写点位从上千个收敛到六十多个控制必需点,行为监控上线后第一个月就抓到三起"备用工具软件直连网关"事件——都是运维人员图方便,不是攻击,但每一起都是未来真攻击的通道。
这个决策过程里的关键取舍值得记住:一期只做了"够不到、进不来"两层,就消化了绝大多数远程风险;写保护与监控放在二期,是因为它们依赖点表梳理这类慢工。加固不是一次到位的工程,是按风险大小排序的流水线——排对了序,每一分钱都花在刀刃上。
加固做完不等于加固生效,验收要拿出"防线在岗"的证据,最低配三样。一份配置快照:白名单规则、过滤策略、端口开关状态的导出存档,作为基线。一次越权演练:从非授权地址发起连接,确认被拒且告警有记录——监控回路从发现到告警全程走通才算数。一份差异说明:清单里没做的条目逐条写明原因与残余风险,评审签字。三样齐了,加固才从"做过"变成"可证明"。
此后每次变更做快照对比,防线漂移当场现形。演练频次随风险定:高危区每季度一次,一般区域随年度巡检;演练先在仿真环境走一遍,别拿生产网练手——验证防线的过程本身不能成为新的风险源。这套做法与 5.4 的清单、6.2 的部署四步共用同一套存证逻辑——安全是持续被验证的状态,不是一次性完成的动作。
Modbus 的防线靠环境补,下一节看天生自带铠甲的 OPC UA 怎么把好钢用在刀刃上。