3. 虚拟联调环境搭建
工业网络虚拟联调的第一步,不是打开仿真软件,而是先把“网络本身”搭出来。真实产线里,PLC、HMI、交换机、路由器、防火墙各占一台设备,网线一插、IP 一配就能通。虚拟环境里没有这些物理设备,必须用软件把同样的网络要素重新构造出来:虚拟机或容器提供“主机”,网络命名空间提供“隔离的网络栈”,虚拟网卡和虚拟交换机提供“链路”,路由与桥接提供“跨网段和对外连通”。本节围绕这五类要素,说明如何搭出一张可复现、可反复重建的工业网络实验床。
一、先明确实验床要复现什么
工业网络实验床通常要复现三类结构:一是现场层,多台 PLC/IO 设备挂在同一二层网段,靠 MAC 和广播通信;二是控制层,HMI、SCADA、工程师站跨网段访问现场设备,需要三层路由;三是边界,控制网与办公网/外网之间由防火墙或网关隔离。虚拟环境要能表达“同网段互通、跨网段路由、边界受控”这三种行为,才算具备联调价值。
因此实验床的拓扑不应是随意堆叠,而应显式划分网段。一个典型的最小工业实验床可设计为:
| 网段 | 用途 | 示例地址 | 典型成员 |
|---|---|---|---|
| 192.168.10.0/24 | 现场层(PLC 网段) | 网关 192.168.10.1 | PLC1、PLC2、远程 IO |
| 192.168.20.0/24 | 控制层(SCADA 网段) | 网关 192.168.20.1 | HMI、SCADA、工程师站 |
| 192.168.30.0/24 | 边界/管理网段 | 网关 192.168.30.1 | 防火墙、跳板机 |
地址规划先定下来,后续所有配置才有依据。示例地址仅作教学假设,实际项目应按现场规划替换。
二、虚拟机与容器:两种“主机”的取舍
虚拟机和容器都能充当网络中的主机,但定位不同。虚拟机拥有独立内核和完整网卡,适合运行 Windows 版组态软件、带授权保护的 PLC 编程工具,网络行为最接近真实工控机;容器共享宿主内核,启动快、资源省,适合批量部署轻量节点,例如用容器模拟多台 Modbus TCP 从站或 OPC UA 服务器。
实践中常采用混合方式:用 2~3 台虚拟机承载 HMI、SCADA 和工程师站,用一组容器承载 PLC 和 IO 从站。这样既保证关键节点的真实性,又降低整体资源占用。无论哪种形式,每台“主机”都必须有明确的网段归属和唯一 IP。
三、网络命名空间与虚拟网卡:把网络栈“切”出来
Linux 网络命名空间(netns)是虚拟网络的核心机制。每个 netns 拥有独立的网卡、路由表、ARP 表和防火墙规则,彼此默认隔离。把容器或进程放入不同 netns,就相当于把它们放进了不同的“网络房间”。
虚拟网卡则负责把房间连起来。最常用的是 veth pair:一对虚拟网卡,一端插在 A 命名空间,另一端插在 B 命名空间,从 A 发出的帧会从 B 出来,等价于一根网线。下面是一段可直接参考的创建过程:
# 创建两个网络命名空间,模拟两台现场设备
ip netns add plc1
ip netns add plc2
# 创建一对 veth,一端给 plc1,一端给 plc2
ip link add veth-plc1 type veth peer name veth-plc2
ip link set veth-plc1 netns plc1
ip link set veth-plc2 netns plc2
# 配置地址并启用
ip netns exec plc1 ip addr add 192.168.10.11/24 dev veth-plc1
ip netns exec plc1 ip link set veth-plc1 up
ip netns exec plc2 ip addr add 192.168.10.12/24 dev veth-plc2
ip netns exec plc2 ip link set veth-plc2 up
# 验证同网段互通
ip netns exec plc1 ping -c 2 192.168.10.12
若 ping 通,说明二层链路和地址配置正确;若不通,应依次检查网卡是否 up、地址是否同网段、命名空间是否配对。这是最基础的连通性判断依据。
四、虚拟交换机与桥接:把多台设备接入同一网段
veth 只能点对点连接。要让多台设备同处一个二层网段,需要虚拟交换机。Linux 网桥(bridge)就是最常用的虚拟交换机,它按 MAC 地址转发帧,行为与物理交换机一致。把每台设备的 veth 一端接入网桥,它们就处于同一广播域。
# 创建虚拟交换机 br-plc,代表现场层交换机
ip link add br-plc type bridge
ip link set br-plc up
ip addr add 192.168.10.1/24 dev br-plc
# 将 plc1、plc2 的 veth 接入网桥
ip link set veth-plc1 master br-plc
ip link set veth-plc2 master br-plc
此时 br-plc 既是交换机,又持有 192.168.10.1 作为该网段网关。若要让实验床访问外网或与宿主机通信,可把宿主物理网卡桥接到网桥,或使用 NAT 方式转发,这就是“桥接”与“路由”的分工:桥接解决同网段二层互通,路由解决跨网段三层转发。
五、路由配置:打通现场层与控制层
当 PLC 网段(192.168.10.0/24)与 SCADA 网段(192.168.20.0/24)需要互访时,必须由具备两个网段地址的路由节点转发。可在宿主机或专用路由容器上启用 IP 转发,并配置静态路由:
# 宿主机开启转发
sysctl -w net.ipv4.ip_forward=1
# 在 SCADA 侧主机上添加去往 PLC 网段的路由
ip route add 192.168.10.0/24 via 192.168.20.1
# 在 PLC 侧主机上添加回程路由
ip route add 192.168.20.0/24 via 192.168.10.1
配置完成后,用 traceroute 或 ping 验证跨网段可达性。若单向通、反向不通,通常是回程路由缺失;若完全不通,应检查转发开关和防火墙规则。工业场景中,跨网段访问往往还需在边界设备上限制端口,例如只允许 502(Modbus TCP)和 4840(OPC UA)通过,这属于后续安全联调内容。
六、可复现:把配置固化为脚本
手工敲命令只能搭一次,实验床的价值在于“可复现”。应把命名空间、veth、网桥、地址、路由全部写入脚本,做到一条命令重建、一条命令清理。脚本中每个对象命名要带语义,例如 ns-plc1、br-plc、veth-plc1-br,便于排障时快速定位。清理时按“先删命名空间、再删网桥、最后删 veth”的顺序执行,避免残留接口占用地址。
七、结果判断与常见问题
实验床是否搭好,可用三个层次判断:同网段内 PLC1 能 ping 通 PLC2,说明二层和地址正确;跨网段SCADA 能 ping 通 PLC1,说明路由和转发正确;应用层用 Modbus 客户端读取 PLC 寄存器成功,说明端口和协议链路可用。若前两层通、应用层不通,应检查防火墙是否拦截了 502 端口,以及 PLC 侧是否真的在监听。
常见问题包括:veth 一端未 up 导致链路不通;网桥未启用 STP 时误接成环;路由节点未开启 ip_forward 导致跨网段丢包;NAT 规则与静态路由冲突导致回程路径异常。排查时按“链路—地址—路由—端口”的顺序逐层验证,比盲目改配置更高效。
把上述要素组合起来,就得到一张可重建、可抓包、可注入故障的工业网络实验床。它既是后续协议联调、安全验证和性能测试的运行底座,也是保证不同人员、不同时间得到一致实验结论的前提。