工业通信

Modbus TCP & TLS 安全配置教程

Modbus TCP 基础、跨网段通信、TLS 证书、S615 Source NAT 和分层调试方法。

基于 06_Modbus.md 中 3 条对话内容整理 对话涵盖:TLS 加密 Modbus TCP 问题分析、Modbus 跨网段通信、Modbus TCP 加密解析、S615 Source NAT


一、Modbus TCP 基础#

1. Modbus TCP 通信#

参数 说明
传输层 TCP
默认端口 502
角色 客户端(Client)/ 服务器(Server)
西门子指令 MB_CLIENT / MB_SERVER

2. MB_CLIENT 关键参数#

参数 说明
REQ 触发上升沿(建议用 TP 定时脉冲,不要持续为 TRUE)
ActiveEstablished TRUE = 客户端主动建立连接
LocalPort 本地端口(可留空自动分配)
RemotePort 远程端口(502 或 802)
RemoteAddress 目标 PLC IP 地址
ConnectionType 16#0B(TCP 连接)

3. MB_SERVER 关键参数#

参数 说明
ActiveEstablished FALSE = 服务器被动监听
RemoteAddress 留空(允许任意客户端连接)
ConnectionType 16#0B

二、Modbus TCP 故障排查#

排查顺序#

1. ping 是否通?
2. TCP 502 端口是否能连?
3. Wireshark 抓包看三次握手有没有完成?
4. 有没有 Modbus 请求报文?
5. 功能码是否正确?
6. Unit ID 是否正确?
7. 寄存器地址是否偏移(0 或 1 位偏移)?
8. 返回异常码是什么?

常见问题#

问题 原因 解决
MB_SERVER 状态码 16#80B7 连接尚未建立 确认对端已触发连接
寄存器地址错误 地址偏移 0/1 确认软件与抓包的实际地址
跨网段不通 路由/防火墙未放行 配置网关和规则

三、Modbus TCP 跨网段通信#

能否跨网段#

类型 支持跨网段 说明
Modbus TCP 基于 IP 路由,需路由可达、TCP 502 开放
Modbus RTU 本身不行,需经串口服务器转 TCP

同网段 vs 跨网段区别#

同网段:直接 ARP 找 MAC 地址
跨网段:
  - 必须配置 PLC 的默认网关
  - 中间路由/NAT/防火墙必须放行 TCP 502
  - 注意防火墙规则使用原始地址(非 NAT 后地址)

四、Modbus TCP over TLS(安全通信)#

1. TLS 工作流程#

普通 Modbus TCP:
  TCP 三次握手 → 明文 Modbus 报文

Modbus TCP over TLS:
  TCP 三次握手 → TLS 握手(ClientHello/Certificate/ChangeCipherSpec)→ 加密 Modbus 数据

2. TLS 通信无法建立 — 排查要点#

抓包特征:
  TCP 三次握手成功 → 但客户端直接发 Modbus Function 03(明文)→ 服务端 RST

根因:
  客户端没有真正启用 TLS 模式,仍按普通 Modbus TCP 发包

排查顺序

1. 确认客户端是否使用了 Modbus TLS 通信块
2. 确认是否仍然调用了普通 MB_CLIENT
3. 确认远程端口:TLS 常用 802(非 502)
4. TLS 连接参数是否绑定了证书?
5. 普通 Modbus 和 TLS Modbus 是否混用同一连接 DB/ID?
6. 服务端是否在对应端口监听 TLS?

3. Modbus TLS 配置流程#

Step 1:NTP 时间校准

配置 PLC 的 NTP 客户端,确保证书有效期判断正确
UDP 123 端口

Step 2:创建证书

在 TIA Portal 中创建 CA 证书和 PLC 设备证书
导出客户端证书
安装到 PLC 证书存储中

Step 3:修改通信块

将 MB_CLIENT/MB_SERVER 改为 TLS 版本
将 TCON_IP_v4 改为 TCON_IP_V4_SEC
端口从 502 改为 802
绑定证书连接参数

4. 验证方法#

正确:TCP 三次握手 → TLS Client Hello → ... → 加密应用数据
错误:TCP 三次握手 → Modbus/TCP Query: Read Holding Registers → RST

五、S615 Source NAT 配置#

1. Source NAT 的作用#

当 PLC-A 访问 PLC-B 时:
  不开 SNAT:PLC-B 看到源 IP 为 PLC-A 的真实地址
  开 SNAT:PLC-B 看到源 IP 为 S615 在自身网段的接口 IP
    
用途:解决"回包找不到路"的问题
    目标设备不能改网关
    不希望目标设备看到真实网段

2. SNAT 配置规则#

SNAT 选项 填写 含义
Source Interface vlan10(发起方网段) 数据从哪边进 S615
Destination Interface vlan20(目标网段) 数据从哪边出 S615
Source IP Address(es) 192.168.10.11/32 原始发送方
Translated Source IP Address 192.168.20.1 S615 在目标网段的地址
Destination IP Address(es) 192.168.20.11/32 被访问的目标

3. 防火墙规则注意事项#

Source NAT → 在防火墙之后做
防火墙规则里写 **原始(物理)地址**,不是 NAT 后的地址

✅ 正确:Source=192.168.10.11, Destination=192.168.20.11
❌ 错误:Source=192.168.20.1, Destination=192.168.20.11

4. SNAT 与防火墙配合#

组件 使用地址
防火墙规则 写 NAT 前的原始地址
Source NAT 规则 写原始地址和转换后地址

5. 常见误区#

❌ 用 0.0.0.0/0 范围太大 → 应尽量精确到单个 IP/32
❌ 双边都配 SNAT → 只需在主动发起方向配一条
❌ 以为 SNAT 可以替代 TLS → SNAT 只改 IP,不改报文内容
❌ 防火墙规则写 NAT 后地址 → 防火墙规则应在 NAT 之前判断

六、综合调试建议#

分层调试法#

第一层:路由/NAT/防火墙
  检查网络连通性,确认两端可路由到达

第二层:Modbus TLS 协议
  确认客户端/服务端都真正启用了 TLS 模式
  抓包验证:三次握手后第一条应用层报文应为 TLS ClientHello

第三层:应用数据
  确认功能码、寄存器地址、数据格式正确

抓包验证清单#

✓ TCP 三次握手完成
✓ 客户端发送 TLS ClientHello(不是明文 Modbus)
✓ 服务端回复 ServerHello + Certificate
✓ Change Cipher Spec 完成
✓ 应用数据加密传输