
Ретранслятор с использованием Domain-Fronting, который маршрутизирует трафик через GAS (Google Apps Script) и перенаправляет его на Cloudflare Workers. Разработан для обхода DPI.
Client -> Local Relay -> Google/CDN Front -> GAS (Google Apps Script) Relay -> Cloudflare Worker -> Exit
|
+-> Shows www.google.com to network DPI filter
Client -> Local Relay -> Google/CDN Front -> GAS (Google Apps Script) Relay -> Cloudflare Worker -> Self-Hosted Upstream Forwarder -> Exit
|
+-> Shows www.google.com to network DPI filter
В обычном использовании браузер отправляет трафик на прокси, запущенный на вашем компьютере.
Прокси пропускает этот трафик через инфраструктуру Google, чтобы сеть видела только разрешённый домен, например www.google.com.
Ваш развёрнутый ретранслятор затем загружает реальный сайт через Cloudflare Worker и отправляет ответ обратно по тому же пути.
Это означает, что фильтр видит обычный трафик Google, в то время как фактический адрес назначения остаётся скрытым внутри запроса ретранслятора.
git clone https://github.com/denuitt1/mhr-cfw.git
cd mhr-cfw
pip install -r requirements.txt
Не удаётся связаться с PyPI напрямую? Используйте это зеркало:
pip install -r requirements.txt -i https://mirror-pypi.runflare.com/simple/ --trusted-host mirror-pypi.runflare.com
worker.js из этого проекта (в папке deploy/), скопируйте всё и вставьте в редактор Apps Script.const WORKER_URL = "myworker.workers.dev";
Code.gs из этого проекта (в папке deploy/), скопируйте всё и вставьте в редактор Apps Script.const AUTH_KEY = "your-secret-password-here";
const WORKER_URL = "https://myworker.workers.dev";
⚠️ Запомните пароль, который вы задали в шаге 3. Вы будете использовать тот же пароль в файле конфигурации ниже.
Запустите файл run.bat (в Windows) или run.sh (в Linux), чтобы запустить ретранслятор.
При первом запуске появится мастер настройки, в котором нужно ввести AUTH_KEY и Deployment ID Google Apps Script.
Вы должны увидеть сообщение о том, что HTTP-прокси запущен на 127.0.0.1:8085.
Рекомендуем использовать клиент v2rayN и настроить socks5 прокси.
Также можно использовать FoxyProxy с расширением для Chrome или расширением для Firefox, чтобы использовать этот прокси в браузере.
Откройте ipleak.net в браузере — вы должны увидеть, что ваш IP-адрес установлен как IP Cloudflare.
Когда вы запускаете виртуальную машину (ВМ), она работает в изолированной сетевой среде, отдельно от основной системы. По умолчанию ВМ не может напрямую обращаться к службам, работающим на localhost основной системы — в том числе к этому прокси.
Чтобы это исправить, нужно найти шлюзовой IP, который гипервизор назначает основной системе, и использовать его вместо localhost при настройке прокси внутри ВМ.
Пример: VirtualBox (режим NAT)
Основная система всегда доступна из ВМ по адресу 10.0.2.2. Установите прокси:
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"
Чтобы сделать это постоянным, добавьте эти строки в ~/.bashrc и выполните source ~/.bashrc.
Поскольку данный прокси выполняет проверку SSL, могут возникать ошибки сертификата. Установите прилагаемый ca.crt для их устранения:
sudo cp ca.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates
Вы можете использовать этот прокси на телефоне или любом другом устройстве в той же сети — никакого дополнительного ПО не требуется.
1. Найдите IP основной системы
# Windows
ipconfig
# Linux / macOS
ip addr
Найдите IP-адрес адаптера, подключённого к вашему роутеру (например, 192.168.1.8).
2. Перенаправьте порт (только Windows, если служба привязана к localhost)
Запустите CMD от имени администратора:
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. Настройте прокси на телефоне
Подключите телефон к той же сети Wi-Fi, затем вручную укажите прокси:
192.168.1.8)8085На Android: Настройки → Wi-Fi → Изменить → Прокси → Вручную
На iPhone: Настройки → Wi-Fi → (сеть) → HTTP-прокси → Вручную
4. Установите CA-сертификат
Перенесите ca.crt на телефон, затем:
CAPTCHA (Cloudflare Turnstile/бот-челлендж, reCAPTCHA, hCaptcha) привязывают токены
к IP, решившему задачу. Cloudflare Workers выходят через разные
граничные IP при каждом запросе, поэтому проверка на целевом сайте не удаётся, даже если вы решили
задачу. Этот дополнительный компонент позволяет Worker перенаправлять все вызовы fetch()
через небольшой Node-сервер, который вы запускаете на VPS со стабильным IP — тем самым
целевой сайт будет видеть один постоянный адрес выхода.
cf_clearance).Если вы не сталкиваетесь с этими проблемами, можете оставить всё как есть — Worker будет работать как прежде.
Cloudflare Workers не предоставляют стабильного исходящего IP — fetch() выходит через вращающийся пул граничных IP Cloudflare, что как раз и нарушает работу IP-привязанных токенов CAPTCHA. Статические варианты исходящего трафика Cloudflare (BYOIP, Egress Workers) доступны только на корпоративном тарифе, поэтому небольшой VPS со статическим IP — это практический обходной путь. Форвардер — это просто тонкий прокси, который повторно выполняет fetch() со стабильного адреса.
Эталонная реализация: deploy/upstream-forwarder/upstream_forwarder.js.
Требуется Node 18+ и никаких зависимостей. Запускайте за Caddy или nginx с TLS — Worker отвергает URL форвардера без HTTPS.
# На вашем VPS (пример для Ubuntu/Debian):
sudo apt install -y nodejs # должна быть версия 18+
export AUTH_KEY="some-long-random-string-at-least-32-chars"
export PORT=8787
node deploy/upstream-forwarder/upstream_forwarder.js
Фронтируйте с Caddy для автоматического TLS:
forwarder.example.com {
reverse_proxy 127.0.0.1:8787
}
Быстрая проверка:
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":{}}'
В декодированном ответе должно отображаться IP VPS.
В панели Cloudflare → ваш Worker → Settings → Variables and Secrets:
Сохраните и повторно разверните Worker.
Откройте https://httpbin.org/ip через прокси — вы должны увидеть IP вашего VPS, а не Cloudflare. Затем вернитесь на сайт, защищённый CAPTCHA, который не работал — теперь задание должно пройти проверку.
Форвардер должен требовать аутентификации. Без
AUTH_KEYон отказывается запускаться. Любой, у кого есть URL и ключ, может использовать его как ретранслятор, поэтому держите их в секрете.
По умолчанию каждый запрос, обрабатываемый Worker, проходит через форвардер, поэтому посторонний трафик также расходует пропускную способность VPS. Чтобы отправлять через VPS только те сайты, которым нужен стабильный выходной IP, перечислите их в forwarder_hosts в config.json — синтаксис такой же, как у bypass_hosts (точное имя хоста или .суффикс). Всё, что не подходит под условие, будет напрямую загружаться через fetch() на Worker.
{
...
"forwarder_hosts": [
"example.com",
".cf-protected-suffix"
]
...
}
Оставьте список пустым (или удалите ключ), чтобы сохранить поведение «всё через форвардер».
MHR-CFW предоставляется только в образовательных, тестовых и исследовательских целях.
| Имя | Тип | Значение |
|---|
UPSTREAM_FORWARDER_URL | Secret | https://forwarder.example.com/fwd |
UPSTREAM_AUTH_KEY | Secret | тот же AUTH_KEY, который вы задали на VPS |
UPSTREAM_FAIL_MODE | Variable | closed (по умолчанию) — возвращать 502 при сбое форвардера. Используйте open, чтобы переходить к прямому fetch. |
UPSTREAM_TIMEOUT_MS | Variable (опционально) | по умолчанию 25000 |