Perlindungan penyalahgunaan blind relay
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.
| Kontrol | Status |
|---|---|
| Blind payload forwarding | Diimplementasikan |
| Signed freshness and replay suppression | Diimplementasikan |
| Previous-hop rate limiting and quarantine | Diimplementasikan |
| Privacy-safe runtime evidence | Diimplementasikan |
| Nodeboard operator visibility | Diimplementasikan |
| Plaintext or payload inspection | Dilarang |
| User, route, or social-graph analytics | Dilarang |
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.
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 runtime | Default saat ini |
|---|---|
MAX_BLIND_RELAY_SEEN_ROUTES | 8192 route IDs |
BLIND_RELAY_ROUTE_REPLAY_WINDOW_SECS | 600 seconds |
BLIND_RELAY_PREVIOUS_HOP_RATE_LIMIT | 120 requests / 60 seconds |
BLIND_RELAY_PREVIOUS_HOP_FAILURE_THRESHOLD | 12 scored failures / 300 seconds |
BLIND_RELAY_PREVIOUS_HOP_QUARANTINE_SECS | 300 seconds |
MAX_BLIND_RELAY_PREVIOUS_HOP_BUCKETS | 4096 buckets |
BLIND_RELAY_MAX_ENVELOPE_AGE_SECS | 600 seconds |
BLIND_RELAY_MAX_FUTURE_SKEW_SECS | 120 seconds |
BLIND_RELAY_DELIVERY_RECEIPT_MAX_AGE_SECS | 120 seconds |
MAX_BLIND_RELAY_FORWARD_ATTEMPTS | 3 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.
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.
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.
system_stats.discovery_status.peer_store.runtime.blind_relay
system_stats.discovery_status.peer_store.peer_health_summary
| Grup counter | Field |
|---|---|
| Penerimaan dan hasil | received, terminal, forwarded, rejected |
| Validasi dan perlindungan | invalid_signature, envelope_too_large, ttl_exhausted, no_route, invalid_endpoint, loop_detected, replay_dropped, timestamp_rejected, rate_limited, quarantined, quarantine_started |
| Transport dan retry | backpressure_dropped, forward_failed, retry_attempted, retry_succeeded, retry_exhausted |
| Bukti sintetis | probe_attempted, probe_succeeded, probe_failed, two_hop_probe_attempted, two_hop_probe_succeeded, two_hop_probe_failed |
| Delivery nyata dan freshness | verified_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.
status | Makna |
|---|---|
idle | Belum ada relay atau probe evidence. |
observing | Ada evidence sebagian, readiness belum terbentuk. |
stale | Evidence sukses sebelumnya tidak lagi fresh. |
ready | Ada fresh accepted work atau proof tanpa active transport attention. |
protecting | Counter perlindungan aktif dan relay tetap beroperasi. |
degraded | Forwarding atau probe failure perlu diselidiki. |
attention | Backpressure 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_prefixsingkat- 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.
- Pastikan freshness descriptor dan bootstrap recovery.
- Bandingkan
accepted_total,accepted_percent, dan last accepted age sebelum menyatakan ready. - Bedakan
real_relay_readydari synthetic readiness; hanya yang pertama membuktikan authenticated client-originated terminal receipt. - 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.
| Lapisan | Path repository | Peran |
|---|---|---|
| Rust relay API | crates/aeronyx-server/src/api/chat_peer.rs | Mengautentikasi envelope dan menerapkan loop, replay, freshness, rate, quarantine, retry, serta terminal receipt. |
| Rust PeerStore | crates/aeronyx-server/src/services/peer_store.rs | Menyimpan bounded counters, peer health, readiness, dan proof classification. |
| Rust health API | crates/aeronyx-server/src/api/vpn_health.rs | Menerbitkan local privacy-safe health JSON. |
| Rust reporter | crates/aeronyx-server/src/management/reporter.rs | Membawa aggregate status dalam heartbeat metadata. |
| Backend observability | privacy_network/api/vpn_observability.py | Mengembalikan owner-scoped metadata ke operator console. |
| Nodeboard types | types/index.ts | Mendefinisikan blind relay dan peer health type. |
| Nodeboard detail dan i18n | app/dashboard/nodes/[id]/page.tsx and lib/i18n/index.ts | Menampilkan 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.
- Jaga
payload_b64tetap opaque di setiap relay path. - Tambahkan hanya aggregate counter atau bounded reason bucket.
- Jangan join counter dengan route, endpoint, user, receiver, atau message metadata.
- Jangan masukkan synthetic probe ke encrypted message, packet, dan byte totals.
- Perbarui Rust tests, Nodeboard types, dan semua bahasa saat semantics berubah.
Penemuan node dan delivery relay terenkripsi yang dapat diverifikasi