在工业现场,有些 PLC 只能设置 IP 地址和子网掩码,无法配置默认网关。电脑与 PLC 在同一网段时,通信正常;但换到其他网段,或通过 VPN 远程访问时,却可能连接失败。
如果请求已经能够到达 PLC,问题往往出在回程:PLC 不知道如何向远端网段发送回复。
这种情况下,可以通过SNAT(源地址转换),让 PLC 在不配置网关的情况下,响应远端设备发起的访问。
一、为什么本地能访问,跨网段却不通?
假设网络结构如下:
远端电脑:192.168.20.100/24 │ 路由网络或 VPN │ 现场路由器:192.168.10.1/24 │ PLC:192.168.10.10/24 无法配置默认网关同网段设备通信时,通常可以通过 ARP 查询对方的 MAC 地址,然后直接发送数据,不需要默认网关。
但跨网段通信有所不同。
假设远端电脑发出的请求经过路由器,已经到达 PLC,而且途中没有进行源地址转换。PLC 看到的是:
源 IP:192.168.20.100 目标 IP:192.168.10.10PLC 准备回复时,会根据自己的 IP 地址和子网掩码判断:192.168.20.100不属于本地的192.168.10.0/24网段。
如果没有到远端网络的路由,又无法配置默认网关,PLC 就无法正常发出回复。
于是出现了:
请求能够到达 PLC,回复却无法返回远端电脑。
PLC 通常不会因为请求是某台路由器送来的,就自动把回复交还给它。发送回复时,仍然需要根据目标 IP 地址选择路径。
二、SNAT 如何解决这个问题?
SNAT 的作用,是在转发数据包时修改它的源 IP 地址。
在这个场景中,可以让现场路由器把远端访问 PLC 的请求,统一转换成以路由器的 PLC 侧接口地址为源地址。
转换前:
源 IP:192.168.20.100 目标 IP:192.168.10.10转换后:
源 IP:192.168.10.1 目标 IP:192.168.10.10此时,PLC 看到的访问者变成了192.168.10.1。
这个地址与 PLC 处于同一网段,PLC 可以直接向它回复,不需要默认网关。路由器收到回复后,再根据保存的 NAT 连接映射执行反向转换,将回复转发给远端电脑。
SNAT 的关键,是把 PLC 的回复目标变成一个同网段、可以直接到达的地址。
三、一次完整的通信过程
以远端电脑访问 PLC 为例:
第一步:远端电脑发出请求
192.168.20.100 → 192.168.10.10请求通过路由网络或 VPN,到达现场路由器。
第二步:路由器执行 SNAT
路由器将源地址改为自己的 PLC 侧接口地址:
192.168.10.1 → 192.168.10.10目标地址仍然是 PLC,改变的是请求的来源地址。
第三步:PLC 直接回复路由器
PLC 判断192.168.10.1与自己处于同一网段,因此直接回复:
192.168.10.10 → 192.168.10.1第四步:路由器还原并转发回复
路由器根据连接映射,把回复的目标地址还原成远端电脑的地址:
192.168.10.10 → 192.168.20.100这样,远端电脑与 PLC 就完成了一次双向通信。
四、SNAT 规则应该怎样理解?
不同设备的配置界面和命令不同,但规则的基本逻辑一致:
| 配置项 | 示例 | 含义 |
|---|---|---|
| 原始源地址 | 192.168.20.0/24 | 哪些远端设备的请求需要转换 |
| 目标地址 | 192.168.10.10 | 需要访问的 PLC |
| 出接口 | 连接 PLC 网络的接口 | 请求从哪个接口发往 PLC |
| 转换后源地址 | 192.168.10.1 | PLC 实际看到的访问者地址 |
这条规则可以理解为:
当来自
192.168.20.0/24、发往 PLC192.168.10.10的请求从 PLC 侧接口出去时,将源地址改成192.168.10.1。
实际配置时,还可以根据需要限制协议和端口,让规则只作用于必要的业务流量。