This repository contains a vertical slice of a high‑performance Intrusion Detection and Prevention System (IDPS) designed for the edge. It unifies kernel‑fast enforcement via XDP with user‑space detection and policy, and supports AF_XDP capture on Linux for low‑latency ingestion. It also includes a Windows‑friendly harness for validation without a Linux NIC.
- Install and enable the agent:
git clone <your repo> IDPS
cd IDPS/edge/deploy
bash install_linux.sh
sudo nano /etc/default/edge-agent # set NIC, PCAP, TOKEN, paths
sudo systemctl start edge-agent
sudo systemctl status edge-agent- Optional: ONNX CPU inference on the node:
sudo nano /etc/default/edge-agent
# set:
# ONNXRUNTIME_SHARED_LIBRARY_PATH=/usr/lib/libonnxruntime.so
# MODEL_PATH=/opt/models/model.onnx
# CLASS_LABELS=Benign,DDOS attack-HOIC
sudo systemctl restart edge-agentgit clone <your repo> IDPS
cd IDPS/edge/deploy
bash install_rpi.sh
sudo systemctl start edge-agentRun the Python pipeline harness to drive end‑to‑end decisions and call the agent remotely (e.g., over Tailscale):
python edge/tools/pipeline_harness.py --ids http://127.0.0.1:5000/predict --agent http://<agent-ip>:8080 --token <TOKEN> --duration 30- Build a portable tarball:
bash edge/deploy/package_node.sh
# output: dist/edge-agent-node.tar.gz- Install on a target node:
scp dist/edge-agent-node.tar.gz <user>@<node>:/tmp/
ssh <user>@<node> 'mkdir -p ~/edge && tar -xzf /tmp/edge-agent-node.tar.gz -C ~/edge && bash ~/edge/edge-agent/install.sh'
ssh <user>@<node> 'sudo nano /etc/default/edge-agent && sudo systemctl start edge-agent'- Build the agent image:
cd edge/agent
docker build -t edge-agent:latest .- Deploy across a cluster as a privileged DaemonSet:
kubectl create ns edge-security
kubectl apply -f edge/deploy/k8s-daemonset.yaml -n edge-securityNotes:
- Uses hostNetwork and privileged container to allow XDP attach.
- Mounts /var/lib/idps on host for blocklist snapshot persistence.
The system separates the fast path (kernel enforcement and packet capture) from user‑space detection and policy. High‑confidence detections update a TTL blocklist stored in the kernel’s eBPF maps for O(1) drop decisions.
+----------------------+ +---------------------+
Ingress NIC --->| XDP Program |--drop---->| Kernel Drop (XDP) |
| (xdp_blocklist.c) | +---------------------+
| - Check blocklist |
| - Redirect to |
| AF_XDP (if XSK) |
+----------+-----------+
|
| redirect (XSKMAP)
v
+----------------------+
| AF_XDP Socket(s) | (Linux) +-------------------+
+----------+-----------+------------------>| PacketTap |
| | - Flow events |
| | - 5‑tuples |
v +----+--------------+
+----------------------+ |
| Flow Table |<-----------------------+
| - IATs, sizes | events
+----------+-----------+
|
v
+----------------------+ +-----------------------------+
| Feature Builder |---->| Model Inference |
| (CICFlowMeter‑like) | | - ONNX runtime (edge) |
+----------+-----------+ | - or Python microservice |
| +--------------+--------------+
v |
+----------------------+ |
| Policy / Decision |<------------------+
| - Thresholds, TTL |
| - Evidence gating |
+----------+-----------+
|
v
+----------------------+
| Blocklist Update |
| - eBPF maps via |
| XdpLoader |
| - Snapshot JSON |
+----------------------+
- Capture: Packets are captured via AF_XDP (Linux) or pcap/live fallback; flow events are formed with timestamps, lengths, direction, and header sizes.
- Features: CICFlowMeter‑style aggregations compute IAT stats, per‑direction sizes and counts, header metrics, and active/idle windows.
- Inference: Local ONNX runtime (if configured) or a Python microservice evaluates features and returns class + confidence.
- Policy: High‑precision classes with sufficient evidence cause the source IP to be added to the blocklist with a TTL.
- Enforcement: XDP drops packets for any blocked source in O(1); otherwise redirects to AF_XDP or passes to the stack.
- Persistence: Blocklist entries with TTLs are saved to a JSON snapshot and restored on agent startup.
edge/
├── bpf/
│ └── xdp_blocklist.c # Kernel XDP program: drop/redirect/pass with XSKMAP/qidconf_map
├── agent/
│ ├── cmd/
│ │ └── edge-agent/
│ │ └── main.go # Entry: capture → features → inference → policy → blocklist updates; HTTP APIs
│ ├── core/
│ │ ├── xdp_loader.go # Attach program, manage eBPF maps, AF_XDP registration, TTL snapshot
│ │ ├── packet_tap.go # AF_XDP / pcap / live capture and emission of FlowEvent
│ │ ├── flow.go # Flow table, state aggregation, TTL eviction
│ │ ├── features.go # Feature vector builder (CICFlowMeter‑like)
│ │ ├── model_infer.go # ONNX edge inference with microservice fallback
│ │ ├── *_test.go # Unit tests for features, eviction, inference fallback
│ │ └── (others as added)
│ └── go.mod # Go module (includes onnxruntime_go)
├── ids_service/
│ ├── server.py # Flask microservice for /predict (optional fallback)
│ └── test_server.py # Unit tests for microservice behavior
├── tools/
│ ├── pipeline_harness.py # Windows‑friendly harness to drive predictions and /block
│ └── attacks/
│ └── attack_runner.py # Simple HOIC/UDP flood generators for validation
└── deploy/
├── install_linux.sh # Linux install: build XDP object, build agent, systemd setup
├── edge-agent.service # Systemd unit (memlock, restart)
├── edge-agent.env # Linux env defaults
├── install_rpi.sh # Raspberry Pi install (generic XDP + live capture)
├── edge-agent-rpi.env # Pi env defaults (live:eth0)
├── package_node.sh # Build portable tarball with agent + XDP + installer
└── k8s-daemonset.yaml # Kubernetes DaemonSet manifest (privileged, hostNetwork)
edge/agent/
├── Dockerfile # Container build for edge-agent + XDP object
documentation/
├── current-architecture.md # Brief architecture notes
├── next-steps.md # Planned work items
└── what-we-are-doing.md # Goals and scope
- XDP Program: xdp_blocklist.c
- Agent Entrypoint: main.go
- XDP Loader + Maps + Snapshot: xdp_loader.go
- Capture (AF_XDP/pcap/live): packet_tap.go
- Flow State + Eviction: flow.go
- Features: features.go
- ONNX / Fallback Inference: model_infer.go
- Harness: pipeline_harness.py
- Microservice: server.py
- /block?ip=IP&ttl=SECONDS — Adds IP to blocklist; requires Authorization: Bearer if TOKEN is set.
- /unblock?ip=IP — Removes IP from blocklist; requires token if set.
- /stats — Returns drops, passes, and map size; requires token if set.
- /metrics — Basic metrics; requires token if set.
- NIC: Interface name (e.g.,
ens18,eth0). - PCAP: One of:
afxdp:<nic>— AF_XDP capture (Linux, driver support required).live:<nic>— Live capture fallback.<path>.pcap— PCAP replay mode.
- BLOCKLIST_SNAPSHOT: Path to JSON snapshot (e.g.,
/var/lib/idps/blocklist.json). - XDP_OBJ: Path to compiled XDP object (e.g.,
/usr/local/lib/idps/xdp_blocklist.o). - TOKEN: Bearer token to protect control endpoints.
- ONNXRUNTIME_SHARED_LIBRARY_PATH (optional), MODEL_PATH (optional), CLASS_LABELS (optional).
- FLOW_TTL: Seconds to retain inactive flows in the table (default 120).
- Unified kernel enforcement and AF_XDP redirect:
- XSKMAP and qidconf_map integrated in XDP program.
- AF_XDP socket registration via loader; single attach point for drop/redirect/pass.
- Blocklist persistence:
- JSON snapshot of IPv4/IPv6 with TTLs; restored at agent startup.
- Automatic saves on /block, /unblock, and policy‑driven decisions.
- ONNX edge inference with remote fallback:
- Uses
yalue/onnxruntime_goon Linux/Windows when configured. - Falls back to Python microservice
/predictwhen unavailable.
- Uses
- Flow table eviction:
- TTL‑based eviction loop to prevent unbounded memory usage.
- Tests and harness:
- Go unit tests for features, eviction, and inference fallback.
- Python tests for the microservice.
- Pipeline harness to drive decisions from Windows/Linux.
- Deployment scripts:
- Linux and Raspberry Pi installers and systemd unit.
- Multi‑queue AF_XDP:
- Enumerate RX queues, register XSK per queue, and enable qidconf_map across queues.
- QinQ VLAN support:
- Extend XDP parser to handle stacked VLAN tags robustly.
- Observability:
- Prometheus metrics for latencies, decision‑to‑enforcement timing, AF_XDP ring stats.
- Structured, rotated detection logs with IP/class/confidence/TTL.
- Endpoint Hardening:
- Add rate limiting, optional mTLS or IP allowlist on /block and /unblock.
- Feature Parity:
- Complete CICFlowMeter metrics: TCP flag distributions, subflows, payload‑aware metrics.
- Control Plane:
- Minimal orchestrator service: subscribe to events, apply global rules, call /block on nodes.
- Optional Redis/Kafka integration for rule fan‑out beyond a single node.
- Packaging:
- Systemd hardening with capability bounding set and non‑root service user by default.
- Debian package for agent + bpf object.
- Local tests:
- Go:
go test ./edge/agent/core/... - Python (IDS):
python edge/ids_service/test_server.py
- Go:
- End‑to‑end:
- Start the agent, run
pipeline_harness.pyto drive predictions and verify/statsand snapshot persistence.
- Start the agent, run
- HOIC‑style HTTP flood:
python3 edge/tools/attacks/attack_runner.py --mode hoic --host <agent-ip> --port 8080 --threads 100 --duration 60
- UDP flood:
python3 edge/tools/attacks/attack_runner.py --mode udp --host <agent-ip> --port 53 --threads 200 --duration 60
- Slowloris (Metasploit):
msfconsole -q -x "use auxiliary/dos/http/slowloris; set RHOST <agent-ip>; set RPORT 8080; run -j"
- SYN flood (hping3):
sudo hping3 -S -p 8080 -c 1000 <agent-ip>
Always run in a closed lab or virtual network you control.
Siddhant Bhasin Production