1. Введение

CF-PROXY — это программный комплекс для маршрутизации трафика к заблокированным сервисам искусственного интеллекта и средствам разработки (Google Antigravity, OpenAI / ChatGPT, Grok, Claude) без необходимости поднимать глобальный VPN или устанавливать локальные корневые SSL-сертификаты (Root CA).

Решение объединяет локальный легковесный DNS-сервер dnsmasq и мост bridge.mjs на Node.js 22, который считывает доменное имя (SNI) из первого TLS-пакета и мультиплексирует данные через защищенный WebSocket-канал в сеть Cloudflare.

Ключевая идея

В отличие от Fiddler, Charles или mitmproxy, CF-PROXY не расшифровывает ваш трафик. Ваши API-ключи, токены авторизации и сессии остаются защищенными сквозным шифрованием (End-to-End TLS) между вашим устройством и конечным сервером.

2. Требования к системе

Для развертывания локального узла требуется минимальный стек:

  • Операционная система: macOS (Intel / Apple Silicon), Linux (x86_64 / arm64) или Windows 10/11 с WSL2 / Docker Desktop.
  • Docker и Docker Compose: установленный демон Docker Engine версии 20.10+ или Docker Desktop.
  • Свободные порты:
    • 127.0.0.1:53 (UDP/TCP) — для локального DNS-резолвера;
    • 127.0.0.1:443 (TCP) — для перехвата TLS-трафика на уровне SNI.

3. Настройка Cloudflare Worker

На удаленной стороне развертывается воркер Cloudflare, обрабатывающий входящие WebSocket-соединения с параметрами ?host=&port=443 и открывающий TCP-сокет к целевому серверу через connect() API Cloudflare Workers.

Конфигурация домена воркера

В вашем проекте в файле docker-compose.yml и bridge.mjs указывается имя вашего шлюза. Замените его на ваш личный домен, привязанный к Cloudflare:

JavaScript // bridge.mjs
// Замените на свой привязанный поддомен в Cloudflare (без https:// и слэшей)
const WORKER_HOST = "switcher.richcorp.online";

То же значение передается через переменные окружения в docker-compose.yml:

YAML // docker-compose.yml
environment:
  - WORKER_HOST=switcher.richcorp.online

4. Запуск через Docker Compose

Все файлы конфигурации (docker-compose.yml, bridge.mjs, dnsmasq.conf) размещаются в одном рабочем каталоге.

Команда запуска

Shell
# Запуск в фоновом режиме (detached mode)
docker compose up -d

Проверка статуса запущенных контейнеров

Shell
$ docker compose ps
NAME               IMAGE            COMMAND                  SERVICE      STATUS      PORTS
cf-proxy-bridge    node:22-alpine   "node /app/bridge.mjs"   sni-bridge   running     127.0.0.1:443->443/tcp
cf-proxy-dns       alpine:3.20      "sh -c 'apk add --n…"   dnsmasq      running     127.0.0.1:53->53/tcp, 127.0.0.1:53->53/udp

5. Настройка DNS в операционных системах

Чтобы система направляла запросы через наш селективный DNS, укажите 127.0.0.1 в качестве основного DNS-сервера сетевого интерфейса.

Настройка на macOS

Вы можете задать DNS через терминал с помощью утилиты networksetup (рекомендуется) либо вручную через системные настройки.

Bash // macOS CLI
# Установка 127.0.0.1 основным, и 1.1.1.1 резервным DNS для Wi-Fi
sudo networksetup -setdnsservers Wi-Fi 127.0.0.1 1.1.1.1

# Для сброса обратно на автоматический DNS от роутера:
sudo networksetup -setdnsservers Wi-Fi empty

Настройка на Linux (Ubuntu / Debian)

На современных дистрибутивах Linux часто запущен systemd-resolved. Для перенаправления DNS отредактируйте файл /etc/resolv.conf или настройте NetworkManager:

Bash // Linux
# Временное перенаправление (до перезагрузки NetworkManager)
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf

# Либо через nmcli для активного подключения:
nmcli connection modify "Ваше_Подключение" ipv4.dns "127.0.0.1"
nmcli connection up "Ваше_Подключение"

Настройка на Windows 10/11

В терминале PowerShell от имени Администратора:

PowerShell // Windows
# Задать 127.0.0.1 для интерфейса Wi-Fi
Set-DnsClientServerAddress -InterfaceAlias "Wi-Fi" -ServerAddresses ("127.0.0.1", "1.1.1.1")

# Сброс обратно в автоматический режим (DHCP)
Set-DnsClientServerAddress -InterfaceAlias "Wi-Fi" -ResetServerAddresses

6. Проверка и диагностика

Убедитесь, что селективный резолвинг и SNI-мост функционируют корректно:

1. Проверка DNS-ответа через dig или nslookup

Shell
$ dig @127.0.0.1 chatgpt.com +short
127.0.0.1

$ dig @127.0.0.1 google.com +short
142.250.74.206   # Обычный домен возвращает реальный внешний IP!

2. Проверка HTTPS-запроса через curl

Shell
$ curl -Iv https://chatgpt.com
* Connected to chatgpt.com (127.0.0.1) port 443
* ALPN: curl offers h2,http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* SSL certificate verify ok.
< HTTP/2 200

3. Просмотр логов моста в реальном времени

Shell
$ docker logs -f cf-proxy-bridge
SNI Tunnel Bridge active -> wss://switcher.richcorp.online
[CONNECT] chatgpt.com -> wss://switcher.richcorp.online
[CONNECT] daily-cloudcode-pa.googleapis.com -> wss://switcher.richcorp.online
[CONNECT] oaistatic.com -> wss://switcher.richcorp.online

7. Альтернатива: Nginx Reverse Proxy

В репозитории также доступен файл nginx.conf для сценариев, когда требуется расширенное буферирование ответов от воркера или терминирование SSL через собственные сертификаты.

Особенности режима Nginx

В режиме Nginx прокси передает оригинальный хост через HTTP-заголовок X-Target-Host: $host. Этот режим удобен при работе с бэкендами на Deno Deploy (*.deno.net) или Vercel Edge.

8. Устранение неполадок (Troubleshooting)

Порт 53 занят службой systemd-resolved (Linux)

Если при выполнении docker compose up возникает ошибка listen udp 127.0.0.1:53: bind: address already in use:

Bash
# Отключаем локальный стаб-листенер в systemd-resolved:
sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved

Ошибки SSL / CERT_AUTHORITY_INVALID в браузере

Если браузер ругается на сертификат при переходе на chatgpt.com, убедитесь, что контейнер cf-proxy-bridge запущен и доступен. При правильной работе мост bridge.mjs не подменяет сертификат — браузер видит оригинальный валидный сертификат от Cloudflare / OpenAI.

Кэш DNS в Chrome / Safari / Firefox

Браузеры могут сохранять старые IP-адреса в собственном DNS-кэше. Перейдите по адресу chrome://net-internals/#dns в Chrome/Edge и нажмите кнопку "Clear host cache".