Segmenting a Plant Network Without Dropping the I/O
intermediate · 18 min
A flat factory network works until the day it doesn't — then a broadcast storm, a worm, or a mystery dropout takes the whole site down at once. Here is how to tell those three failures apart on a running line, where the Purdue levels actually get cut, why a controller and its I/O must stay together, and how to migrate an existing flat network cell by cell without stopping production more than once.
ℹ️ Segmentation is usually sold as a security project. Treat it as a troubleshooting project instead. The boundary you draw is the boundary you can search when a line stops — on a flat network every fault has the entire plant as its suspect list. And the one constraint that overrides every tidy drawing is not the org chart: it is layer 2. A controller and its I/O share a broadcast domain or they do not talk.
The Purdue stack drawn as real cabinet hardware — enterprise racks, the IDMZ firewall appliance, HMI panels, a DIN-rail S7-1500 and field instruments — with the overriding rule made visual: PLC and I/O inside one emerald broadcast domain, and a coral X through the router someone tried to put between them.
Tell the causes apart before you touch a switch
A broadcast domain is the set of devices a broadcast frame reaches. A flat network is one broadcast domain for the whole plant. Several very different faults all reach the operator as "the line stopped." Each has its own test, and the order matters — the cheapest test that can clear a hypothesis goes first.
| What you see | Likely cause | Test that proves it |
| Several unrelated cells drop in the same second; switch LEDs flicker in unison | Broadcast/multicast storm, usually a loop from a patch lead in two ports | Switch log first: MAC-address flapping between two ports is the definitive loop signature. Then show spanning-tree detail for topology-change counters and the last-change port. Then two samples of show interfaces counters a minute apart to get a broadcast rate, not a total. If storm-control is configured, show interfaces counters storm-control for discards |
| One device drops, bus-fault LED on, neighbours fine | Local: cable, port, or device | Port error counters (CRC/alignment) on that one port |
| You can ping a PROFINET device but the controller reports connection lost | Check the station name first. A replaced device with no name, or a name written with a temporary DCP Set and lost on power cycle, is by far the most common cause | TIA Portal → Online & Diagnostics → Assign PROFINET device name, or PRONETA. Compare the device's actual NameOfStation against the controller's configuration. This costs thirty seconds — do it before opening a switch session |
| Station name is correct, ping still works, cyclic exchange still dead | Then suspect a layer-2 boundary | Run a DCP scan from the controller's own segment — a scan from the engineering VLAN proves nothing. Ping OK + DCP silent from the controller's segment is consistent with a router or VLAN boundary in the path, but also with DCP multicast being filtered or rate-limited. Confirm by checking the switch port's VLAN membership, not by inference |
| It worked until someone reconfigured a switch | Priority-tag or multicast filtering | Wireshark on a mirror port. Filter eth.type == 0x8892 for PROFINET RT, pn_dcp for DCP, udp.port == 2222 for EtherNet/IP implicit |
On capturing. Set up a mirror port (SPAN) and capture before changing anything — but do not sell this as a free action. Configuring SPAN writes to the running switch configuration, consumes a physical port, and loads the switch CPU. Mirroring a busy port into a slower or already-loaded destination port drops frames at the destination. Confirm the destination port is genuinely spare, and treat SPAN setup as a planned change with a rollback.
Capture with a ring buffer and a filter, or you will lose the capture. A PROFINET segment at a 1–4 ms cycle produces tens of gigabytes a day:
dumpcap -i eth0 -b filesize:100000 -b files:200 -f "ether proto 0x8892 or udp port 2222 or tcp port 44818"
The levels, defined once
Purdue / ISA-95 gives you names, not rules. Level 0 field devices — sensors, valves, motors. Level 1 control — PLCs, safety controllers, drives. Level 2 supervisory — HMIs, line SCADA. Level 3 site operations — MES, plant historian, engineering workstations. Level 3.5 the IDMZ (industrial DMZ), a buffer zone added by practice, not in the original Purdue drawing. Levels 4/5 business IT and enterprise.
IEC 62443-3-2 supplies the vocabulary that survives an audit: you define a System under Consideration (SuC), partition it into zones (groups of assets with common security requirements) and conduits (the permitted communication paths between zones), and establish a target security level (SL-T) for each. Purdue tells you where to draw. 62443 makes you justify each line with a risk assessment. Note the standard also distinguishes SL-T (what you are aiming for) from SL-C (what the equipment can support) and SL-A (what you actually achieved) — an audit will ask for all three.
Why flat fails — three separate problems
Broadcast load. Every ARP, every DCP identify, every discovery beacon reaches every node. A single loop turns that into a storm that saturates links and starves cyclic traffic long before anyone notices a "network" problem.
One infection reaches everything. A laptop plugged in at the packing line has a clear layer-2 path to the reactor PLC. There is nothing to stop lateral movement because there is no boundary to stop it at.
No troubleshooting boundary. With one domain, "which device is flooding" has 800 candidates. With cell/area zones, it has twelve.
The rule that overrides tidy drawings
Keep a controller and its I/O in the same broadcast domain.
For PROFINET RT this is absolute. Cyclic I/O frames are raw Ethernet, EtherType 0x8892 — no IP header, so no router forwards them. DCP, the discovery protocol behind Accessible devices and PRONETA, is layer 2 too and does not cross a router. An RT-over-UDP variant exists (ports 34962/34963), but standard IO devices do not use it. The context manager on UDP 34964 (DCE/RPC) is routable, which is why a device can sometimes be reached for configuration across a subnet while its cyclic data cannot cross one.
For EtherNet/IP the popular claim that implicit traffic is layer 2 is wrong, but the correction that "so it routes fine" is also wrong. Implicit (cyclic I/O) messaging runs over UDP 2222; explicit messaging over TCP 44818. Both are IP. What actually happens:
- Multicast implicit I/O will not cross a router, full stop. Per the ODVA specification, multicast I/O packets are sent with TTL = 1. The first router decrements it to zero and discards the frame. Configuring PIM and IGMP on the router does not help. (Rockwell unicast uses TTL = 64.)
- Within one broadcast domain, multicast still needs every switch in the path to run IGMP snooping with an active querier — snooping without a querier ages out group memberships and silently kills I/O.
- Unicast implicit I/O does route. Unicast has been the default for Logix EtherNet/IP input connections since RSLogix 5000 v18, and v20 extended it to Safety I/O. Multicast persists for produced/consumed tags with multiple consumers, redundant scanners, rack-optimized connections, and older adapters — so check what your specific system is actually doing before assuming either.
- The unicast trade-off is bandwidth and CPU, not latency. Unicast does not add latency or jitter. The producer sends one copy per consumer, so producer CPU load and link bandwidth scale linearly with consumer count. That is the number to check before flipping a connection to unicast, and it is why unicast is not a licence to route I/O across a plant.
Rockwell's CPwE guidance keeps a controller and its I/O in one cell/area zone. Follow it.
Practical rule: the segment boundary goes above the controller, never between the controller and its I/O.
Vendor scope: the 0x8892 behaviour is PROFINET-specific; 2222/44818 are ODVA/CIP-specific. Do not generalise to Modbus TCP (TCP 502) or OPC UA (TCP 4840) — those are plain client/server and route fine.
VLAN or physical separation
A VLAN splits one physical switch into separate broadcast domains using 802.1Q tags. Cheap, reconfigurable, and adequate for cell/area zones. Use physical separation for safety networks, for zones where a shared switch failure is unacceptable, and wherever a compliance regime demands it. A VLAN misconfiguration is one command away from collapsing back into a flat network; a missing cable is not.
Priority-tagging gotcha — verify on your model and release. PROFINET RT frames are commonly priority-tagged: an 802.1Q tag with priority 6 but VLAN ID 0 — priority without VLAN membership. Some switch platforms discard VID 0 frames on an access port whose VLAN is not the port's native VLAN. Ping still works; cyclic I/O does not.
This is not uniform Cisco behaviour, and stating it as such will send you chasing the wrong thing on the wrong hardware:
- Cisco's VLAN 0 Priority Tagging feature is documented on classic-IOS industrial platforms — IE 2000, IE 2000U, IE 4000, IE 5000, CGS 2520 and the Ethernet Switch Module — where it is enabled by default.
- On the IOS XE industrial line (IE3x00 / IE3500) the feature arrived in Cisco IOS XE 17.18.1. Earlier IOS XE releases on those platforms do not have it.
- Other vendors handle VID 0 differently again. Check the release notes for the exact switch in front of you.
Fixes, in order of preference: make the PROFINET VLAN the native VLAN on the port; run a release with VLAN 0 priority-tagging support; or configure the IO controller to send untagged.
Ring redundancy
MRP (Media Redundancy Protocol, IEC 62439-2) is the standard ring protocol for PROFINET. IEC 62439-2 defines worst-case recovery of 500 ms, 200 ms or 30 ms for rings of up to 50 switches, and 10 ms for rings of up to 14 switches. RSTP typically reconverges in one to several seconds — fine for an office, not for a cyclic I/O connection with a 3× watchdog on a 4 ms update rate. Pick one protocol per physical ring and elect a manager.
Where the IT/OT firewall goes
Two boundaries, not one: Level 3 ↔ 3.5 and Level 3.5 ↔ Level 4. The governing rule, stated directly in the Rockwell/Cisco CPwE IDMZ design guides, is that all traffic from either side terminates in the IDMZ; no IACS traffic directly traverses it. Every flow lands on a broker, replica, or proxy inside the zone.
Must pass: historian replication (IDMZ ↔ Level 3), OPC UA terminating on an aggregating server in the IDMZ, a remote-desktop gateway, patch and antivirus mirrors, a file-drop host, and NTP/DNS in one direction. Must never pass end-to-end: SMB, direct RDP, and any controller protocol from Level 4 to Level 2 or below.
Step-by-step
- Capture first. Mirror port plus a ring-buffered, filtered capture across a shift change. Schedule the SPAN setup as a change — it writes to the switch config, consumes a port, and loads the CPU.
- Build the flow list from the capture: source, destination, protocol, port, direction. This becomes your conduit list.
- Draw zones on the real asset list. One cell/area zone = one controller, its I/O, its drives, its local HMI.
- Fix physical loops and duplicate IPs before anything else. Cheaper to fix flat than segmented.
- Stand up the IDMZ hosts — historian replica, OPC UA aggregator, RDP gateway — while the flat network still runs.
- Move one cell. ⚠️ Changing a device's VLAN drops its connection to the controller; outputs go to their configured fault state and the machine stops. Do it in a planned stop, on the least critical cell, with the OEM backup and a known-good switch config to hand.
- On PROFINET, the VLAN membership is the change that matters. Do not hand-edit device IPs: the IO controller assigns the IP by DCP from the station name at connection setup and will overwrite yours. Change the controller's configuration, not the device.
- On EtherNet/IP, re-IPing an adapter also invalidates the module's path in the controller project — update both, and download in the same stop.
- Enable IGMP snooping and a querier together. ⚠️ Snooping without an active querier ages out group memberships and silently kills multicast I/O. ⚠️ If the VLAN already has a querier, adding a second triggers an election — if the winner later stops querying or is removed, memberships age out and you reproduce the exact failure you were preventing. Decide deliberately which device is the querier, give it an in-subnet source IP, and document it. Same planned stop.
- Run the firewall in log-only mode for a full production cycle, then enforce.
- Document each conduit with its business justification and its SL-T. That document is what makes the next change safe.
Never do this
Never put a controller on one VLAN and its remote I/O on another because the drawing looked cleaner. This is the expensive mistake. On PROFINET the RT frames are not routable at all, so the rack never comes up — and because ping works, the team spends two days blaming the device. On EtherNet/IP the failure mode depends on connection type: multicast I/O dies at the first router on TTL and never works; unicast I/O may establish, run for hours, then degrade when the routed path hiccups or the RPI budget is missed. Either way you are chasing a fault across a plant, and it costs weeks.
Never assume "it's IP, so it routes." EtherNet/IP multicast I/O carries TTL = 1 by specification. Multicast routing on the router does not change that.
Never cut over during production. Every VLAN, IP, or subnet-mask change on a controlled device drops its connection.
Never use a NAT box to paper over duplicate machine IPs and skip the zone design. Layer-2 NAT on Stratix switches and the 1783-NATR layer-3 NAT router are legitimate for integrating identical OEM skids, but they are an addressing tool, not a security boundary. NAT does not inspect, authenticate, or log.
Never leave one shared VLAN for "engineering access" that reaches every cell. It quietly rebuilds the flat network you just spent a shutdown removing.
Never build a ring without deciding the protocol. MRP and RSTP in the same physical loop, or a ring with no manager elected, gives you the storm you were trying to prevent.
Never conclude "VLAN boundary" on a PROFINET device before you have read its station name. It is the most common cause of the exact symptom, and the check is free.
Key points
- A broadcast domain is the set of devices a broadcast frame reaches; a flat plant network is one domain for the whole site, so every fault has the entire plant as its suspect list.
- Distinguish the three flat-network failures by test, not guess: simultaneous multi-cell dropout with climbing broadcast counters = storm/loop; single device with a bus-fault LED = local; ping works but the controller reports connection lost = a layer-2 or VLAN boundary in the path.
- PROFINET RT cyclic I/O is raw Ethernet with EtherType 0x8892 and carries no IP header, so no router will ever forward it — the controller and its IO devices must share a broadcast domain.
- EtherNet/IP implicit I/O is UDP 2222 (explicit is TCP 44818), which is IP and therefore routable in principle — but the multicast dependency and added latency mean Rockwell still keeps a controller and its I/O in one cell/area zone.
- The segment boundary belongs above the controller, never between the controller and its I/O.
- PROFINET RT frames are priority-tagged with VLAN ID 0; Cisco industrial switches drop VID 0 frames on an access port that is not the native VLAN — ping succeeds while cyclic I/O silently fails.
- The Level 3.5 IDMZ works only if no session crosses it: every flow from IT or OT terminates on a broker, replica, or proxy inside the DMZ.
- Migrate by capturing traffic first (read-only, safe live), fixing loops and duplicate IPs while still flat, standing up the IDMZ before cutting, then moving one cell per planned stop.
Codes and symptoms
- 0x8892 — PROFINET RT EtherType
- The EtherType on PROFINET real-time cyclic frames, and on DCP. Raw layer-2 Ethernet with no IP header, so it cannot cross a router — controller and IO devices in a cyclic exchange must share a broadcast domain. Filter on it in Wireshark (eth.type == 0x8892) to confirm cyclic exchange is actually present on a link; use pn_dcp to isolate discovery traffic. PROFINET-specific.
- VID 0 — Priority-tagged frame
- PROFINET RT frames commonly carry an 802.1Q tag with priority 6 but VLAN ID 0 — priority without VLAN membership. Some switch platforms discard these on an access port whose VLAN is not the native VLAN, so ping succeeds while cyclic I/O fails. Platform- and release-dependent, not uniform Cisco behaviour: VLAN 0 Priority Tagging is documented and on by default on classic-IOS industrial platforms (IE 2000, IE 2000U, IE 4000, IE 5000, CGS 2520, ESM), and arrived on the IOS XE IE3x00/IE3500 line only in IOS XE 17.18.1. Verify against your exact model and release. Fix by making the PROFINET VLAN native on the port, upgrading to a release with VLAN 0 support, or sending untagged.
- UDP/34962-34964 — PROFINET UDP ports
- 34962 and 34963 carry the rarely-used RT-over-UDP variant; standard IO devices do not use it. 34964 is the PROFINET context manager (DCE/RPC endpoint mapper), used to establish the Application Relation. These are IP-based and routable, which is why a device can sometimes be reached for configuration across a subnet even though its cyclic 0x8892 data cannot cross one.
- UDP/2222 — EtherNet/IP implicit messaging
- Cyclic I/O data between a controller and its modules. Can be unicast or multicast — unicast has been the default for Logix input connections since RSLogix 5000 v18, while multicast persists for produced/consumed tags with multiple consumers, redundant scanners, rack-optimized connections and older adapters. Two distinct failure modes: within a broadcast domain, IGMP snooping without an active querier silently kills multicast I/O; across a router, multicast I/O is discarded outright because the ODVA specification sets TTL = 1 (unicast uses TTL = 64). ODVA/CIP-specific.
- TCP/44818 — EtherNet/IP explicit messaging
- Request/response CIP traffic — configuration, diagnostics, HMI tag reads. Routable, and the port most often permitted through a cell boundary. Never expose it to Level 4.
- TCP/502 — Modbus TCP
- Plain client/server and fully routable. The base protocol carries no authentication, so assume any host that can reach the port can issue writes — some devices and gateways add access control on top, but design as if none exists. Treat reachability itself as the control.
- TCP/4840 — OPC UA binary
- The default port for the OPC UA TCP (opc.tcp) transport. Session-oriented, routable, and the protocol designed to be terminated on an aggregating server in the IDMZ rather than tunnelled straight from IT to Level 2.
- BF — Bus fault LED
- Vendor-specific: present on Siemens S7-300/400 CPUs and many ET 200 interface modules, indicating the fieldbus connection itself is faulted rather than the CPU. S7-1500 CPUs use RUN/STOP, ERROR and MAINT indicators instead — check the manual for your exact hardware before reading anything into an LED.
- Name mismatch — PROFINET station name fault
- The IO controller addresses devices by NameOfStation, not IP, so a device can answer ping and still never enter cyclic exchange. Causes: a replacement device shipped with no name, a name written with a temporary DCP Set (volatile, lost on power cycle), or a project/device mismatch after a change. The controller logs an AR-establishment failure. Check this before suspecting VLANs — it is the most common cause of ping-works-but-I/O-fails and the check takes seconds.