GooseRelayVPN
- title
- GooseRelayVPN
- type
- toolbox
- summary
- SOCKS5-VPN, туннелирующий сырой TCP через реле на Google Apps Script на небольшой выходной VPS с AES-256-GCM, скрывая открытый текст от Google
- tags
- go, proxy, vpn, censorship-circumvention, serverless-relay-transport, google-apps-script, domain-fronting, iran, watchlist
- language
- Go
- license
- MIT
- created
- 2026-04-30
- updated
- 2026-07-29
- lang
- ru
- translation_of
- goose-relay-vpn
- source_updated
- 2026-07-29
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
GooseRelayVPN - третий проект в небольшом, но любопытном семействе "Apps Script как реле для обхода блокировок", после masterhttprelayvpn (оригинал на Python) и masterhttprelayvpn-rust (порт на Rust). Автор Kianmhz прямо ссылается на оригинал: "This project was inspired by the idea in the main repository: MasterHttpRelayVPN".
Главное отличие - в архитектуре. Если инструменты линейки MasterHttpRelay проксируют HTTPS-трафик запросов и ответов через Apps Script с локальным MITM CA, то GooseRelay туннелирует сырой TCP сквозным образом с AES-256-GCM, для чего требуется небольшой выходной VPS-сервер. Google видит только непрозрачные зашифрованные байты; ключ AES никогда не попадает к Google. Ценой отказа от свойства "серверы не нужны", присущего MasterHttpRelay, становится возможность передавать SSH, IMAP, произвольные бинарные протоколы - всё, что способен обернуть SOCKS5.
Архитектура
Browser/App
-> SOCKS5 (127.0.0.1:1080)
-> AES-256-GCM raw-TCP frames
-> HTTPS to Google edge IP (SNI=www.google.com, Host=script.google.com)
-> Apps Script doPost() (~30-line dumb forwarder, never sees plaintext)
-> Your VPS :8443/tunnel (decrypts, demuxes by session_id, dials target)
<- Same path in reverse via long-polling
Пять компонентов:
- Локальный SOCKS5-слушатель (
goose-client) на машине пользователя, порт 1080 - Кодировщик фреймов AES-256-GCM, оборачивающий каждый байт TCP перед отправкой
- HTTPS-соединение с domain fronting к edge-IP Google (по умолчанию 216.239.38.120) с
SNI=www.google.com,Host=script.google.com- см. domain-fronting - Веб-приложение Google Apps Script (
Code.gs, ~30 строк) - простой пересыльщик, отправляющий зашифрованный пакет на VPS через POST - Выходной сервер на VPS (
goose-server) на Linux-машине за $4/мес - расшифровывает, мультиплексирует по ID сессии и выполняет фактическийnet.Dial
Два бинарника на Go: goose-client (запускается для работы) и goose-server (настраивается один раз на VPS, systemd или NSSM). Apps Script развёртывается через "Deploy as web app, anyone can access", а полученный ID развёртывания вставляется в конфиг клиента.
Формат протокола
- Фрейм:
session_id (16) || seq (u64 BE) || flags (u8) || target_len (u8) || target || payload_len (u32 BE) || payload - Пакетная упаковка:
nonce (12) || AES-GCM(u16 frame_count || [u32 frame_len || frame_bytes]…)- один nonce + тег на всё тело HTTP, а не на каждый фрейм - Тело HTTP:
base64(nonce || ciphertext+tag)(base64, чтобы данные не повреждались при текстовой передаче черезContentServiceв Apps Script)
Аутентификацией служит сам тег AES-GCM - никаких общих паролей или сертификатов. Фреймы, на которых Open() завершается ошибкой, молча отбрасываются. 64-символьный hex-ключ tunnel_key выступает единственным якорем доверия и должен побайтово совпадать на клиенте и сервере.
Масштабирование через несколько развёртываний
На каждое развёртывание Apps Script действует лимит ~20 000 вызовов в день. Клиент поддерживает список ID развёртываний:
"script_keys": ["FIRST_ID", "SECOND_ID", "THIRD_ID"]
Запросы распределяются по развёртываниям методом round-robin. При сбоях работает чёрный список с экспоненциальной задержкой (3с, 6с, 12с, ... до ~48с). Переключение при сбое происходит внутри того же опроса, поэтому временная ошибка квоты не приводит к потере трафика. В README не рекомендуется использовать больше 3-4 ID развёртываний: каждый добавляет 3 параллельных воркера опроса, и дальнейшее увеличение лишь создаёт лишнюю нагрузку без прироста скорости.
Затраты на настройку
- Разовые: VPS на Linux за $4/мес, 64-символьный AES-ключ из
scripts/gen-key.sh, два бинарника на Go, один проект Apps Script + создание развёртывания (Deploy -> New deployment) с типом "Web app" и доступом "Anyone" - Постоянные: запуск
./goose-clientи перенаправление браузера на SOCKS5127.0.0.1:1080
На этапе Apps Script есть привычная для Google ловушка: любое изменение в Code.gs требует создания нового развёртывания (Deploy -> New deployment, простого сохранения недостаточно), а новый ID развёртывания нужно скопировать в конфиг клиента.
Сравнение компромиссов
| GooseRelay | MasterHttpRelay (Python/Rust) | VLESS через xray-tutorial | |
|---|---|---|---|
| Стоимость серверов | Требуется VPS за $4/мес | Бесплатно (только Google) | Минимум $5/мес за VPS |
| Протокол | Любой TCP через SOCKS5 | Только HTTPS (MITM CA локально) | Любой TCP через VLESS |
| Настройка | VPS + Apps Script + ключ AES | Apps Script + ключ авторизации | VPS + домен + TLS + конфиг Xray |
| Пропускная способность | Квота Apps Script * число развёртываний | Квота Apps Script * число развёртываний | Пропускная способность VPS |
| Наблюдаемость | Apps Script не видит открытый текст | Apps Script видит весь HTTP-запрос | Прямая видимость |
| Устойчивость к DPI в Иране | TLS к Google + сырой TCP - надёжно | TLS к Google + HTTP - риск сигнатурного анализа | Прямой VPS = риск сигнатурного анализа |
Сквозной AES - это существенное улучшение безопасности по сравнению с MasterHttpRelay: логи запросов у Google открыты, а риски нарушения условий использования Google и санкций против Ирана для авторов оригинала вполне реальны. В GooseRelay в логах Google остаётся только зашифрованный текст AES; наружу утекают лишь число запросов, размеры тел и тайминги. Достаточно мотивированный противник всё ещё может восстановить данные, но это качественно отличается от логирования открытых адресов назначения.
Необходимость VPS - ощутимая плата. Вся привлекательность MasterHttpRelay заключалась в принципе "бесплатно, без серверов". GooseRelay от него отказывается, поскольку заявленная цель проекта - туннелирование сырого TCP (SSH, IMAP и чего угодно ещё), для чего фундаментально необходим настоящий net.Dial где-то на сервере.
Watchlist
Проект добавлен в watchlist - один автор (kianmhz), свежий репозиторий, узкая ориентация на персоязычный рынок. Повторная проверка 2026-07-29: сторонние контрибьюторы, клиенты под Android/iOS (пока только CLI), аудит обёртки AES, доказательства устойчивости модели угроз против иранского аналога ТСПУ (см. tspu о российском аналоге).
Связанные страницы
- masterhttprelayvpn - оригинальный проект на Python, указанный как источник вдохновения
- masterhttprelayvpn-rust - порт на Rust с UI на egui и поддержкой Android VpnService
- serverless-relay-transport - более широкий паттерн, частью которого является проект
- domain-fronting - базовая техника обхода блокировок
- xray-tutorial, 3x-ui, mihomo, xkeen - семейство решений на базе VLESS (альтернатива при наличии собственного домена и отсутствии необходимости маскироваться за Google)
Репозиторий: https://github.com/Kianmhz/GooseRelayVPN