Home Homebrew Rilasciato Chūkei DNS v0.9.0: il DNS locale di Al-Azif con DoH, MitM,...

Rilasciato Chūkei DNS v0.9.0: il DNS locale di Al-Azif con DoH, MitM, cache avanzata e blocco aggiornamenti su console PS4 e PS5

371
0

Chūkei DNS è il nuovo progetto sviluppato dal developer Al-Azif, pensato come un DNS relay locale estremamente leggero ma allo stesso tempo potente, progettato per offrire maggiore controllo, privacy e sicurezza soprattutto nel contesto delle console PS4 e PS5 modificate.

Scritto in C++17, questo strumento rappresenta un’evoluzione moderna dei classici DNS personalizzati utilizzati negli anni nella scena homebrew, ma con un approccio più flessibile e completamente self-hosted.

Il funzionamento è relativamente semplice: tutte le richieste DNS della console vengono intercettate localmente. Quando una richiesta corrisponde a una regola definita dall’utente, il sistema risponde direttamente, permettendo di bloccare o reindirizzare determinati domini.

Se invece non esiste una regola specifica, la richiesta viene inoltrata in modo sicuro tramite DNS-over-HTTPS verso resolver pubblici come Cloudflare, Google o Quad9. In questo modo si ottiene una navigazione completamente funzionante ma filtrata, con un controllo totale sui domini considerati sensibili.

Questo approccio risulta particolarmente utile nel contesto del jailbreak su PS4 e PS5. Consente infatti di impedire alla console di contattare i server ufficiali per gli aggiornamenti di sistema, ridurre la telemetria inviata a Sony e allo stesso tempo mantenere l’accesso a internet attivo e sicuro.

Inoltre, grazie al supporto per il reindirizzamento, è possibile deviare specifici domini verso indirizzi locali oppure bloccarli completamente, rendendo il sistema altamente personalizzabile.

Dal punto di vista tecnico, Chūkei DNS supporta sia UDP che TCP sulla porta 53, integra una cache in memoria che rispetta i TTL e offre compatibilità con numerosi tipi di record DNS.

Le regole sono definite tramite espressioni regolari all’interno del file zones.json, permettendo una gestione avanzata e precisa del traffico. Il sistema è conforme agli standard RFC e include risposte corrette come NXDOMAIN o SERVFAIL, garantendo affidabilità nel comportamento.

Caratteristiche

  • Relay DNS-over-HTTPS (DoH) – Inoltra le richieste non corrispondenti verso resolver upstream tramite DoH secondo RFC 8484 (HTTP POST o GET).
  • Trasporto UDP e TCP – Ascolta sia su UDP che TCP sulla stessa porta secondo RFC 1035 §4.2; TCP supporta più query in pipeline sulla stessa connessione.
  • Filtro dei domini – Restituisce NXDOMAIN per i domini contrassegnati come {{BLOCKED}}.
  • Hijacking / reindirizzamento domini – Restituisce record A/AAAA personalizzati, incluso {{SELF}} (l’IP di reindirizzamento del server stesso).
  • Inoltro selettivo – {{FORWARD}} salta il DNS locale per sottodomini specifici; {{FORWARD_ALL}} include anche i sotto-sottodomini.
  • Matching delle zone tramite regex – Le chiavi dei sottodomini in zones.json sono trattate come espressioni regolari.
  • Cache DNS in memoria – Memorizza le risposte DoH upstream, rispetta i TTL e riscrive automaticamente TTL e ID delle transazioni nei cache hit.
  • Failover multi-resolver – Mescola e riprova tra più resolver DoH configurati in caso di errore.
  • Tipi di record supportati – A, AAAA, NS, CNAME, SOA, PTR, MX, TXT, SRV.
  • Risposte di errore conformi RFC – FORMERR, SERVFAIL, NXDOMAIN, NOTIMP, REFUSED.
  • Supporto EDNS0 (record OPT) – I record OPT vengono riconosciuti, ma è implementato solo COOKIE.
  • Spegnimento controllato – Gestisce correttamente i segnali SIGINT / SIGTERM.
  • Recupero automatico dei socket – I socket UDP e TCP vengono riaperti automaticamente dopo errori critici (es. descriptor non valido) con tentativi progressivi.
  • Timeout DoH configurabile – Un timeout globale su tutti i tentativi verso i resolver evita latenze elevate nei casi peggiori.
  • Zone predefinite integrate – Utilizza regole di fallback integrate se zones.json è assente o non valido.

Configurazione

File delle zone (zones.json)

Il server carica il file zones.json dalla directory di lavoro all’avvio. Se il file è mancante o non valido, utilizza i valori predefiniti interni compilati. È disponibile uno schema JSON in zones-schema.jsonc.

Il file contiene un array di primo livello chiamato zones. Ogni elemento è un oggetto zona con i seguenti campi:

CampoTipoNecessarioDescrizione
zonestringDominio root (FQDN con punto finale, es. "example.com.")
regexbooleanNoSe true, zone è trattato come espressione regolare
blockedbooleanNoSe true, tutte le query per questa zona restituiscono NXDOMAIN
recordsarrayNo*Record DNS per questa zona (* richiesto quando blocked è false)

Ogni oggetto record nell’array records:

CampoTipoRichiestoDescrizione
namestringNome relativo alla zona: "@" (root), "*" (wildcard), o sottodominio (es. "www", "ctest.cdn")
regexbooleannoSe true, name viene trattato come espressione regolare
typestringTipo di record: A, AAAA, NS, CNAME, SOA, TXT, MX, SRV, PTR
ttlintegerTime-to-live in secondi (0-604800)
datavariesDati del record (il formato dipende da type, vedere sotto)

Formati dei dati per tipo di record:

TypeFormato dati
AStringa IPv4, "{{SELF}}", "{{BLOCKED}}", "{{FORWARD}}", o "{{FORWARD_ALL}}"
AAAAStringa IPv6, "{{SELF}}", "{{BLOCKED}}", "{{FORWARD}}", o "{{FORWARD_ALL}}"
NSStringa nome dominio
CNAMEStringa nome dominio
PTRStringa nome dominio
TXTArray di stringhe
SOAOggetto: { "primary", "admin", "serial", "refresh", "retry", "expire", "minimum" }
MXOggetto: { "preference": int, "exchange": string }
SRVOggetto: { "priority": int, "weight": int, "port": int, "target": string }

Esempio:

json

{
  "zones": [
    {
      "zone": "example.com.",
      "records": [
        { "name": "@", "type": "A", "ttl": 300, "data": "192.0.2.1" },
        { "name": "*", "type": "A", "ttl": 300, "data": "{{BLOCKED}}" },
        { "name": "www", "type": "A", "ttl": 300, "data": "{{SELF}}" },
        { "name": "api", "type": "A", "ttl": 300, "data": "{{FORWARD}}" },
        { "name": "cdn", "type": "A", "ttl": 300, "data": "{{FORWARD_ALL}}" },
        { "name": "cdn", "type": "CNAME", "ttl": 300, "data": "cdn.example.net." }
      ]
    },
    {
      "zone": "ads.example.net.",
      "blocked": true
    },
    {
      "zone": "playstation.net.",
      "records": [
        { "name": "d(jp|us|eu)01\\.(ps4|ps5)\\.update", "regex": true, "type": "A", "ttl": 300, "data": "{{SELF}}" }
      ]
    }
  ]
}

Valori speciali:

ValoreSignificato
"{{BLOCKED}}"A livello di zona: restituisce NXDOMAIN per l’intero dominio. A livello record (A/AAAA): sinkhole verso 0.0.0.0 / ::
"{{SELF}}"Reindirizza all’IP di redirect configurato del server (default 127.0.0.1 / ::1)
"{{FORWARD}}"Salta il DNS locale e inoltra la query al resolver DoH upstream
"{{FORWARD_ALL}}"Come {{FORWARD}}, ma inoltra anche tutti i sotto-sottodomini del nome corrispondente. Ad esempio, "api" con {{FORWARD_ALL}} inoltra api.zone, test.api.zone, ecc.. - ma non different.zone o il dominio root nudo

Nota: Il wildcard "*" corrisponde solo ai sottodomini – non corrisponde mai al dominio root nudo ("@"). Ad esempio, se è definito solo "*" e non "@", le query per il dominio root verranno inoltrate al DoH.

Opzioni CLI (solo PC)

bash

Uso: ./build/bin/main [options]

Opzioni:
--log-level <level> Livello di log: none, fatal, error, warn, info, debug, trace, all (default: info)
--doh-only Abilita modalità solo DoH (nessuna risposta da zone locali)
--doh-resolver <url> URL resolver DoH (può essere specificato più volte)
--doh-timeout <ms> Timeout totale per la risoluzione DoH (default: 15000)
--user-agent <string> Stringa User-Agent per richieste DoH
--cacert <path> Percorso bundle certificati CA PEM per verifica TLS
--zones <path> Percorso file zones.json (default: ./zones.json)
--dns-ip <ip> Indirizzo IP server DNS (default: 127.0.0.1)
--dns-port <port> Porta server DNS (default: 53, range: 1-65535)
--redirect-ipv4 <ip> Indirizzo IPv4 per redirect (default: 127.0.0.1)
--redirect-ipv6 <ip> Indirizzo IPv6 per redirect (default: ::1)
--ttl <seconds> TTL predefinito per risposte DNS (default: 3600, range: 0-604800)
--help Mostra messaggio di aiuto
OpzioneDescrizioneDefault
--log-level Livello minimo di log da emettere: none, fatal, error, warn, info, debug, trace, allinfo
--doh-onlySalta le ricerche nelle zone locali; inoltra tutto ai resolver del DoH.off
--doh-resolver Aggiunge un URL di risoluzione DoH (ripetibile; sostituisce l'elenco predefinito quando utilizzato)elenco integrato
--doh-timeout Budget di timeout totale per tutti i tentativi del resolver DoH (100-60000 ms)15000
--user-agent Intestazione User-Agent personalizzata per le richieste DoH in uscitagenerato automaticamente
--cacert Percorso verso un pacchetto di certificati CA PEM per la verifica TLSimpostazione predefinita del sistema
--zones Percorso del file zones.json./zones.json
--dns-ip Indirizzo IP a cui si collegano i listener UDP e TCP127.0.0.1
--dns-port Porta a cui si collegano i listener UDP e TCP (1-65535)53
--redirect-ipv4 Indirizzo IPv4 restituito per i record {{SELF}}127.0.0.1
--redirect-ipv6 Indirizzo IPv6 restituito per i record {{SELF}}::1
--ttl TTL predefinito per le risposte DNS (0-604800)3600
--helpStampa le informazioni sull'utilizzo ed esciN/A

Configurazione PlayStation®4/PlayStation®5 (config.json)

Sulle piattaforme console, le impostazioni sono caricate da un file JSON in /data/chukei/config.json. Tutte le chiavi sono opzionali – quelle mancanti usano i valori predefiniti interni. Se il file non esiste, il server parte con quelle di default.

Un esempio viene fornito nel file config.example.json.

ChiaveTipoDescrizioneDefault
log_levelstringLivello minimo di log da emettere: none, fatal, error, warn, info, debug, trace, allinfo
doh_onlybooleanSalta le ricerche nelle zone locali; inoltra tutto ai resolver del DoH.false
doh_resolversarrayElenco degli URL dei resolver DoH (sostituisce l'elenco predefinito quando impostato)elenco integrato
doh_timeout_msintegerBudget di timeout totale per tutti i tentativi del resolver DoH (100-60000 ms)15000
user_agentstringIntestazione User-Agent personalizzata per le richieste DoH in uscitagenerato automaticamente
cacert_pathstringPercorso verso un pacchetto di certificati CA PEM per la verifica TLS/data/chukei/cacert.pem
zones_pathstringPercorso del file zones.json/data/chukei/zones.json
dns_ipstringIndirizzo IP a cui si collegano i listener UDP e TCP127.0.0.1
dns_portintegerPorta a cui si collegano i listener UDP e TCP (1-65535)53
redirect_ipv4stringIndirizzo IPv4 restituito per i record {{SELF}}127.0.0.1
redirect_ipv6stringIndirizzo IPv6 restituito per i record {{SELF}}::1
ttlintegerTTL predefinito per le risposte DNS (0-604800)3600

Token template User-Agent: {{APP_VERSION}}, {{APP_DESCRIPTION}}, {{APP_HOMEPAGE}}, {{CONSOLE}}, {{FIRMWARE_VERSION}}

Esempi default: chukei/{{APP_VERSION}} ({{CONSOLE}}) su desktop, oppure chukei/{{APP_VERSION}} ({{CONSOLE}} {{FIRMWARE_VERSION}}) su console.

Layout file console:


/data/chukei/
├── config.json # Configurazione runtime (opzionale)
├── zones.json # Regole zone
└── cacert.pem # Certificati CA per TLS

Nota: Se non viene fornito un certificato CA esterno, le build console usano un bundle Mozilla integrato a compile time.

Resolver DoH predefiniti

I seguenti resolver sono integrati (usati se non configurati custom):

ResolverURL
Cloudflare (primario)https://1.1.1.1/dns-query
Cloudflare (secondario)https://1.0.0.1/dns-query
Google (principale)https://8.8.8.8/dns-query
Google (secondario)https://8.8.4.4/dns-query
Quad9https://9.9.9.9/dns-query

Di default sono attivi Cloudflare primario e secondario. I resolver vengono mescolati per ogni richiesta e si passa automaticamente al successivo in caso di errore.

Architettura


Client
│ Query DNS (formato wire UDP o TCP)
▼
UdpServer / TcpServer - Listener ASIO su IP:porta configurati
│ (TCP usa prefisso lunghezza 2 byte per RFC 1035 §4.2.2)
│
├── DnsParser - Analizza pacchetto DNS; estrae dominio, sottodominio, tipo record
│
├── LocalDns - Confronta con regole zones.json (regex)
│ restituisce risposte A/AAAA/CNAME/MX/TXT/SRV/NS/SOA/PTR o
│ NXDOMAIN/BLOCKED
│
├── DnsCache - Cache TTL in memoria per (dominio, qtype) riscrive ID e TTL
│
└── DnsOverHttps - Client DoH libcurl (RFC 8484), failover automatico

Struttura sorgente

FileResponsabilità
src/main-pc.ccPunto di ingresso del PC: analisi degli argomenti della riga di comando, ciclo di eventi ASIO, gestione dei segnali
src/main-ps.ccPunto di ingresso PlayStation: carica /data/chukei/config.json, ciclo di eventi ASIO
src/config.ccOggetto di Config globale con metodi setter validati
src/config_parser.ccAnalisi dei file JSON zones; fallback predefinito in fase di compilazione
src/dns_cache.ccLRU / Cache con scadenza TTL e riscrittura TTL in caso di cache hit
src/dns_over_https.ccRFC 8484 Client DoH che utilizza libcurl con multiplexing HTTP/2
src/dns_packet*.ccClassi DnsHeader, DnsQuestion, DnsAnswer, DnsRequestPacket (RFC 1035)
src/dns_parser.ccAnalisi dei pacchetti DNS in formato wire; estrazione della parte di dominio
src/dns_response.ccGeneratori di risposte per tutti i tipi di record e i codici di errore supportati
src/local_dns.ccRicerca di zona con corrispondenza di sottodomini regex, helper IP inversi
src/udp_server.ccCiclo di ricezione/invio UDP, inoltro query
src/tcp_server.ccCiclo di accettazione/sessione TCP, framing con prefisso di lunghezza a 2 byte, inoltro delle query
src/utils.ccConversione binaria IPv4/IPv6, helper endian, rilevamento della versione del sistema operativo

Dipendenze esterne (in external/)

Tutte le dipendenze sono completamente incluse nel pacchetto, senza bisogno di librerie di sistema. Ciò significa che il progetto si compila correttamente per le toolchain di PS4/PS5 senza la necessità di installare alcun pacchetto host.

LibreriaScopo
ASIORete asincrona autonoma (solo intestazione)
banned.hElenco delle funzioni non sicure raccomandate da SDL (solo intestazione)
curlTrasporto HTTPS per DoH (compilato dal codice sorgente)
libLogRegistrazione (PC, PS4, PS5)
nlohmann/jsonAnalisi JSON (solo intestazione)
wolfSSLBackend TLS per curl (compilato dal codice sorgente)

Flusso risoluzione query

  • Riceve il pacchetto (UDP) oppure legge un messaggio con lunghezza prefissata (TCP).
  • Analizza e valida il pacchetto DNS.
  • Rifiuta opcode non standard con NOTIMP (RFC 1035 §4.1.1).
  • Se non è in modalità solo DoH → controlla le zone locali (zones.json).
  • Se non trovato localmente → controlla la cache DNS in memoria.
  • Se non presente in cache → inoltra al resolver DoH (con failover automatico).
  • Memorizza in cache la risposta DoH riuscita.
  • Se il DoH fallisce → restituisce SERVFAIL.
  • Se non c’è alcuna corrispondenza → restituisce NXDOMAIN.

Testing

Test unitari

Compilato con -DBUILD_TESTS=ON. Utilizza un framework di test personalizzato minimale (nessuna dipendenza esterna, compatibile con PS4/PS5/PC).

bash

cmake -DBUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Debug .
make -j$(nproc)
./build/bin/run_tests

Test di integrazione

Uno script Python 3 (tests/integration_test.py) esegue test end-to-end del binario del server. Avvia automaticamente il server su una porta alta (15353), invia query DNS raw sia via UDP che TCP, verifica le risposte e arresta il server al termine.

Prerequisiti: Il progetto deve essere compilato prima dell’esecuzione (lo script richiede che build/bin/main e zones.json esistano).

bash

# Eseguire i test di integrazione (avvio e stop automatico del server)
python3 tests/integration_test.py

Lo script gestisce l’intero ciclo di vita del server: non è necessario avviarlo o fermarlo manualmente. Al termine (o in caso di errore) invia un segnale SIGTERM al processo del server. Se il server non si chiude entro 5 secondi, viene terminato forzatamente.

Se invece è necessario eseguire il server manualmente per test specifici:

bash

# Avvia il server su una porta non privilegiata
./build/bin/main --dns-port 15353 &
SERVER_PID=$!

# ... esegui i test ...

# Ferma il server al termine
kill "$SERVER_PID"

Note

  • Non è in alcun modo destinato all’uso in produzione. È pensato per scenari locali a singolo client, non come server DNS completo.
  • Il formato del file zones può cambiare in qualsiasi momento.
  • Le build per console caricano le impostazioni da /data/chukei/config.json all’avvio; le chiavi mancanti vengono sostituite con i valori precompilati.
  • Un file /data/chukei/config.json mancante, illeggibile o non parsabile causa il caricamento di impostazioni predefinite sicure integrate nel sistema.
  • Un file /data/chukei/zones.json mancante, illeggibile o non parsabile causa il caricamento di regole predefinite sicure integrate nel sistema.
  • Il hot-reload di /data/chukei/config.json e/o /data/chukei/zones.json non è supportato; per applicare le modifiche è necessario riavviare il server. L’avvio di una nuova istanza di Chūkei DNS termina automaticamente eventuali istanze già in esecuzione e ricarica configurazione e zone.
  • Le build per PC accettano flag da riga di comando per tutte le impostazioni principali (eseguire ./build/bin/main --help per l’elenco completo).
  • Le risposte NXDOMAIN per domini bloccati includono un record SOA sintetico nella sezione authority quando il nome della zona è noto. Il fallback NXDOMAIN (senza contesto di zona) non include volutamente SOA poiché il server non è autoritativo per domini sconosciuti.

Download: Chūkei DNS v0.9.0 (PS4)

Download: Chūkei DNS v0.9.0 (PS5)

Download: Source code Chūkei DNS v0.9.0

Alcune parti di questo articolo sono state generate con l’aiuto dell’intelligenza artificiale.

🔥 Prodotti in promozione e articoli più venduti: PS4

Vedi altri prodotti PS4

Questo articolo contiene link affiliati a Amazon. Se acquisti tramite questi link, potrei guadagnare una commissione senza costi aggiuntivi per te.

Ultimo aggiornamento 2026-05-13 / Link di affiliazione / Immagini da Amazon Product Advertising API

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui
Captcha verification failed!
Punteggio utente captcha non riuscito. Ci contatti per favore!

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.