حماية الترحيل الأعمى من إساءة الاستخدام
كيف تحد عقد 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 والحالة المحلية المجمعة فقط، لا المحتوى المفكوك.
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_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 |
تحديد معدل القفزة السابقة وعزلها
يطبق rate limit حسب هوية القفزة السابقة الموقعة. أكثر من 120 request خلال 60 ثانية يبدأ عزلاً محلياً لخمس دقائق. ويبدأ score منفصل العزل نفسه بعد 12 validation failures عدائية خلال خمس دقائق.
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 محدود؛ الفشل الدائم لا يعاد.
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 للفوترة أو إثبات لمحادثة معينة.
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 يحتاج تحقيقاً. |
attention | Backpressure أو نفاد 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 الموقعة.
- تحقق من حداثة descriptors وbootstrap recovery.
- قارن
accepted_totalوaccepted_percentوعمر آخر accepted قبل إعلان ready. - ميز
real_relay_readyعن synthetic readiness؛ الأول فقط يثبت authenticated client-originated terminal receipt. - عند protecting أو degraded أو attention افحص aggregate buckets وtransport health دون طلب user-level logs.
خريطة المصدر
تستخدم الوثائق مسارات نسبية للمستودع لتبقى صحيحة بعد نقل الخوادم. Backend وNodeboard في مستودعين منفصلين ولا يستهلكان إلا owner-scoped privacy-safe metadata.
| الطبقة | مسار المستودع | الدور |
|---|---|---|
| Rust relay API | crates/aeronyx-server/src/api/chat_peer.rs | يوثق envelopes ويطبق loop وreplay وfreshness وrate وquarantine وretry وterminal receipt. |
| Rust PeerStore | crates/aeronyx-server/src/services/peer_store.rs | يحفظ bounded counters وpeer health وreadiness وproof classification. |
| Rust health API | crates/aeronyx-server/src/api/vpn_health.rs | ينشر health JSON محلياً يحفظ الخصوصية. |
| Rust reporter | crates/aeronyx-server/src/management/reporter.rs | ينقل aggregate status في heartbeat metadata. |
| Backend observability | privacy_network/api/vpn_observability.py | يعيد owner-scoped metadata إلى لوحة المشغل. |
| Nodeboard types | types/index.ts | يعرف أنواع blind relay وpeer health. |
| Nodeboard detail وi18n | app/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.
- حافظ على
payload_b64opaque في كل relay path. - أضف aggregate counters أو bounded reason buckets فقط.
- لا تربط counters مع routes أو endpoints أو users أو receivers أو message metadata.
- لا تدخل synthetic probes في totals للرسائل أو packets أو bytes المشفرة.
- حدث Rust tests وNodeboard types وكل اللغات عند تغير الدلالة.