01 · overview
A drop-in RIPE Atlas probe,
written in Rust.
starla is an alternative unofficial implementation of the RIPE Atlas software probe. Same wire protocol, same result format. Distributed as a single statically-linked binary that runs on Linux, macOS, and Windows — on bare metal, in a container, or as a Nix module.
01What it is
RIPE Atlas is a global measurement network: thousands of probes run scheduled ping, traceroute, DNS, HTTP, TLS, and NTP measurements from their vantage points and ship the results back to the RIPE NCC. The reference probe is a daemon originally written in C, intended for embedded hardware.
starla is the same daemon, rewritten as one Rust binary. It connects to the same controller infrastructure, accepts the same CRONLINE and ONEOFF commands, and produces RESULT lines that are byte-compatible with the reference probe's output (field order, spacing, numeric precision included).
Same wire protocol. Different runtime — one binary, no OpenSSH, no subprocesses, no listening ports.
02Features
All six measurement types
Ping, traceroute, DNS, HTTP, TLS, NTP. RESULT line format byte-compatible with the reference probe.
Pure-Rust SSH (russh)
No OpenSSH dependency, no subprocess fan-out. One async runtime, one binary.
No local listening ports
All communication flows through the SSH tunnel; commands arrive over a reverse tunnel and uploads go out via direct-tcpip channels.
Container, .deb, .rpm, NixOS, brew, MSI
Multi-arch (amd64/arm64). Minimal container image — binary plus CA certs. NixOS & Home-Manager modules with systemd hardening.
Optional Prometheus exporter
Measurement counts, queue depth, upload latency, SSH state. Configurable listen address.
Bounded in-memory result queue
Configurable capacity. Drops oldest first when full or when the controller link goes dark.
03Quick start
Pick a runtime. Each ships with sensible defaults; configuration is optional.
shelldocker · podman# persistent state, raw sockets for ping/trace docker run -d --name starla \ -v starla-state:/state \ --cap-add NET_RAW \ ghcr.io/ananthb/starla:latest
nixflake input + moduleinputs.starla.url = "github:ananthb/starla"; # in your nixos config: imports = [ starla.nixosModules.default ]; services.starla.enable = true;
shellaptcurl -LO https://github.com/ananthb/starla/releases/latest/download/starla_amd64.deb sudo dpkg -i starla_*.deb sudo systemctl enable --now starla
shelldnfcurl -LO https://github.com/ananthb/starla/releases/latest/download/starla.x86_64.rpm sudo dnf install ./starla*.rpm sudo systemctl enable --now starla
shellhomebrewbrew install ananthb/starla/starla brew services start starla # optional GUI tray applet brew install --cask ananthb/starla/starla-tray
shellrelease tarballcurl -LO https://github.com/ananthb/starla/releases/latest/download/starla-amd64.tar.gz tar xzf starla-amd64.tar.gz sudo ./starla/starla
Full options, configuration, and signature verification are in the installation guide.
04How it works
On first run, starla generates an SSH key pair and registers with a
RIPE Atlas registration server. After registration it opens a
single long-lived SSH connection to the assigned controller and
receives measurement schedules over a reverse-tunneled telnet stream.
Results are uploaded back through SSH direct-tcpip channels.
Probe state (SSH keys, probe ID, known hosts) is persisted in the state directory and survives restarts. Pending result uploads live in a bounded in-memory queue and do not.
See architecture for the data flow, or protocol for the wire-level details.
05Register your probe
After first start, copy the public key from the log output (or
probe_key.pub in the state directory) and paste it into the
application form at
atlas.ripe.net/apply/swprobe.
starla retries in the background; once approved, it connects and begins running
measurements.
Each probe is bound to its SSH key. If you lose the state directory, generate a new key and re-apply — old probes can't be recovered.