This setup simulates an industrial SCADA-PLC-RIO network with proper isolation using Docker.
SCADA (192.168.1.20) → PLC (192.168.1.10 / 192.168.2.10) ← RIO_SENSOR1 (192.168.2.20)
↓ ← RIO_SENSOR2 (192.168.2.21)
RIO_ACTUATOR (192.168.2.30)
- SCADA Network (192.168.1.0/24): Contains SCADA and PLC
- RIO Network (192.168.2.0/24): Contains PLC and all RIO devices
- SCADA cannot directly access RIO devices
- PLC acts as a gateway between networks
# Make setup script executable
chmod +x setup.sh
# Run the setup
./setup.sh
# View logs
docker-compose logs -f
# Test proxy communication (from host)
python3 test_proxy.py# Create networks
docker network create --driver bridge --subnet=192.168.1.0/24 --gateway=192.168.1.1 scada_net
docker network create --driver bridge --subnet=192.168.2.0/24 --gateway=192.168.2.1 rio_net
# Build and run containers
docker-compose up -d
# Test isolation
docker exec scada ping -c 1 192.168.2.20 # Should fail
docker exec plc ping -c 1 192.168.2.20 # Should succeed- Monitors PLC via Modbus (port 502)
- Sends actuator commands
- Cannot access RIO devices directly
- Dual network interfaces (SCADA and RIO networks)
- Runs Modbus server on port 502
- Runs proxy server on port 8080 for SCADA-RIO communication
- Implements control logic based on sensor values
- Sensor1: Sends values to PLC register 0
- Sensor2: Sends values to PLC register 3
- Actuator: Reads commands from PLC register 1
The PLC proxy (port 8080) accepts JSON requests:
{"command": "status"}{"command": "write", "device": "actuator", "value": 1}docker-compose down