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:
// Замените на свой привязанный поддомен в Cloudflare (без https:// и слэшей)
const WORKER_HOST = "switcher.richcorp.online";
То же значение передается через переменные окружения в docker-compose.yml:
environment:
- WORKER_HOST=switcher.richcorp.online
4. Запуск через Docker Compose
Все файлы конфигурации (docker-compose.yml, bridge.mjs, dnsmasq.conf) размещаются в одном рабочем каталоге.
Команда запуска
# Запуск в фоновом режиме (detached mode)
docker compose up -d
Проверка статуса запущенных контейнеров
$ 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 (рекомендуется) либо вручную через системные настройки.
# Установка 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:
# Временное перенаправление (до перезагрузки 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 от имени Администратора:
# Задать 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
$ 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
$ 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. Просмотр логов моста в реальном времени
$ 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 прокси передает оригинальный хост через 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:
# Отключаем локальный стаб-листенер в 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".