Skip to content

Edge Network Security

The Consystence edge runs at the boundary between a corporate IT network and an operational technology (OT) network of controllers and field devices. That boundary is the highest-value target on the site: anything that can reach the controller can, in principle, influence physical plant. The edge security model is therefore a SCADA threat model — segment the two networks, default-deny all traffic, and allow-list only the ports the edge needs (and, on the OT side, the exact controller addresses). It is not an OWASP-web threat model; there is no public attack surface here, only a tightly controlled industrial perimeter.

This page describes that model as implemented by the dual-NIC edge firewall, which generates an nftables ruleset for the device. For hardware provisioning see VL3 Edge Setup; for the broader runtime see the Edge overview.

The edge device has two physical network interfaces, and they never bridge:

InterfaceRoleFacesDefault
eth0IT uplinkThe site server (upstream)ItInterface
eth1OT fieldControllers and field devices (downstream)OtInterface

eth0 carries the edge’s connection home to the site server — telemetry, store-and-forward flush, configuration. eth1 carries only industrial protocol traffic to the controller. Keeping them on separate NICs means an attacker who reaches the IT side cannot route packets onto the OT side, and vice versa, because forwarding between the two interfaces is dropped entirely (BlockForwarding defaults to true).

flowchart LR
  SS["Site server<br/>(cloud / on-prem)"]
  subgraph EDGE["Edge device (dual-NIC, nftables)"]
    direction TB
    IT["eth0 — IT uplink<br/>outbound 443 / 53 / 123"]
    OT["eth1 — OT field<br/>44818 to controller only"]
    FW["forward chain:<br/>default-deny (no IT&lt;-&gt;OT routing)"]
  end
  CTRL["PLCnext / controller"]
  FIELD["Field IO"]

  SS <-->|"TLS"| IT
  OT <-->|"EtherNet/IP CIP"| CTRL
  CTRL --> FIELD
  IT -.x.- FW
  OT -.x.- FW

Every chain in the generated ruleset defaults to drop. Nothing is permitted unless a rule explicitly allows it, and that applies to inbound, outbound and forwarded traffic alike — the input, output and forward chains all start from a drop policy.

Default-deny on the output chain is deliberate and stronger than most host firewalls: even outbound connections the edge initiates must match an allow rule. Because IT-side outbound rules are matched primarily by port, pin the IT-side egress destinations wherever the deployment allows it, so the edge can only reach the hosts it needs — DNS, NTP and the site server. The OT side is always destination-pinned to the configured controller(s).

Established and related flows are accepted, invalid packets are dropped, and loopback is allowed in both directions. Everything that falls through is logged and dropped — see OT traffic monitoring.

The reference policy opens exactly these flows. Nothing else reaches or leaves the device.

PortProtocolInterfaceDirectionPurpose
22tcpeth0 (IT)inboundSSH administration
443tcpeth0 (IT)outboundgRPC upstream to the site server (TLS — see transport note below)
53tcp + udpeth0 (IT)outboundDNS
123udpeth0 (IT)outboundNTP (time sync)
44818tcp + udpeth1 (OT)inbound + outboundEtherNet/IP CIP to the controller

A few points worth calling out:

  • The OT side opens only EtherNet/IP CIP (44818). This is the protocol the edge — or, in the primary topology, the co-located PLCnext border gateway — uses to reach the ControlLogix IO rack. A deployment that acquires Modbus TCP devices directly from the edge likewise allow-lists TCP 502 on the OT side, pinned to the configured device addresses. See PLC communication.
  • IT outbound is scoped to the ports the edge needs. The IT side may use only ports 443 (upstream), 53 (DNS) and 123 (NTP); pin those egress destinations wherever the deployment allows, so the edge reaches only the hosts it needs. The OT side is tighter still: it may only reach the configured controller(s) on 44818.
  • SSH (22) is the only inbound IT rule. Administrative access is deliberately the single inbound exception, and it can be removed for fully headless deployments by editing the policy.

Beyond default-deny, the OT side is allow-listed by source and destination address, not just by port:

  • Inbound OT rules pin the allowed source addresses, so the edge accepts EtherNet/IP CIP only from the specific controller(s) configured for the site, not from anything else that appears on the OT segment.
  • Outbound OT rules pin the destination addresses, so the edge can only talk to those controllers.

This address pinning is the enforcement half of OT traffic monitoring: a rogue device plugged into the field network cannot initiate CIP sessions with the edge, and the edge cannot be coerced into scanning hosts it was not provisioned for. The observation half is the passive network monitor described below.

Every packet that falls through the allow rules is logged before it is dropped, with a distinct marker per chain so drops are easy to separate in the kernel log. Under normal operation the forward chain should log nothing, because nothing legitimately routes across the IT/OT boundary — so any forward-chain drops are a strong signal worth investigating. Output-chain drops surface processes attempting egress on unpermitted ports.

Passive monitoring: the OT network monitor

Section titled “Passive monitoring: the OT network monitor”

Enforcement is only half the picture. Alongside the firewall, the edge runs a passive OT network monitor that observes rather than blocks: on each collection interval it reads per-interface counters from /proc/net/dev and lists established connections via ss — connection-level metadata only, no deep packet inspection — and flags three anomaly classes:

AnomalyTrigger
Unexpected sourceAn established connection from an IP not in AllowedOtSources
Traffic spikeCombined rx+tx rate on the monitored interface exceeds TrafficSpikeThreshold (bytes/sec)
Unexpected portAn established connection where neither endpoint port is in ExpectedOtPorts

It is configured under the NetworkMonitor section (values shown are the shipped defaults, with the per-site controller address):

{
"NetworkMonitor": {
"Enabled": true,
"MonitorInterface": "eth1",
"CollectInterfaces": ["eth0", "eth1"],
"IntervalMs": 10000,
"AllowedOtSources": ["192.0.2.10"],
"ExpectedOtPorts": [44818],
"TrafficSpikeThreshold": 10000000
}
}

Both halves are surfaced through the edge’s local diagnostics API — current interface metrics, active connections, detected anomalies and firewall status. That API is a management surface: bind it to a trusted management interface and keep it off the OT side.

The policy is declarative and binds from the edge configuration under the Firewall section. Allow rules are deployment-specific, so define ItRules and OtRules explicitly for the ports, interfaces and controller addresses the site needs, as below. Setting Enabled to false applies no rules at all (use only for bench testing). A site’s controller addresses go in AllowedSources on the OT rules.

{
"Firewall": {
"Enabled": true,
"ItInterface": "eth0",
"OtInterface": "eth1",
"BlockForwarding": true,
"ItRules": {
"InboundAllow": [
{ "Port": 22, "Protocol": "tcp", "Description": "SSH" }
],
"OutboundAllow": [
{ "Port": 443, "Protocol": "tcp", "Description": "gRPC upstream (TLS)" },
{ "Port": 53, "Protocol": "tcp+udp", "Description": "DNS" },
{ "Port": 123, "Protocol": "udp", "Description": "NTP" }
]
},
"OtRules": {
"InboundAllow": [
{
"Port": 44818,
"Protocol": "tcp+udp",
"Description": "EtherNet/IP CIP",
"AllowedSources": ["192.0.2.10"]
}
],
"OutboundAllow": [
{
"Port": 44818,
"Protocol": "tcp+udp",
"Description": "EtherNet/IP CIP",
"AllowedSources": ["192.0.2.10"]
}
]
}
}
}

Each FirewallRule carries a Port, a Protocol (tcp, udp, or tcp+udp), a Description (rendered as the inline nftables comment), and optional AllowedSources. An empty AllowedSources means any source/destination — so for OT rules you should always pin the controller addresses.

Network segmentation is a control-safety boundary, not just a confidentiality one. The edge can issue tag writes that reach physical equipment, so limiting who can talk to the edge — and what the edge can talk to — directly bounds the blast radius of any compromise.