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.
33% of that thing I talked about a while ago. Drakmor figured out part, so you all get it.
The readme is long and should answer most questions. Pre-compiled binaries on the release page.https://t.co/yeLSpfbRet
— Al Azif (@_AlAzif) April 11, 2026
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
NXDOMAINper 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.jsonsono 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:
| Campo | Tipo | Necessario | Descrizione |
|---|---|---|---|
zone | string | Sì | Dominio root (FQDN con punto finale, es. "example.com.") |
regex | boolean | No | Se true, zone è trattato come espressione regolare |
blocked | boolean | No | Se true, tutte le query per questa zona restituiscono NXDOMAIN |
records | array | No* | Record DNS per questa zona (* richiesto quando blocked è false) |
Ogni oggetto record nell’array records:
| Campo | Tipo | Richiesto | Descrizione |
|---|---|---|---|
name | string | sì | Nome relativo alla zona: "@" (root), "*" (wildcard), o sottodominio (es. "www", "ctest.cdn") |
regex | boolean | no | Se true, name viene trattato come espressione regolare |
type | string | sì | Tipo di record: A, AAAA, NS, CNAME, SOA, TXT, MX, SRV, PTR |
ttl | integer | sì | Time-to-live in secondi (0-604800) |
data | varies | sì | Dati del record (il formato dipende da type, vedere sotto) |
Formati dei dati per tipo di record:
| Type | Formato dati |
|---|---|
A | Stringa IPv4, "{{SELF}}", "{{BLOCKED}}", "{{FORWARD}}", o "{{FORWARD_ALL}}" |
AAAA | Stringa IPv6, "{{SELF}}", "{{BLOCKED}}", "{{FORWARD}}", o "{{FORWARD_ALL}}" |
NS | Stringa nome dominio |
CNAME | Stringa nome dominio |
PTR | Stringa nome dominio |
TXT | Array di stringhe |
SOA | Oggetto: { "primary", "admin", "serial", "refresh", "retry", "expire", "minimum" } |
MX | Oggetto: { "preference": int, "exchange": string } |
SRV | Oggetto: { "priority": int, "weight": int, "port": int, "target": string } |
Esempio:
{
"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:
| Valore | Significato |
|---|---|
"{{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)
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
| Opzione | Descrizione | Default |
|---|---|---|
--log-level | Livello minimo di log da emettere: none, fatal, error, warn, info, debug, trace, all | info |
--doh-only | Salta 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 uscita | generato automaticamente |
--cacert | Percorso verso un pacchetto di certificati CA PEM per la verifica TLS | impostazione predefinita del sistema |
--zones | Percorso del file zones.json | ./zones.json |
--dns-ip | Indirizzo IP a cui si collegano i listener UDP e TCP | 127.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 |
--help | Stampa le informazioni sull'utilizzo ed esci | N/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.
| Chiave | Tipo | Descrizione | Default |
|---|---|---|---|
log_level | string | Livello minimo di log da emettere: none, fatal, error, warn, info, debug, trace, all | info |
doh_only | boolean | Salta le ricerche nelle zone locali; inoltra tutto ai resolver del DoH. | false |
doh_resolvers | array | Elenco degli URL dei resolver DoH (sostituisce l'elenco predefinito quando impostato) | elenco integrato |
doh_timeout_ms | integer | Budget di timeout totale per tutti i tentativi del resolver DoH (100-60000 ms) | 15000 |
user_agent | string | Intestazione User-Agent personalizzata per le richieste DoH in uscita | generato automaticamente |
cacert_path | string | Percorso verso un pacchetto di certificati CA PEM per la verifica TLS | /data/chukei/cacert.pem |
zones_path | string | Percorso del file zones.json | /data/chukei/zones.json |
dns_ip | string | Indirizzo IP a cui si collegano i listener UDP e TCP | 127.0.0.1 |
dns_port | integer | Porta a cui si collegano i listener UDP e TCP (1-65535) | 53 |
redirect_ipv4 | string | Indirizzo IPv4 restituito per i record {{SELF}} | 127.0.0.1 |
redirect_ipv6 | string | Indirizzo IPv6 restituito per i record {{SELF}} | ::1 |
ttl | integer | TTL 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):
| Resolver | URL |
|---|---|
| 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 |
| Quad9 | https://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
| File | Responsabilità |
|---|---|
src/main-pc.cc | Punto di ingresso del PC: analisi degli argomenti della riga di comando, ciclo di eventi ASIO, gestione dei segnali |
src/main-ps.cc | Punto di ingresso PlayStation: carica /data/chukei/config.json, ciclo di eventi ASIO |
src/config.cc | Oggetto di Config globale con metodi setter validati |
src/config_parser.cc | Analisi dei file JSON zones; fallback predefinito in fase di compilazione |
src/dns_cache.cc | LRU / Cache con scadenza TTL e riscrittura TTL in caso di cache hit |
src/dns_over_https.cc | RFC 8484 Client DoH che utilizza libcurl con multiplexing HTTP/2 |
src/dns_packet*.cc | Classi DnsHeader, DnsQuestion, DnsAnswer, DnsRequestPacket (RFC 1035) |
src/dns_parser.cc | Analisi dei pacchetti DNS in formato wire; estrazione della parte di dominio |
src/dns_response.cc | Generatori di risposte per tutti i tipi di record e i codici di errore supportati |
src/local_dns.cc | Ricerca di zona con corrispondenza di sottodomini regex, helper IP inversi |
src/udp_server.cc | Ciclo di ricezione/invio UDP, inoltro query |
src/tcp_server.cc | Ciclo di accettazione/sessione TCP, framing con prefisso di lunghezza a 2 byte, inoltro delle query |
src/utils.cc | Conversione 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.
| Libreria | Scopo |
|---|---|
| ASIO | Rete asincrona autonoma (solo intestazione) |
| banned.h | Elenco delle funzioni non sicure raccomandate da SDL (solo intestazione) |
| curl | Trasporto HTTPS per DoH (compilato dal codice sorgente) |
| libLog | Registrazione (PC, PS4, PS5) |
| nlohmann/json | Analisi JSON (solo intestazione) |
| wolfSSL | Backend 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).
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).
# 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:
# 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.jsonall’avvio; le chiavi mancanti vengono sostituite con i valori precompilati. - Un file
/data/chukei/config.jsonmancante, illeggibile o non parsabile causa il caricamento di impostazioni predefinite sicure integrate nel sistema. - Un file
/data/chukei/zones.jsonmancante, illeggibile o non parsabile causa il caricamento di regole predefinite sicure integrate nel sistema. - Il hot-reload di
/data/chukei/config.jsone/o/data/chukei/zones.jsonnon è 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 --helpper 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. Questo articolo contiene link affiliati a Amazon. Se acquisti tramite questi link, potrei guadagnare una commissione senza costi aggiuntivi per te.🔥 Prodotti in promozione e articoli più venduti: PS4
Vedi altri prodotti PS4
Ultimo aggiornamento 2026-05-13 / Link di affiliazione / Immagini da Amazon Product Advertising API
![[Scena PS4/PS5] Rilasciato ftpsrv v0.20 con nuove opzioni CLI, rebuild SDK PS4/PS5 e shell UI installer su PS5](https://www.biteyourconsole.net/wp-content/uploads/FTPS5A-238x178.webp)

![[Scena PSP] Apollo Save Tool PSP si aggiorna alla versione 2.3.2: upload FTP multiplo, nuove lingue e Apollo Patch Engine 2.0.4](https://www.biteyourconsole.net/wp-content/uploads/ApolloSaveToolPSP-238x178.webp)
![[Scena PS4/PS5] Rilasciato ftpsrv v0.20 con nuove opzioni CLI, rebuild SDK PS4/PS5 e shell UI installer su PS5](https://www.biteyourconsole.net/wp-content/uploads/FTPS5A-100x75.webp)

![[Scena PSP] Apollo Save Tool PSP si aggiorna alla versione 2.3.2: upload FTP multiplo, nuove lingue e Apollo Patch Engine 2.0.4](https://www.biteyourconsole.net/wp-content/uploads/ApolloSaveToolPSP-100x75.webp)