Open source · MIT · v0.4

The Open-Source Network Device Simulator for NMS Load Testing

Stand up 50,000 simulated Cisco IOS devices on one Linux host. Real SSH, realistic running-configs, zero-copy delivery, built for network configuration management testing.

THE PROBLEM

You cannot scale-test an NMS against fifty devices and call it done.

Network automation load testing has always been bottlenecked by the thing being tested. You can poll fifty devices and learn something about correctness; you cannot learn anything about what happens when your collector, diff engine, or scheduler hits a realistic fleet.

Virtual labs, GNS3, EVE-NG, Containerlab, are excellent for protocol work and small topologies, but they were never built to simulate network devices at scale on commodity hardware. Renting a 50,000-device lab is absurd.

rConfig-sim fills that gap. It exposes 50,000 concurrent SSH listeners on a single Linux host, each answering real Cisco IOS commands and serving realistic running-configs via mmap. It is the only thing we have found that lets you ask a meaningful question about how to load test network configuration management platforms at scale.

CAPABILITIES

Built for fleet-scale NMS testing

Six engineering decisions that turn a single Linux host into a reproducible load generator for network configuration management platforms.

  • 50,000 concurrent SSH listeners

    A single systemd unit template fans out across loopback IPs. One host, no orchestration layer, no container runtime. Handshake latency stays under 200 ms at full fleet.

  • Real Cisco IOS emulation

    Enable mode, abbreviated command matching (sh run, sh ver), user EXEC to privileged EXEC transitions, realistic prompts. It answers the same commands your collector already sends.

  • Zero-copy config delivery via mmap

    Running-configs sit on disk as memory-mapped files and stream straight to SSH channels. No per-session allocation, no copy. This is how it fits 50,000 devices in 6.4 GB RSS.

  • Fault injection, deterministic

    Four failure modes, auth_fail, disconnect_mid, slow_response, malformed, seeded per-device. Your retry logic, timeout handling, and diff engine get tested against the failures they will actually see.

  • Prometheus metrics, bounded cardinality

    Session counts, bytes served, handshake timings, per-fault-mode counters. Cardinality caps enforced so the metrics endpoint does not itself become the load test.

  • Systemd-native, per-IP isolation

    Every simulator instance is a rcfg-sim@<ip>.service unit. Journal logs per device, resource limits per device, and single-unit restarts when you want to watch your NMS recover one node.

SCENARIOS

What you can actually test

Each scenario in the repo corresponds to a real NMS failure mode we have hit in production. Pick the one that looks like the question you are trying to answer.

ALTERNATIVES

How it compares to other network simulation tools

These are all good tools for different jobs. This table is about which one to reach for when the question is “how does my NMS behave at 50,000 devices?”

  • Max devices per host
    rConfig-sim
    50,000+
    GNS3 / EVE-NG
    ~30
    Containerlab
    ~200
    SSH mocks
    unbounded
    Real hardware lab
    physical
  • Real SSH
    rConfig-sim
    yes
    GNS3 / EVE-NG
    yes
    Containerlab
    yes
    SSH mocks
    partial
    Real hardware lab
    yes
  • Real config output
    rConfig-sim
    yes
    GNS3 / EVE-NG
    yes
    Containerlab
    yes
    SSH mocks
    stubbed
    Real hardware lab
    yes
  • Deterministic fleet
    rConfig-sim
    yes
    GNS3 / EVE-NG
    no
    Containerlab
    partial
    SSH mocks
    yes
    Real hardware lab
    no
  • Setup time
    rConfig-sim
    minutes
    GNS3 / EVE-NG
    hours, days
    Containerlab
    hours
    SSH mocks
    minutes
    Real hardware lab
    weeks
  • Cost
    rConfig-sim
    free (MIT)
    GNS3 / EVE-NG
    free + licences
    Containerlab
    free
    SSH mocks
    free
    Real hardware lab
    six figures
  • Built for NMS load testing
    rConfig-sim
    yes
    GNS3 / EVE-NG
    no
    Containerlab
    no
    SSH mocks
    no
    Real hardware lab
    no
  • Protocol accuracy
    rConfig-sim
    IOS surface
    GNS3 / EVE-NG
    full
    Containerlab
    full
    SSH mocks
    surface
    Real hardware lab
    full
Comparison of rConfig-sim, GNS3, EVE-NG, Containerlab, generic SSH mocks, and real hardware labs as alternatives for NMS scalability testing and Cisco IOS emulator use cases.
rConfig-simGNS3 / EVE-NGContainerlabSSH mocksReal hardware lab
Max devices per host50,000+~30~200unboundedphysical
Real SSHyesyesyespartialyes
Real config outputyesyesyesstubbedyes
Deterministic fleetyesnopartialyesno
Setup timeminuteshours, dayshoursminutesweeks
Costfree (MIT)free + licencesfreefreesix figures
Built for NMS load testingyesnononono
Protocol accuracyIOS surfacefullfullsurfacefull

If you need full-stack protocol realism, use GNS3 or Containerlab. If you need to know how your collector handles 50,000 SSH sessions at once, a question about network management platform testing, use this.

PROOF

What it looks like running

  • 50,000Devices

    single host

  • 6.4 GBResident memory

    after 1 h steady-state

  • 42 sBoot to ready

    cold start

  • 183 msAverage handshake

    50,000 concurrent

  • 112 KBBytes per session (avg)

    mixed config sizes

  • 201,542Open file descriptors

    sustained

  • 32 vCPU / 64 GBReference host

    Hetzner AX102

Ten minutes of output on a reference host. No marketing gloss, if the numbers don't match yours, tell us in an issue.

systemctl list-units20 shards · 50,000 devices
$ systemctl list-units 'rcfg-sim@*' --type=service --no-pager --plain
UNIT                        LOAD   ACTIVE SUB     DESCRIPTION
rcfg-sim@10.0.0.1.service   loaded active running rconfig-sim shard (10.0.0.1)
rcfg-sim@10.0.0.2.service   loaded active running rconfig-sim shard (10.0.0.2)
rcfg-sim@10.0.0.3.service   loaded active running rconfig-sim shard (10.0.0.3)
rcfg-sim@10.0.0.4.service   loaded active running rconfig-sim shard (10.0.0.4)
rcfg-sim@10.0.0.5.service   loaded active running rconfig-sim shard (10.0.0.5)
...
rcfg-sim@10.0.0.20.service  loaded active running rconfig-sim shard (10.0.0.20)

20 loaded units listed · 50,000 devices served
GET /metricsprometheus · bounded cardinality
$ curl -s localhost:9394/metrics | grep -E '^rcfg_sim_'
rcfg_sim_sessions_active 49982
rcfg_sim_sessions_total{state="ok"} 2.184e+06
rcfg_sim_sessions_total{state="auth_fail"} 2.31e+04
rcfg_sim_sessions_total{state="disconnect_mid"} 1.08e+04
rcfg_sim_handshake_ms_p50 142
rcfg_sim_handshake_ms_p99 311
rcfg_sim_bytes_served_total 6.12e+11
rcfg_sim_rlimit_nofile_pct 0.77
rcfg_sim_fault_injection_ratio 0.032
rcfg_sim_build_info{version="0.4.0",goos="linux",goarch="amd64"} 1
WORKFLOW

Three commands from nothing to 50,000 devices

Each step collapses by default on the live page. Expand to see the command and what it produces.

  1. Generate the fleet

    Emits 50,000 running-configs, a manifest.json, and the systemd drop-in. Typical runtime: 8 minutes on a modern 16-core host.

    $ rcfg-sim-gen --count 50000 --out ./fleet

  2. Start the simulators

    Each unit owns an IP and serves 200 devices. Twenty-five such units for the full 50,000. Deterministic port assignment via systemd template expansion.

    $ systemctl start rcfg-sim@10.0.0.{1..250}.service

  3. Point your NMS at the manifest

    Import manifest.json, it contains hostname, IP, port, model, and credentials for every simulated device. Your collector sees a fleet of Cisco IOS devices. Your collector cannot tell the difference.

    $ rconfig import-manifest ./fleet/manifest.json
    imported 50,000 devices · 0 errors
    $ rconfig backup --all --parallel 256

WHY WE BUILT IT

Built for rConfig, works against any SSH-polling NMS

We built rConfig-sim to load-test rConfig, the open-source network configuration management platform. Every performance claim rConfig makes, 50,000-device fleets, sub-minute backup cycles, bounded memory under burst, was validated with this simulator before it left the build pipeline.

The same harness works against any NMS that polls devices over SSH: NetBrain, SolarWinds NCM, Oxidized, BackBox, RANCID, or your internally-built tooling. If it speaks SSH to Cisco IOS, it can be load-tested against rconfig-sim, no vendor lock-in, no fake network devices for testing behind a paywall.

FAQ

Frequently asked questions

Quick answers for network automation engineers, NMS platform teams, and contributors.

What is rConfig-sim?

rConfig-sim is an open-source network device simulator that runs up to 50,000 fake Cisco IOS devices on a single Linux host. Each simulated device answers real SSH connections and serves realistic running-configs. It exists to let you load test network configuration management platforms at scale without a hardware lab.

How does rConfig-sim compare to GNS3 or EVE-NG?

GNS3 and EVE-NG run full Cisco IOS images inside virtual machines, they are protocol-accurate to the last byte. They also top out around 30 devices per host and need real Cisco software licences. rConfig-sim is surface-accurate to IOS commands your NMS actually sends, but fits 50,000 devices in 6.4 GB of RAM. Different tools for different jobs, use GNS3 for protocol work, use rConfig-sim for NMS scalability testing.

Can I use rConfig-sim to test NMS platforms other than rConfig?

Yes. Any NMS that polls devices over SSH, NetBrain, SolarWinds NCM, Auvik, BackBox, Oxidized, RANCID, or an internal tool, can point at a rConfig-sim fleet. The simulator answers standard Cisco IOS commands over SSH; whatever your collector sends is what it responds to.

What Cisco IOS commands does it support?

Login, enable, show version, show running-config, show startup-config, show interfaces, terminal length 0, command abbreviation, enable secret handling, and the EXEC to privileged EXEC transition. It covers the command surface that network configuration management tools actually hit, not the full IOS CLI.

How many devices can it simulate on one server?

50,000 concurrent Cisco IOS devices on a 32 vCPU / 64 GB reference host, sitting at 6.4 GB resident memory. The practical ceiling on commodity hardware is file-descriptor limits, not CPU or RAM.

Is rConfig-sim production-ready?

It is production-ready for what it is, a load-testing tool. It is not a device substitute for production traffic. We run it in CI against every rConfig release, and we ship the same binary externally. The project is MIT-licensed; use it, fork it, break it.

How much does it cost?

Zero. rConfig-sim is MIT-licensed and free to use, modify, and redistribute. There is no paid tier and no enterprise fork.

Can it simulate Juniper, Arista, or other vendors?

Not currently. The v0.4 release covers Cisco IOS only. Juniper Junos and Arista EOS are tracked as future work, a pluggable dialect layer exists in the codebase, but the other dialects are not implemented. Contributions welcome.

Does it support SSH key authentication?

Yes. Password auth and public-key auth both work, configurable per fleet. The manifest carries credentials for every simulated device so your NMS can authenticate the same way it would against real hardware.

How do I contribute?

The repo lives at github.com/rConfig/rConfig-sim. Issues, PRs, and protocol-dialect contributions are all welcome. The codebase is Go, the test suite runs the simulator against a real SSH client, and the CI gate is strict about zero-copy invariants in the hot path.

Load test your NMS against 50,000 real SSH sessions

rConfig-sim is MIT-licensed, single-host, and production-ready for load testing. The repo has the quickstart, the scenarios, and the full deployment guide.