Blind Relay Abuse Guard

AeroNyxJune 20, 20265 min read16 views

How AeroNyx Rust nodes detect loops, replay attempts, relay rate limits, and peer quarantine while keeping relay nodes blind to payloads, endpoints, route IDs, and social graph edges.

Blind Relay Abuse Guard

Blind Relay Abuse Guard is the AeroNyx Rust node safety layer that detects abusive relay behavior while preserving the protocol's blind-node invariant.

It gives operators enough aggregate evidence to keep a commercial privacy network stable, but it does not turn nodeboard or any relay node into a traffic viewer.

Status

CapabilityStatus
Blind relay loop detection counterImplemented
Blind relay replay-drop counterImplemented
Relay rate-limit counterImplemented
Peer quarantine counterImplemented
Quarantine-start counterImplemented
Per-peer health summary by node-id prefixImplemented
nodeboard Security / Relay Protection displayImplemented
Payload parsing by relayProhibited
Route ID, endpoint, or social graph displayProhibited

Non-negotiable invariant

AeroNyx relay nodes are blind.

They may forward encrypted envelopes and report aggregate protection counters. They must not read, infer, or display:

  • plaintext messages
  • packet payloads
  • DNS contents
  • destinations, domains, URLs, or browsing history
  • full route IDs or relay paths
  • client public IPs
  • complete node public keys in operator UI
  • Memory Chain plaintext
  • private keys, voucher secrets, or wallet-level traffic
  • social graph edges or who is talking to whom

This is the dividing line between an open privacy protocol and a collection of trusted middleboxes.

What the guard reports

Rust reports blind relay protection in:

text
system_stats.discovery_status.peer_store.runtime.blind_relay
system_stats.discovery_status.peer_store.peer_health_summary

nodeboard renders this under:

text
Node Detail -> Discovery -> Security / Relay Protection

This section intentionally lives inside node detail instead of the first-level Services page. It is node-scoped evidence, not a fleet service module.

runtime.blind_relay

runtime.blind_relay is an aggregate counter object for the local Rust node.

FieldMeaning
receivedBlind relay envelopes received by this node.
terminalEnvelopes that terminated at this node.
forwardedEnvelopes forwarded to another node.
rejectedEnvelopes rejected by relay protection.
backpressure_droppedDrops caused by local queue or backpressure protection.
invalid_signatureSignature validation failures.
envelope_too_largeEnvelopes rejected for size.
ttl_exhaustedEnvelopes rejected because hop TTL was exhausted.
no_routeEnvelopes with no eligible forwarding route.
invalid_endpointForwarding endpoint rejected as invalid.
forward_failedForwarding attempt failed.
loop_detectedLoop guard detected the previous hop or route would cycle.
replay_droppedReplay guard dropped a duplicate envelope.
rate_limitedPeer or previous-hop relay rate limit was applied.
quarantinedRelay work dropped because the peer was quarantined.
quarantine_startedA peer entered quarantine after repeated bad relay behavior.
retry_attemptedForward retry attempted.
retry_succeededForward retry succeeded.
retry_exhaustedForward retry budget exhausted.
last_event_atLast local relay protection event timestamp.

The important rule: these are node counters only. They are not message-level logs and are not user-level analytics.

peer_health_summary

peer_health_summary is a per-peer health bucket summary. It lets a node know which peers appear healthy, degraded, failing, or quarantined without revealing user communication.

Allowed fields include:

  • node_id_prefix
  • health
  • descriptor health
  • source bucket
  • last successful gossip age
  • route success and failure counts
  • last route failure reason bucket
  • relay rejection counts
  • relay loop/replay/rate-limit/quarantine counts
  • quarantine remaining seconds
  • last relay rejection or quarantine reason bucket

Not allowed:

  • full node public keys in the operator UI
  • route IDs
  • endpoints
  • encrypted blobs
  • message IDs
  • client public IPs
  • destinations
  • payloads
  • social graph edges

Current file paths

LayerFile pathRole
Rust blind relay API/root/open/AeroNyx/crates/aeronyx-server/src/api/chat_peer.rsApplies loop, replay, rate-limit, and quarantine decisions without parsing payloads.
Rust PeerStore/root/open/AeroNyx/crates/aeronyx-server/src/services/peer_store.rsStores aggregate peer relay health and emits peer_health_summary.
Rust health API/root/open/AeroNyx/crates/aeronyx-server/src/api/vpn_health.rsExposes local privacy-safe health JSON.
Rust heartbeat reporter/root/open/AeroNyx/crates/aeronyx-server/src/management/reporter.rsSends aggregate status in node heartbeat metadata.
Backend observability/root/aeronyx/privacy_network/api/vpn_observability.pyPasses owner-scoped node system metadata to nodeboard.
nodeboard types/root/open/nodeboard/types/index.tsDefines DiscoveryBlindRelayStats, DiscoveryPeerHealthSummary, and related rows.
nodeboard detail UI/root/open/nodeboard/app/dashboard/nodes/[id]/page.tsxRenders Security / Relay Protection inside Discovery.
nodeboard i18n/root/open/nodeboard/lib/i18n/index.tsProvides multilingual operator labels and privacy-boundary copy.

Operator workflow

Open https://app.aeronyx.network, select a node, then inspect:

  1. Discovery for peer count, valid peers, gossip freshness, bootstrap source, seed recovery, and peer cache state.
  2. Relay foundation for Rust-authored discovery readiness.
  3. Security / Relay Protection for loop detection, replay drops, rate limits, quarantine counters, and peer health buckets.
  4. Recent discovery audit for privacy-safe control-plane events.

If loop_detected, replay_dropped, rate_limited, quarantined, or quarantine_started increases, treat it as node-level abuse or instability evidence. It is not evidence of a specific user conversation.

How this supports future multi-hop and onion-style routing

Multi-hop and onion-style routing require the base network to reject bad relay behavior before route construction becomes more complex.

Blind Relay Abuse Guard provides:

  • bounded relay failure counters
  • previous-hop abuse containment
  • peer quarantine state
  • replay protection evidence
  • route health buckets
  • operator visibility without payload visibility

This keeps the foundation compatible with future layered encryption, cover-traffic research, and agent-to-agent encrypted services.

Developer rules

When extending this area:

  1. Add only aggregate counters or reason buckets to nodeboard.
  2. Do not add route IDs, endpoint lists, full node public keys, message IDs, payload hashes, client IPs, or destination fields.
  3. Keep Rust relay logic blind to payload_b64 contents.
  4. Keep nodeboard under Node Detail / Discovery unless the data becomes a fleet-level decision surface.
  5. Update this page whenever a new protection counter or peer-health bucket is added.