
Un Domain-Fronting Relay che instrada il traffico attraverso GAS (Google Apps Script) e lo inoltra a Cloudflare Workers. Progettato per aggirare il DPI.
Client -> Local Relay -> Google/CDN Front -> GAS (Google Apps Script) Relay -> Cloudflare Worker -> Exit
|
+-> Mostra www.google.com al filtro DPI di rete
Client -> Local Relay -> Google/CDN Front -> GAS (Google Apps Script) Relay -> Cloudflare Worker -> Self-Hosted Upstream Forwarder -> Exit
|
+-> Mostra www.google.com al filtro DPI di rete
In condizioni normali, il browser invia il traffico al proxy in esecuzione sul tuo computer.
Il proxy invia quel traffico attraverso l'infrastruttura di Google, così la rete vede solo un dominio consentito come www.google.com.
Il relay da te distribuito recupera quindi il sito web reale tramite il cloudflare worker e invia la risposta indietro attraverso lo stesso percorso.
Ciò significa che il filtro vede traffico normale verso Google, mentre la destinazione effettiva rimane nascosta all'interno della richiesta del relay.
git clone https://github.com/denuitt1/mhr-cfw.git
cd mhr-cfw
pip install -r requirements.txt
Non riesci a raggiungere PyPI direttamente? Usa questo mirror invece:
pip install -r requirements.txt -i https://mirror-pypi.runflare.com/simple/ --trusted-host mirror-pypi.runflare.com
worker.js da questo progetto (sotto deploy/), copia tutto, e incollalo nell'editor del Worker.const WORKER_URL = "myworker.workers.dev";
Code.gs da questo progetto (sotto deploy/), copia tutto, e incollalo nell'editor di Apps Script.const AUTH_KEY = "your-secret-password-here";
const WORKER_URL = "https://myworker.workers.dev";
⚠️ Ricorda la password che hai impostato al passo 3. Userai la stessa password nel file di configurazione qui sotto.
Clicca sul file run.bat (su Windows) o run.sh (su Linux) per avviare il relay.
Se lo esegui per la prima volta, verrà visualizzata una procedura guidata in cui dovrai inserire AUTH_KEY e l'ID di Deployment di Google Apps Script.
Dovresti vedere un messaggio che dice che il proxy HTTP è in esecuzione su 127.0.0.1:8085
Raccomandiamo l'uso del client v2rayN e la configurazione di un proxy socks5.
Puoi anche usare l'estensione FoxyProxy per Chrome o Firefox per utilizzare questo proxy nel tuo browser.
Apri ipleak.net nel tuo browser, dovresti vedere il tuo indirizzo IP impostato come quello di Cloudflare.
Quando esegui una macchina virtuale (VM), essa opera in un ambiente di rete isolato dall'host. Per impostazione predefinita, la VM non può accedere direttamente ai servizi in esecuzione su localhost dell'host — incluso questo proxy.
Per risolvere, devi trovare l'IP del gateway che il tuo hypervisor assegna all'host, quindi usarlo al posto di localhost quando configuri il proxy all'interno della VM.
Esempio: VirtualBox (modalità NAT)
L'host è sempre raggiungibile dall'interno della VM all'indirizzo 10.0.2.2. Imposta il proxy:
export http_proxy="http://10.0.2.2:8085"
export https_proxy="http://10.0.2.2:8085"
export all_proxy="socks5://10.0.2.2:8085"
Per renderlo permanente, aggiungi le righe sopra a ~/.bashrc ed esegui source ~/.bashrc.
Poiché questo proxy esegue l'ispezione SSL, potresti vedere errori di certificato. Installa il ca.crt incluso per risolverli:
sudo cp ca.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates
Puoi usare questo proxy sul tuo telefono o su qualsiasi altro dispositivo sulla stessa rete — nessun software aggiuntivo necessario.
1. Trova l'IP del tuo host
# Windows
ipconfig
# Linux / macOS
ip addr
Cerca l'IP dell'adattatore collegato al tuo router (es. 192.168.1.8).
2. Inoltra la porta (solo Windows, se il servizio è legato a localhost)
Esegui CMD come amministratore:
netsh interface portproxy add v4tov4 listenaddress=192.168.1.8 listenport=8085 connectaddress=127.0.0.1 connectport=8085
netsh advfirewall firewall add rule name="Proxy 8085" dir=in action=allow protocol=TCP localport=8085
3. Configura il proxy sul tuo telefono
Collega il telefono allo stesso Wi-Fi, poi imposta il proxy manualmente:
192.168.1.8)8085Su Android: Impostazioni → Wi-Fi → Modifica → Proxy → Manuale Su iPhone: Impostazioni → Wi-Fi → (rete) → Proxy HTTP → Manuale
4. Installa il certificato CA
Trasferisci ca.crt sul tuo telefono, poi:
I CAPTCHA (Cloudflare Turnstile/sfida bot, reCAPTCHA, hCaptcha) legano i token all'IP che ha risolto la sfida. I Cloudflare Worker escono attraverso IP edge diversi per ogni richiesta, quindi la verifica sul sito di destinazione fallisce anche quando risolvi la sfida. Questo componente aggiuntivo opzionale permette al Worker di inoltrare tutte le chiamate fetch() attraverso un piccolo server Node che esegui su un VPS con IP stabile — fornendo al sito di destinazione un unico indirizzo di uscita coerente.
cf_clearance).Se non incontri questi problemi, lascialo non configurato — il Worker si comporta esattamente come prima.
I Cloudflare Worker non espongono un IP di uscita stabile — fetch() esce attraverso un pool rotante di IP edge di Cloudflare, che è esattamente ciò che rompe i token CAPTCHA legati all'IP. Le opzioni di uscita statica di Cloudflare (BYOIP, Egress Workers) sono di livello Enterprise, quindi un piccolo VPS con IP statico è la soluzione pratica. Il forwarder è solo un proxy sottile che riemette fetch() da un indirizzo stabile.
L'implementazione di riferimento è deploy/upstream-forwarder/upstream_forwarder.js. Richiede Node 18+ e nessuna dipendenza. Eseguilo dietro Caddy o nginx con TLS — il Worker rifiuta URL di forwarder non HTTPS.
# Sul tuo VPS (esempio Ubuntu/Debian):
sudo apt install -y nodejs # deve essere 18+
export AUTH_KEY="some-long-random-string-at-least-32-chars"
export PORT=8787
node deploy/upstream-forwarder/upstream_forwarder.js
Mettilo davanti a Caddy per TLS automatico:
forwarder.example.com {
reverse_proxy 127.0.0.1:8787
}
Test rapido:
curl -X POST https://forwarder.example.com/fwd \
-H "x-upstream-auth: $AUTH_KEY" \
-H "content-type: application/json" \
-d '{"u":"https://httpbin.org/ip","m":"GET","h":{}}'
Il corpo della risposta decodificata dovrebbe mostrare l'IP del VPS.
Nel pannello Cloudflare → il tuo Worker → Impostazioni → Variabili e Segreti:
Salva e ridistribuisci il Worker.
Naviga su https://httpbin.org/ip attraverso il proxy — dovresti vedere l'IP del VPS, non quello di Cloudflare. Poi rivisita un sito protetto da CAPTCHA che non funzionava — la sfida dovrebbe ora essere convalidata.
Il forwarder deve richiedere autenticazione. Senza
AUTH_KEYsi rifiuta di avviarsi. Chiunque abbia l'URL e la chiave può usarlo come relay, quindi mantieni entrambi segreti.
Per impostazione predefinita, ogni richiesta gestita dal Worker passa attraverso il forwarder, quindi anche il traffico non correlato consuma larghezza di banda del VPS. Per inviare solo i siti che necessitano di un IP di uscita stabile attraverso il VPS, elencali in forwarder_hosts in config.json — stessa sintassi di bypass_hosts (hostname esatto o .suffix). Tutto ciò che non corrisponde ripiega su fetch() diretto sul Worker.
{
...
"forwarder_hosts": [
"example.com",
".cf-protected-suffix"
]
...
}
Lascia la lista vuota (o rimuovi la chiave) per mantenere il comportamento storico di 'inoltra tutto'.
MHR-CFW è fornito solo per scopi educativi, di test e di ricerca.
| Nome | Tipo | Valore |
|---|
UPSTREAM_FORWARDER_URL | Secret | https://forwarder.example.com/fwd |
UPSTREAM_AUTH_KEY | Secret | lo stesso AUTH_KEY impostato sul VPS |
UPSTREAM_FAIL_MODE | Variable | closed (default) — restituisce 502 in caso di errore del forwarder. Usa open per ripiegare su fetch diretto. |
UPSTREAM_TIMEOUT_MS | Variable (opzionale) | default 25000 |