حماية الترحيل الأعمى من إساءة الاستخدام

AeroNyx20 يونيو 20266 دقيقة قراءة46 مشاهدة

كيف تحد عقد AeroNyx من replay والحلقات والإفراط والعقد المعطلة دون قراءة النص المشفر، مع أدلة تشغيل تحافظ على الخصوصية.

Blind Relay Abuse Guard هو حد الأمان لإعادة التوجيه المشفر اللامركزي في AeroNyx. يحد من relay المسيء أو غير المستقر دون تحليل ciphertext أو إنشاء سجل دائم للمسار أو تحويل المشغل إلى مراقب للحركة.

الحالة والنطاق

الحماية مطبقة في Rust وتظهر النتائج المجمعة في health metadata وNodeboard. دورها الاحتواء والدليل الصادق: توضح أن العمل المبهم مقبول أو محمي أو متدهور أو قديم، ولا تكشف محتواه.

التحكمالحالة
Blind payload forwardingمطبق
Signed freshness and replay suppressionمطبق
Previous-hop rate limiting and quarantineمطبق
Privacy-safe runtime evidenceمطبق
Nodeboard operator visibilityمطبق
Plaintext or payload inspectionمحظور
User, route, or social-graph analyticsمحظور

ثابت العقدة العمياء

يمكن للـ relay توثيق routing metadata وتطبيق سياسة محدودة وتوجيه envelope مبهم وإرجاع receipt موقع من terminal. لا يجوز له فحص payload أو استنتاجه أو كشف metadata تعيد بناء المسار أو الهوية أو العلاقة الاجتماعية.

  • plaintext للرسائل أو packet payload أو media أو MemChain
  • DNS أو destinations أو domains أو URLs أو browsing history
  • route IDs أو المسارات الكاملة أو endpoint URLs أو client public IP
  • public keys الكاملة أو receiver identity أو message IDs أو social graph
  • private keys أو voucher secrets أو wallet-level traffic أو مواد فك التشفير

مسار القبول

يمر كل request بفحوص محدودة قبل استهلاك forwarding capacity. الترتيب التالي مفاهيمي؛ القرارات تستخدم signed routing metadata والحالة المحلية المجمعة فقط، لا المحتوى المفكوك.

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

حماية replay والحداثة

منع replay محلي وقصير ومحدود السعة. ترفض timestamps الموقعة frames القديمة أو المستقبلية بشكل غير منطقي. القيم defaults حالية في main وليست وعوداً دائمة؛ تغييرها يتطلب tests وdocs.

ثابت runtimeالقيمة الحالية
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

تحديد معدل القفزة السابقة وعزلها

يطبق rate limit حسب هوية القفزة السابقة الموقعة. أكثر من 120 request خلال 60 ثانية يبدأ عزلاً محلياً لخمس دقائق. ويبدأ score منفصل العزل نفسه بعد 12 validation failures عدائية خلال خمس دقائق.

text
invalid_previous_hop | invalid_signature | self_loop | route_loop | ttl_exhausted

الأسباب العدائية فقط تزيد score. Transport timeout وACK المفقود وretry لمسار مكرر لا تعاقب peer سليماً. تخزين buckets محدود وتنتهي الحالة الخاملة، فلا يتحول إلى communication graph دائم.

دلالات idempotency وإعادة المحاولة

route ID المكرر داخل النافذة يحصل على idempotent success: يسجل replay drop مجمعاً دون تسليم أو توجيه ثانٍ. فشل next hop المؤقت يحاول ثلاث مرات كحد أقصى مع jitter محدود؛ الفشل الدائم لا يعاد.

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

عدادات runtime المجمعة

يعرض Rust counters تراكمية خشنة وfreshness timestamps في المسارين التاليين. هي دليل تشغيل على مستوى العقدة، لا message logs أو analytics للفوترة أو إثبات لمحادثة معينة.

text
system_stats.discovery_status.peer_store.runtime.blind_relay
system_stats.discovery_status.peer_store.peer_health_summary
مجموعة العداداتالحقول
الاستقبال والنتيجةreceived, terminal, forwarded, rejected
التحقق والحمايةinvalid_signature, envelope_too_large, ttl_exhausted, no_route, invalid_endpoint, loop_detected, replay_dropped, timestamp_rejected, rate_limited, quarantined, quarantine_started
النقل وإعادة المحاولةbackpressure_dropped, forward_failed, retry_attempted, retry_succeeded, retry_exhausted
الدليل الاصطناعيprobe_attempted, probe_succeeded, probe_failed, two_hop_probe_attempted, two_hop_probe_succeeded, two_hop_probe_failed
التسليم الحقيقي والحداثةverified_client_onion_deliveries, last_verified_client_onion_delivery_at, last_accepted_at, last_event_at

دلالات جودة الأدلة

يفصل ملخص الجودة بين opaque work المقبول وsynthetic probes وsynthetic two-hop proofs وclient receipts الموقعة من terminal. يتطلب real_relay_ready receipt حديثاً موثقاً بدأه client ووقعه terminal المتوقع. لا تعرض الأدلة synthetic كحركة App/user.

statusالمعنى
idleلا يوجد دليل relay أو probe بعد.
observingيوجد دليل جزئي لكن readiness غير مثبتة.
staleدليل النجاح السابق لم يعد حديثاً.
readyيوجد عمل مقبول أو proof حديث دون تنبيه نقل نشط.
protectingعدادات الحماية نشطة والـ relay ما زال يعمل.
degradedفشل forwarding أو probe يحتاج تحقيقاً.
attentionBackpressure أو نفاد retries يحتاج إجراءً فورياً.

يفصل proof_scope بين client_message_delivery وrelay_acceptance وmessage_delivery وcontrol_plane وsingle_hop_control_plane وattempted وnone. تبقى totals تراكمية بينما readiness يحتاج دليلاً حديثاً ويحسب transport failures النشطة.

صحة peer المحمية للخصوصية

يستخدم peer_health_summary node identifier مختصراً وhealth buckets خشنة لعزل peer فاشل أو quarantined دون كشف علاقات الحركة. إنه تشخيص control-plane بحد خصوصية صريح.

مسموح:

  • node_id_prefix مختصر
  • health وdescriptor state خشنان
  • freshness buckets لـ gossip وroute success
  • aggregate route success/failure counts
  • aggregate loop/replay/rate-limit/quarantine counts
  • زمن العزل المتبقي وbounded reason buckets

غير مسموح:

  • node public keys كاملة
  • route IDs أو endpoint lists
  • encrypted blobs أو payload hashes
  • message IDs أو receiver identity
  • client IP أو destinations أو DNS
  • social graph أو علاقات التواصل

مسار عمل المشغل

افتح Nodeboard واختر العقدة ثم Discovery وSecurity / Relay Protection. فسر الاتجاهات فقط مع node health وreachability وضغط queue وحداثة proofs الموقعة.

  1. تحقق من حداثة descriptors وbootstrap recovery.
  2. قارن accepted_total وaccepted_percent وعمر آخر accepted قبل إعلان ready.
  3. ميز real_relay_ready عن synthetic readiness؛ الأول فقط يثبت authenticated client-originated terminal receipt.
  4. عند protecting أو degraded أو attention افحص aggregate buckets وtransport health دون طلب user-level logs.

خريطة المصدر

تستخدم الوثائق مسارات نسبية للمستودع لتبقى صحيحة بعد نقل الخوادم. Backend وNodeboard في مستودعين منفصلين ولا يستهلكان إلا owner-scoped privacy-safe metadata.

الطبقةمسار المستودعالدور
Rust relay APIcrates/aeronyx-server/src/api/chat_peer.rsيوثق envelopes ويطبق loop وreplay وfreshness وrate وquarantine وretry وterminal receipt.
Rust PeerStorecrates/aeronyx-server/src/services/peer_store.rsيحفظ bounded counters وpeer health وreadiness وproof classification.
Rust health APIcrates/aeronyx-server/src/api/vpn_health.rsينشر health JSON محلياً يحفظ الخصوصية.
Rust reportercrates/aeronyx-server/src/management/reporter.rsينقل aggregate status في heartbeat metadata.
Backend observabilityprivacy_network/api/vpn_observability.pyيعيد owner-scoped metadata إلى لوحة المشغل.
Nodeboard typestypes/index.tsيعرف أنواع blind relay وpeer health.
Nodeboard detail وi18napp/dashboard/nodes/[id]/page.tsx and lib/i18n/index.tsيعرض Security / Relay Protection بنص privacy boundary مترجم.

أساس التوجيه متعدد القفزات

يتطلب multi-hop مقاومة replay واحتواء الحلقات وbounded retry وعزل peers وأدلة لا تخلط مع user traffic. توفر الحماية أساس layered encryption وroute diversity دون إضعاف blind-node invariant.

قواعد التطوير

اعتبر كل حقل جديد privacy review. يجب أن يجيب المقياس عن موثوقية العقدة دون تحديد payload أو sender أو receiver أو path أو endpoint أو conversation.

  1. حافظ على payload_b64 opaque في كل relay path.
  2. أضف aggregate counters أو bounded reason buckets فقط.
  3. لا تربط counters مع routes أو endpoints أو users أو receivers أو message metadata.
  4. لا تدخل synthetic probes في totals للرسائل أو packets أو bytes المشفرة.
  5. حدث Rust tests وNodeboard types وكل اللغات عند تغير الدلالة.

اكتشاف العقد والتسليم المشفر القابل للتحقق