基于 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 完成
✓ 应用数据加密传输