
Um Relay de Domain-Fronting que roteia tráfego através do GAS (Google Apps Script) e o encaminha para o Cloudflare Workers. Projetado para contornar DPI.
Cliente -> Relay Local -> Google/CDN Front -> GAS (Google Apps Script) Relay -> Cloudflare Worker -> Saída
|
+-> Mostra www.google.com para o filtro DPI da rede
Cliente -> Relay Local -> Google/CDN Front -> GAS (Google Apps Script) Relay -> Cloudflare Worker -> Self-Hosted Upstream Forwarder -> Saída
|
+-> Mostra www.google.com para o filtro DPI da rede
No uso normal, o navegador envia o tráfego para o proxy em execução no seu computador.
O proxy envia esse tráfego através da infraestrutura do Google, de modo que a rede veja apenas um domínio permitido, como www.google.com.
Seu relay implantado então busca o site real através do cloudflare worker e envia a resposta de volta pelo mesmo caminho.
Isso significa que o filtro vê tráfego normal do Google, enquanto o destino real permanece oculto dentro da requisição do relay.
git clone https://github.com/denuitt1/mhr-cfw.git
cd mhr-cfw
pip install -r requirements.txt
Não consegue acessar o PyPI diretamente? Use este espelho:
pip install -r requirements.txt -i https://mirror-pypi.runflare.com/simple/ --trusted-host mirror-pypi.runflare.com
worker.js deste projeto (em deploy/), copie tudo e cole no editor do Apps Script.const WORKER_URL = "myworker.workers.dev";
Code.gs deste projeto (em deploy/), copie tudo e cole no editor do Apps Script.const AUTH_KEY = "sua-senha-secreta-aqui";
const WORKER_URL = "https://myworker.workers.dev";
⚠️ Lembre-se da senha que você definiu na etapa 3. Você usará a mesma senha no arquivo de configuração abaixo.
Execute o arquivo run.bat (no Windows) ou run.sh (no Linux) para iniciar o relay.
Se estiver executando pela primeira vez, será exibido um assistente de configuração onde você deve inserir o AUTH_KEY e o Deployment ID do Google Apps Script.
Você deverá ver uma mensagem dizendo que o proxy HTTP está rodando em 127.0.0.1:8085
Recomendamos usar o cliente v2rayN e configurar um proxy socks5.
Você também pode usar a extensão Chrome do FoxyProxy ou a extensão Firefox para usar este proxy no seu navegador.
Acesse ipleak.net no seu navegador. Você deverá ver seu endereço IP definido como o do cloudflare.
Quando você executa uma máquina virtual (VM), ela opera em um ambiente de rede isolado, separado do host. Por padrão, a VM não pode acessar diretamente serviços rodando em localhost da máquina host — incluindo este proxy.
Para corrigir isso, você precisa encontrar o IP do gateway que seu hipervisor atribui ao host e usá-lo no lugar de localhost ao configurar o proxy dentro da VM.
Exemplo: VirtualBox (modo NAT)
O host está sempre acessível de dentro da VM em 10.0.2.2. Configure o 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"
Para tornar isso permanente, adicione as linhas acima ao ~/.bashrc e execute source ~/.bashrc.
Como este proxy realiza inspeção SSL, você pode ver erros de certificado. Instale o ca.crt incluído para corrigi-los:
sudo cp ca.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates
Você pode usar este proxy no seu celular ou em qualquer outro dispositivo na mesma rede — sem software adicional.
1. Encontre o IP do seu host
# Windows
ipconfig
# Linux / macOS
ip addr
Procure o IP do adaptador conectado ao seu roteador (ex.: 192.168.1.8).
2. Redirecione a porta (apenas Windows, se o serviço estiver vinculado ao localhost)
Execute o CMD como Administrador:
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. Configure o proxy no seu celular
Conecte seu celular ao mesmo Wi-Fi e defina o proxy manualmente:
192.168.1.8)8085No Android: Configurações → Wi-Fi → Modificar → Proxy → Manual No iPhone: Ajustes → Wi-Fi → (rede) → Proxy HTTP → Manual
4. Instale o certificado CA
Transfira o ca.crt para o seu celular e então:
CAPTCHAs (Cloudflare Turnstile/desafio bot, reCAPTCHA, hCaptcha) vinculam tokens
ao IP que resolveu o desafio. Os Cloudflare Workers saem por diferentes
IPs de borda a cada requisição, então a verificação no site alvo falha mesmo quando você
resolve o desafio. Este complemento opcional permite que o Worker encaminhe todas as chamadas fetch()
através de um pequeno servidor Node que você executa em um VPS com IP estável — fornecendo
ao site alvo um endereço de saída consistente.
cf_clearance).Se você não enfrenta esses problemas, deixe desconfigurado — o Worker se comporta exatamente como antes.
Os Cloudflare Workers não expõem um IP de saída estável — fetch() sai por um pool rotativo de IPs de borda da Cloudflare, o que exatamente quebra tokens de CAPTCHA vinculados a IP. As opções de saída estática da Cloudflare (BYOIP, Egress Workers) são de nível Enterprise, então um pequeno VPS com IP estático é a solução prática. O forwarder é apenas um proxy fino que reemite o fetch() a partir de um endereço estável.
A implementação de referência é deploy/upstream-forwarder/upstream_forwarder.js.
Requer Node 18+ e nenhuma dependência. Execute-o por trás do Caddy ou nginx com TLS — o Worker rejeita URLs de forwarder sem HTTPS.
# No seu VPS (exemplo Ubuntu/Debian):
sudo apt install -y nodejs # deve ser 18+
export AUTH_KEY="alguma-string-longa-aleatoria-com-pelo-menos-32-caracteres"
export PORT=8787
node deploy/upstream-forwarder/upstream_forwarder.js
Coloque na frente do Caddy para TLS automático:
forwarder.example.com {
reverse_proxy 127.0.0.1:8787
}
Teste rápido:
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":{}}'
O corpo da resposta decodificado deve mostrar o IP do VPS.
No painel Cloudflare → seu Worker → Settings → Variables and Secrets:
Salve e reimplante o Worker.
Navegue até https://httpbin.org/ip através do proxy — você deve ver o IP do VPS, não o da Cloudflare. Em seguida, visite novamente um site protegido por CAPTCHA que não estava funcionando — o desafio agora deve ser validado.
O forwarder deve exigir autenticação. Sem
AUTH_KEYele se recusa a iniciar. Qualquer pessoa com a URL e a chave pode usá-lo como relay, portanto mantenha ambos em segredo.
Por padrão, toda requisição tratada pelo Worker passa pelo forwarder, então tráfego não relacionado também consome largura de banda do VPS. Para enviar apenas os sites que precisam de um IP de saída estável através do VPS, liste-os em forwarder_hosts no config.json — mesma sintaxe do bypass_hosts (nome do host exato ou .suffix). Qualquer item não correspondido recai no fetch() direto no Worker.
{
...
"forwarder_hosts": [
"example.com",
".cf-protected-suffix"
]
...
}
Deixe a lista vazia (ou remova a chave) para manter o comportamento histórico de "encaminhar tudo".
MHR-CFW é fornecido apenas para fins educacionais, de teste e pesquisa.
| Nome | Tipo | Valor |
|---|
UPSTREAM_FORWARDER_URL | Secret | https://forwarder.example.com/fwd |
UPSTREAM_AUTH_KEY | Secret | o mesmo AUTH_KEY que você definiu no VPS |
UPSTREAM_FAIL_MODE | Variable | closed (padrão) — retorna 502 em caso de falha no forwarder. Use open para cair no fetch direto. |
UPSTREAM_TIMEOUT_MS | Variable (opcional) | padrão 25000 |