Perlindungan penyalahgunaan blind relay

AeroNyx20 Juni 20266 menit baca48 tayangan

Cara node AeroNyx membatasi replay, loop, request berlebih, dan peer gagal tanpa membaca ciphertext, dengan bukti operator yang menjaga privasi.

Blind Relay Abuse Guard adalah batas keamanan forwarding terenkripsi terdesentralisasi AeroNyx. Guard membatasi relay abusif atau tidak stabil tanpa menganalisis ciphertext, membuat riwayat route permanen, atau menjadikan operator pengamat traffic.

Status dan cakupan

Guard diterapkan di Rust dan hasil agregat tampil melalui node health metadata serta Nodeboard. Tugasnya containment dan bukti jujur: opaque relay work accepted, protected, degraded, atau stale, tanpa mengungkap isi.

KontrolStatus
Blind payload forwardingDiimplementasikan
Signed freshness and replay suppressionDiimplementasikan
Previous-hop rate limiting and quarantineDiimplementasikan
Privacy-safe runtime evidenceDiimplementasikan
Nodeboard operator visibilityDiimplementasikan
Plaintext or payload inspectionDilarang
User, route, or social-graph analyticsDilarang

Invarian node buta

Relay boleh mengautentikasi signature routing metadata, menerapkan policy terbatas, meneruskan opaque envelope, dan mengembalikan terminal-signed receipt. Relay tidak boleh memeriksa atau menyimpulkan payload maupun membocorkan metadata yang membangun kembali route, identitas, atau hubungan sosial.

  • message plaintext, packet payload, media content, atau MemChain plaintext
  • DNS content, destination, domain, URL, atau browsing history
  • route ID, complete path, endpoint URL, atau client public IP
  • full public key, receiver identity, message ID, atau social graph
  • private key, voucher secret, wallet-level traffic, atau decryption material

Alur penerimaan

Setiap request melewati pemeriksaan terbatas sebelum memakai forwarding capacity. Urutan berikut konseptual; keputusan hanya memakai signed routing metadata dan local aggregate state, bukan isi yang didekripsi.

text
verify signed previous_hop and envelope
apply in-flight backpressure
check timestamp freshness
check route replay cache
apply previous-hop rate/quarantine decision
validate TTL, loop safety, next-hop descriptor, and endpoint
forward opaque ciphertext or terminate into pending store

Perlindungan replay dan freshness

Replay suppression bersifat local, singkat, dan terbatas kapasitas. Signed timestamp menolak frame lama atau terlalu jauh di masa depan. Tabel adalah runtime default main saat ini, bukan janji protocol permanen; perubahan membutuhkan test dan docs.

Konstanta runtimeDefault saat ini
MAX_BLIND_RELAY_SEEN_ROUTES8192 route IDs
BLIND_RELAY_ROUTE_REPLAY_WINDOW_SECS600 seconds
BLIND_RELAY_PREVIOUS_HOP_RATE_LIMIT120 requests / 60 seconds
BLIND_RELAY_PREVIOUS_HOP_FAILURE_THRESHOLD12 scored failures / 300 seconds
BLIND_RELAY_PREVIOUS_HOP_QUARANTINE_SECS300 seconds
MAX_BLIND_RELAY_PREVIOUS_HOP_BUCKETS4096 buckets
BLIND_RELAY_MAX_ENVELOPE_AGE_SECS600 seconds
BLIND_RELAY_MAX_FUTURE_SKEW_SECS120 seconds
BLIND_RELAY_DELIVERY_RECEIPT_MAX_AGE_SECS120 seconds
MAX_BLIND_RELAY_FORWARD_ATTEMPTS3 attempts

Batas laju dan karantina hop sebelumnya

Rate limit diterapkan per signed previous-hop identity. Lebih dari 120 request dalam 60 detik memulai local quarantine lima menit. Failure score terpisah memulai karantina sama setelah 12 validation failure agresif dalam lima menit.

text
invalid_previous_hop | invalid_signature | self_loop | route_loop | ttl_exhausted

Hanya adversarial validation reason menambah score. Transport timeout, ACK hilang, dan duplicate route retry tidak menghukum peer sehat. Bucket store terbatas dan idle state kedaluwarsa, sehingga tidak menjadi communication graph permanen.

Idempotensi dan retry

Route ID berulang di replay window mendapat idempotent success: satu aggregate replay drop dicatat tanpa delivery atau forward kedua. Next-hop failure sementara dicoba paling banyak tiga kali dengan bounded jitter; validation failure permanen tidak di-retry.

text
duplicate route_id -> accepted=true, reason=duplicate_route, no second delivery
transient next-hop failure -> bounded retry with deterministic jitter
permanent validation failure -> no retry

Counter runtime agregat

Rust mengekspos coarse cumulative counter dan freshness timestamp di dua path berikut. Ini node-scoped operational evidence, bukan message log, billing analytics, atau bukti conversation tertentu.

text
system_stats.discovery_status.peer_store.runtime.blind_relay
system_stats.discovery_status.peer_store.peer_health_summary
Grup counterField
Penerimaan dan hasilreceived, terminal, forwarded, rejected
Validasi dan perlindunganinvalid_signature, envelope_too_large, ttl_exhausted, no_route, invalid_endpoint, loop_detected, replay_dropped, timestamp_rejected, rate_limited, quarantined, quarantine_started
Transport dan retrybackpressure_dropped, forward_failed, retry_attempted, retry_succeeded, retry_exhausted
Bukti sintetisprobe_attempted, probe_succeeded, probe_failed, two_hop_probe_attempted, two_hop_probe_succeeded, two_hop_probe_failed
Delivery nyata dan freshnessverified_client_onion_deliveries, last_verified_client_onion_delivery_at, last_accepted_at, last_event_at

Makna kualitas bukti

Quality summary memisahkan accepted opaque work, synthetic probe, synthetic two-hop proof, dan terminal-signed client receipt. real_relay_ready memerlukan fresh authenticated client-originated receipt dari expected terminal. Synthetic evidence tidak boleh ditampilkan sebagai App/user traffic.

statusMakna
idleBelum ada relay atau probe evidence.
observingAda evidence sebagian, readiness belum terbentuk.
staleEvidence sukses sebelumnya tidak lagi fresh.
readyAda fresh accepted work atau proof tanpa active transport attention.
protectingCounter perlindungan aktif dan relay tetap beroperasi.
degradedForwarding atau probe failure perlu diselidiki.
attentionBackpressure atau retry habis perlu tindakan segera.

proof_scope membedakan client_message_delivery, relay_acceptance, message_delivery, control_plane, single_hop_control_plane, attempted, none. Historical totals tetap kumulatif; readiness memerlukan fresh evidence dan memperhitungkan active transport failures.

Kesehatan peer yang menjaga privasi

peer_health_summary memakai node identifier singkat dan coarse health bucket agar failing/quarantined peer dapat diisolasi tanpa membuka traffic relationship. Ini control-plane diagnostic dengan privacy boundary eksplisit.

Diizinkan:

  • node_id_prefix singkat
  • coarse health dan descriptor state
  • gossip dan route success freshness bucket
  • aggregate route success/failure counts
  • aggregate loop/replay/rate-limit/quarantine counts
  • sisa waktu quarantine dan bounded reason bucket

Tidak diizinkan:

  • full node public keys
  • route IDs atau endpoint lists
  • encrypted blobs atau payload hashes
  • message IDs atau receiver identity
  • client IP, destinations, atau DNS
  • social graph atau relasi komunikasi

Alur operator

Buka Nodeboard, pilih node, lalu Discovery dan Security / Relay Protection. Tafsirkan tren hanya bersama node health, reachability, queue pressure, dan signed proof freshness.

  1. Pastikan freshness descriptor dan bootstrap recovery.
  2. Bandingkan accepted_total, accepted_percent, dan last accepted age sebelum menyatakan ready.
  3. Bedakan real_relay_ready dari synthetic readiness; hanya yang pertama membuktikan authenticated client-originated terminal receipt.
  4. Saat protecting, degraded, atau attention, periksa aggregate bucket dan transport health tanpa meminta user-level log.

Peta source

Dokumentasi memakai repository-relative path agar tetap valid saat host berpindah. Backend dan Nodeboard berada di repository terpisah dan hanya memakai owner-scoped privacy-safe metadata.

LapisanPath repositoryPeran
Rust relay APIcrates/aeronyx-server/src/api/chat_peer.rsMengautentikasi envelope dan menerapkan loop, replay, freshness, rate, quarantine, retry, serta terminal receipt.
Rust PeerStorecrates/aeronyx-server/src/services/peer_store.rsMenyimpan bounded counters, peer health, readiness, dan proof classification.
Rust health APIcrates/aeronyx-server/src/api/vpn_health.rsMenerbitkan local privacy-safe health JSON.
Rust reportercrates/aeronyx-server/src/management/reporter.rsMembawa aggregate status dalam heartbeat metadata.
Backend observabilityprivacy_network/api/vpn_observability.pyMengembalikan owner-scoped metadata ke operator console.
Nodeboard typestypes/index.tsMendefinisikan blind relay dan peer health type.
Nodeboard detail dan i18napp/dashboard/nodes/[id]/page.tsx and lib/i18n/index.tsMenampilkan Security / Relay Protection dengan privacy-boundary copy terlokalisasi.

Fondasi routing multi-hop

Multi-hop memerlukan replay resistance, loop containment, bounded retry, peer quarantine, dan evidence yang tidak disamakan dengan user traffic. Guard menjadi dasar layered encryption dan route diversity tanpa melemahkan blind-node invariant.

Aturan pengembangan

Perlakukan setiap field baru sebagai privacy review. Metric harus menjawab reliabilitas node tanpa mengidentifikasi payload, sender, receiver, path, endpoint, atau conversation.

  1. Jaga payload_b64 tetap opaque di setiap relay path.
  2. Tambahkan hanya aggregate counter atau bounded reason bucket.
  3. Jangan join counter dengan route, endpoint, user, receiver, atau message metadata.
  4. Jangan masukkan synthetic probe ke encrypted message, packet, dan byte totals.
  5. Perbarui Rust tests, Nodeboard types, dan semua bahasa saat semantics berubah.

Penemuan node dan delivery relay terenkripsi yang dapat diverifikasi