Proteção contra abuso do relay cego

AeroNyx20 de junho de 20266 min de leitura47 visualizações

Como nós AeroNyx contêm replay, loops, excesso de requisições e peers falhos sem ler o cifrado, com evidência operacional segura para privacidade.

Blind Relay Abuse Guard é o limite de segurança do encaminhamento criptografado descentralizado AeroNyx. Ele contém relays abusivos ou instáveis sem analisar ciphertext, criar histórico persistente de rotas ou transformar o operador em observador de tráfego.

Status e escopo

A proteção está implementada em Rust e os resultados agregados aparecem no health metadata e Nodeboard. A função é conter e produzir evidência honesta: trabalho opaco aceito, protegido, degradado ou stale, nunca seu conteúdo.

ControleEstado
Blind payload forwardingImplementado
Signed freshness and replay suppressionImplementado
Previous-hop rate limiting and quarantineImplementado
Privacy-safe runtime evidenceImplementado
Nodeboard operator visibilityImplementado
Plaintext or payload inspectionProibido
User, route, or social-graph analyticsProibido

Invariante do nó cego

Um relay pode autenticar metadata de rota, aplicar política limitada, encaminhar envelope opaco e retornar receipt assinado pelo terminal. Não pode inspecionar ou inferir payload nem revelar metadata capaz de reconstruir rota, identidade ou relação social.

  • mensagens em claro, packet payloads, mídia ou MemChain em claro
  • DNS, destinos, domínios, URLs ou histórico
  • route IDs, caminhos completos, endpoint URLs ou IP do cliente
  • chaves públicas completas, receiver, message IDs ou grafo social
  • chaves privadas, voucher secrets, tráfego wallet-level ou material de descriptografia

Pipeline de admissão

Cada request passa por controles limitados antes de consumir capacidade. A ordem abaixo é conceitual; decisões usam somente routing metadata assinada e estado agregado local, nunca conteúdo descriptografado.

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

Proteção de replay e freshness

A supressão de replay é local, curta e limitada em capacidade. Timestamps assinados rejeitam frames antigos ou muito futuros. A tabela contém defaults atuais de main, não promessas permanentes; mudanças exigem tests e documentação.

Constante de runtimeDefault atual
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

Limite e quarentena do salto anterior

O rate limit é por identidade assinada do salto anterior. Mais de 120 requests em 60 segundos inicia cinco minutos de quarentena local. Um score separado inicia a mesma quarentena após 12 falhas hostis em cinco minutos.

text
invalid_previous_hop | invalid_signature | self_loop | route_loop | ttl_exhausted

Somente razões adversariais contam no score. Timeouts, ACK perdido e retry de rota duplicada não penalizam peer saudável. Buckets são limitados e estado ocioso expira, impedindo um grafo persistente.

Idempotência e tentativas

Route ID repetido na janela recebe sucesso idempotente: registra replay drop agregado, sem entregar ou encaminhar novamente. Falhas transitórias têm até três tentativas com jitter limitado; falhas permanentes não são repetidas.

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

Contadores agregados de runtime

Rust expõe contadores cumulativos grossos e timestamps de freshness nos dois caminhos seguintes. São evidência operacional do nó, não logs de mensagens, analytics faturáveis ou prova de conversa específica.

text
system_stats.discovery_status.peer_store.runtime.blind_relay
system_stats.discovery_status.peer_store.peer_health_summary
Grupo de contadoresCampos
Entrada e resultadoreceived, terminal, forwarded, rejected
Validação e proteçãoinvalid_signature, envelope_too_large, ttl_exhausted, no_route, invalid_endpoint, loop_detected, replay_dropped, timestamp_rejected, rate_limited, quarantined, quarantine_started
Transporte e retrybackpressure_dropped, forward_failed, retry_attempted, retry_succeeded, retry_exhausted
Evidência sintéticaprobe_attempted, probe_succeeded, probe_failed, two_hop_probe_attempted, two_hop_probe_succeeded, two_hop_probe_failed
Entrega real e freshnessverified_client_onion_deliveries, last_verified_client_onion_delivery_at, last_accepted_at, last_event_at

Semântica de qualidade da evidência

O resumo separa trabalho opaco aceito, probes sintéticos, proofs sintéticos two-hop e receipts de client assinados pelo terminal. real_relay_ready exige receipt recente, autenticado, originado por client e assinado pelo terminal esperado. Evidência sintética nunca é tráfego App/usuário.

statusSignificado
idleAinda não há evidência relay ou probe.
observingHá evidência parcial, readiness não estabelecida.
staleEvidência anterior não está fresca.
readyTrabalho aceito ou proof fresco sem alerta ativo de transporte.
protectingProteções estão ativas e o relay segue operacional.
degradedFalhas de forwarding ou probe exigem investigação.
attentionBackpressure ou retries esgotados exigem ação imediata.

proof_scope separa client_message_delivery, relay_acceptance, message_delivery, control_plane, single_hop_control_plane, attempted e none. Totais históricos são cumulativos; readiness exige evidência fresca e considera falhas ativas.

Saúde de peers com privacidade

peer_health_summary usa identificador abreviado e buckets grossos para isolar peer falho ou em quarentena sem expor relações de tráfego. É diagnóstico control-plane com limite de privacidade explícito.

Permitido:

  • node_id_prefix abreviado
  • health e descriptor state grossos
  • buckets de freshness de gossip e route success
  • contagens agregadas de sucesso e falha
  • contagens agregadas loop, replay, rate-limit e quarantine
  • tempo restante de quarentena e razões limitadas

Não permitido:

  • chaves públicas completas
  • route IDs ou listas de endpoints
  • blobs cifrados ou payload hashes
  • message IDs ou identidade receiver
  • IP do cliente, destinos ou DNS
  • grafo social ou relações de comunicação

Fluxo do operador

Abra Nodeboard, selecione o nó e veja Discovery e Security / Relay Protection. Interprete tendências somente com saúde, alcance, pressão de fila e freshness de proofs assinados.

  1. Confirme freshness dos descriptors e bootstrap recovery.
  2. Compare accepted_total, accepted_percent e idade do último accepted antes de declarar ready.
  3. Separe real_relay_ready de synthetic readiness; só o primeiro prova receipt terminal autenticado originado por client.
  4. Em protecting, degraded ou attention, examine buckets agregados e transporte sem pedir logs de usuário.

Mapa do código

Os caminhos são relativos ao repositório para continuar válidos após mover hosts. Backend e Nodeboard são separados e consomem apenas metadata owner-scoped segura para privacidade.

CamadaCaminho do repositórioPapel
API relay Rustcrates/aeronyx-server/src/api/chat_peer.rsAutentica envelopes e aplica loop, replay, freshness, rate, quarantine, retry e terminal receipt.
Rust PeerStorecrates/aeronyx-server/src/services/peer_store.rsArmazena contadores limitados, peer health, readiness e classificação de proofs.
API health Rustcrates/aeronyx-server/src/api/vpn_health.rsPublica health JSON local e privado.
Reporter Rustcrates/aeronyx-server/src/management/reporter.rsTransporta status agregado no heartbeat.
Observabilidade backendprivacy_network/api/vpn_observability.pyRetorna metadata owner-scoped ao console.
Tipos Nodeboardtypes/index.tsDefine tipos blind relay e peer health.
Detalhe e i18n Nodeboardapp/dashboard/nodes/[id]/page.tsx and lib/i18n/index.tsExibe Security / Relay Protection com texto localizado de privacidade.

Base para roteamento multi-hop

Multi-hop exige resistência a replay, contenção de loops, retries limitados, quarentena e evidência não confundida com tráfego real. Esta proteção sustenta criptografia em camadas e diversidade de rotas sem enfraquecer o invariante cego.

Regras de desenvolvimento

Trate todo campo novo como revisão de privacidade. Uma métrica deve responder sobre confiabilidade do nó sem identificar payload, emissor, receptor, rota, endpoint ou conversa.

  1. Manter payload_b64 opaco em todo caminho relay.
  2. Adicionar somente contadores agregados ou reason buckets limitados.
  3. Nunca juntar contadores com rotas, endpoints, usuários, receivers ou metadata de mensagem.
  4. Excluir probes sintéticos de totais de mensagens, pacotes e bytes criptografados.
  5. Atualizar tests Rust, tipos Nodeboard e todos os idiomas quando a semântica mudar.

Descoberta de nós e entrega criptografada verificável