📖 Documentation: https://labmonkeys-space.github.io/nl6/
A scalable network and infrastructure simulator that exposes realistic SNMP v2c/v3, SSH, and HTTPS REST interfaces for testing network management software, monitoring systems, and automation tools. nl6 can simulate tens of thousands of network devices, GPU servers, storage systems, and Linux servers — each with its own IP address via Linux TUN interfaces and network namespaces.
- Runs 30,000+ simulated devices on a single host — see Scaling.
- 28 device types across 8 categories (core / edge routers, DC and campus switches, firewalls, servers, NVIDIA DGX/HGX GPU servers, and enterprise storage) — see Device types.
- Multi-protocol per device: SNMP v2c/v3 (MD5/SHA1 auth, DES/AES128 privacy), SSH with VT100 terminal emulation, and HTTPS REST — see SNMP reference and Web API.
- Realistic dynamic metrics: CPU / memory / temperature on 100-point
sine waves; full IF-MIB counter cycling (octets plus per-direction
unicast / multicast / broadcast packet counts, errors, discards) with
per-device error-scenario tuning (
clean/typical/degraded/failing); per-GPU DCGM metrics — see SNMP reference → Dynamic IF-MIB counters and GPU simulation. - Self-reporting version:
./nl6 -version,GET /api/v1/version, and a hero-kicker(vX.Y.Z)in the web UI all report the running build — no source checkout needed to identify a deployed simulator. - Per-device flow export (NetFlow v5 / v9, IPFIX, sFlow v5) with per-device source IPs — see Flow export.
- Per-device SNMPv2c trap / INFORM export — central Poisson scheduler
with a global rate cap, a user-overridable JSON catalog, and per-device
UDP source IPs. Suited to OpenNMS
trapdscale testing. Configure with-trap-collector <host:port>; full flag list and catalog schema in CLAUDE.md → "SNMP trap export". - Per-device UDP syslog export (RFC 5424 / RFC 3164) — central
Poisson scheduler with a global rate cap, user-overridable JSON
catalog, and per-device UDP source IPs. Ships six generic entries
(interface up/down, auth success/failure, config change, system
restart) spanning
local7andauthpriv; select format with-syslog-format 5424|3164. Suited to OpenNMSsyslogdscale testing — configure with-syslog-collector <host:port>; full flag list and catalog schema in CLAUDE.md → "UDP syslog export".
Stable — SNMP v2c/v3, SSH, HTTPS REST (storage APIs), NetFlow v5/v9 and
IPFIX, TUN-per-device scaling with opensim network-namespace isolation,
web UI, REST control plane.
Experimental — sFlow v5 (synthesised from FlowCache records with a
fixed sampling_rate; suitable for collector-plumbing validation, not
link-utilisation benchmarking — see
Flow export reference → sFlow caveat).
Tested scale — up to 30,000 concurrent simulated devices on a single
host. Toolchain — Go 1.26 or later; canonical version pinned in
go/go.mod.
git clone https://github.com/labmonkeys-space/nl6.git
cd nl6/go/nl6 && go build -o nl6 .
# Auto-create 5 devices starting at 192.168.100.1
sudo ./nl6 -auto-start-ip 192.168.100.1 -auto-count 5Then query any device:
snmpget -v2c -c public 192.168.100.1 1.3.6.1.2.1.1.1.0
ssh simadmin@192.168.100.1 # password: simadmin
gnmic -a 192.168.100.1:9339 --skip-verify capabilitiesPer-device exports (flow + trap + syslog in a single create call):
# Boot without any export CLI flags — the subsystems are always-on.
sudo ./nl6
# Create 10 devices that all emit IPFIX flows, SNMPv2c traps, and
# RFC 5424 syslog to one collector. Any of the three blocks is optional.
curl -X POST http://localhost:8080/api/v1/devices \
-H 'Content-Type: application/json' \
-d '{
"start_ip": "10.0.0.1",
"device_count": 10,
"flow": {"collector": "192.168.1.10:4739", "protocol": "ipfix"},
"traps": {"collector": "192.168.1.10:162", "mode": "trap"},
"syslog": {"collector": "192.168.1.10:514", "format": "5424"}
}'
# Inspect what each subsystem has attached.
curl http://localhost:8080/api/v1/flows/status | jq '.data.collectors'
curl http://localhost:8080/api/v1/traps/status | jq '.collectors'
curl http://localhost:8080/api/v1/syslog/status | jq '.collectors'Full walkthrough: Getting started → Quick start. Container deployment: Getting started → Docker.
The docs site has four top-level sections:
- Getting Started — build, first run, Docker.
- Operations — scaling, network namespace, flow export, troubleshooting.
- Reference — architecture, CLI flags, web API, device types, SNMP, flow export, resource files, GPU simulation.
- GPU simulation — NVIDIA DCGM OID layout, per-GPU metrics, and the pollaris / parser integration notes (formerly
plans/).
Reference content that used to live in this README now lives in the docs
site. A bare README.md on GitHub is intentional: the site is the canonical
home.
Contributions are welcome. Two project policies apply to every patch:
1. Sign off every commit (Developer Certificate of Origin). All commits
must carry a Signed-off-by: trailer certifying the
DCO. Use -s on every commit:
git commit -s -m "your commit message"A DCO-check gate will fail any PR whose commits are missing the sign-off trailer.
Suggested workflow
- Fork
labmonkeys-space/nl6. - Create a feature branch.
- Make your changes and add / update tests.
- Run
make check-tidy && make build && make testlocally. git commit -seach commit.gh pr create --repo labmonkeys-space/nl6 --base main.
Cutting a release. Maintainers: see RELEASING.md for the
tag-driven release workflow and the short post-tag verification checklist.
Licensed under the Apache License, Version 2.0. See LICENSE for details.
Originally forked from saichler/l8opensim; see commit history for upstream attribution.
nl6 — simulate networks, test at scale, develop with confidence.
