03 / 05 · 2022.08 — 2023.07
Zhejiang Mulian Technology Co., Ltd.
Python backend in industrial-control security: the traffic pipeline, allow-list detection engine and Django REST API of an out-of-band audit system, with Suricata integrated for deny-list detection and deep parsing of 27 industrial protocols.
- Role
- Python Developer
- Industry
- Industrial control security
- Location
- Zhejiang
- Team
- 13 people
- Tenure
- 1 yr
Key results
27
Industrial protocols parsed in depth: Modbus, S7COMM, IEC104, IEC61850, DNP3, OPC UA, PROFINET, BACnet and more
996
Industrial vulnerability signatures loaded into Suricata for deny-list detection
10 s
Flow-aggregation window built on Redis key-expiry events, turning per-packet writes into per-flow writes
Projects here
PROJECTS · 12022.08 – 2023.07 · Python backend developer · Team 13
Industrial-control security audit platform
An out-of-band traffic-audit system for power and manufacturing control networks: probes capture mirrored switch traffic, Kafka feeds a Cython protocol-parsing engine, and three layers of policy — assets, allow-list, deny-list — drive detection and alerting. It parses 27 industrial protocols in depth (Modbus, S7COMM, IEC104, IEC61850 MMS/GOOSE/SV, DNP3, OPC UA/DA/AE, PROFINET, ENIP/CIP, BACnet and more) and has been deployed at power-sector research institutes.
- Worked on the traffic pipeline: capture probe → Kafka → protocol-parsing engine → PostgreSQL; used Redis key-expiry events for 10-second flow aggregation and batch inserts, sharply cutting database writes, and Redis TTLs for device-offline detection
- Implemented the allow-list detection engine keyed on 5-tuple, MAC and protocol function code, with a bitmap that separates "behaviour anomalies" from "content anomalies"; deep rule matching on IEC104 ASDU and OPC interface/function codes, plus automatic allow-list learning over a chosen time window
- Built the Django REST endpoints for asset management, allow/deny-list policies, alerts and reports; Celery Beat jobs for report export, policy backup, expired-data cleanup and probe health checks
- Integrated Suricata, parsed unified2 alerts and loaded nearly a thousand (996) industrial-vulnerability signatures for deny-list detection
- Synced data to a Pilosa bitmap index through Kafka Connect (Debezium CDC) to back traffic statistics and multi-dimensional queries
- (Customised edition) Parsed IEC 61850 SCD files to generate substation IED communication baselines and topology automatically
- Python
- Django / DRF
- Celery
- Kafka
- Redis
- PostgreSQL
- Pilosa
- Suricata
- Cython
- Vue 2
System architecture
System data flow
Abstract sketch · no internal detailsSwitch mirror port
Out-of-band, read-only
Capture probe → Kafka
Scapy · raw_packets kept 300 GB
Protocol-parsing engine
Cython · 27 industrial protocols
Policy detection
Assets · allow-list (bitmap) · Suricata deny-list
▲ My part
PostgreSQL → Pilosa
Flow detail · CDC bitmap index
Django + Vue
Alerts · policies · reports
▲ My part
Team & daily life
Photos are shared with colleagues' consent, or other people's faces are blurred
What I learned here
In industrial security I learned about common attack techniques and privilege escalation, met industrial protocols such as Modbus, S7COMM, IEC104 and OPC for the first time, and got more fluent with Django / DRF and Celery while writing business code.
Protocol parsing is CPU-bound, byte-level work: the parsing library compiles hot paths to C extensions with Cython and keeps a Python interface for upper layers. I also took part in a C++-to-Rust migration in this period. Redis expiry events as aggregation windows and bitmaps to tell anomaly types apart were simple primitives that absorbed the write and detection load of high-frequency control traffic.
TECH STACK
- Python
- Django / DRF
- Celery
- Kafka
- Redis
- PostgreSQL
- Pilosa
- Suricata
- Cython
- Vue 2
- Docker