Что под капотом: слои и решения
Лендинг — это статика за nginx, процентов пять работы. Остальное живёт за кнопкой «Подключить». Расскажу про слои и почему они такие.
Сразу оговорюсь: точные параметры — порты, домен-донор, ключи, флаги — выкладывать не буду. Принципы интереснее рецепта, а рецепт пусть остаётся при мне.
Несколько транспортов на узле
Узла два, Европа и США. На каждом один движок поднимает сразу несколько транспортов параллельно, и один ключ работает во всех. Зачем несколько? Сети разные. Дома один режим, в публичном вайфае другой, на сотовой третий. Клиент пробует и встаёт на том, что в этой сети работает ровнее. Переключений пользователь не замечает.
Reality на настоящем TLS
WireGuard стоял первым: быстрый, ядро держит его само. Но мне хотелось разобраться с транспортом, который строится на настоящем TLS, а не на собственной криптографии. Так появился Reality.
Reality начинается как обычный визит на крупный HTTPS-сайт: настоящее TLS-рукопожатие с настоящим чужим сервером. Дальше наш поток получает только клиент с правильным ключом. Никакой самодельной криптографии — внутри стандартный, много раз проверенный TLS. Какой именно сайт-донор использую — оставлю при себе.
Мобильный интернет
TCP на сотовой ведёт себя глупо. Потерялся пакет — алгоритм решает, что сеть забита, ужимает окно и восстанавливается полминуты. Для мобильных взял Hysteria2: он работает поверх UDP с агрессивным управлением потоком, не путает потери с перегрузкой и продавливает данные дальше. На проводе незаметно, на рваном 4G разница в разы.
Раздача доступа
Конфиги руками не раздаю с тех пор, как их стало больше десятка. Отдельный сервис выдаёт каждому персональную ссылку-подписку, приложение само за ней ходит и подтягивает свежий список узлов. Добавил сервер — он появился у всех, никто ничего не переустанавливает.
Тут был мой любимый косяк. Первая версия сервиса обрабатывала запросы по одному. Клиент с медленным каналом открыл соединение и завис, а вместе с ним зависла выдача у всех разом. Лечится обработкой каждого соединения отдельно и жёстким таймаутом. Очевидно — после того как наступило.
Бот, веб и одна база
Управление в двух местах: телеграм-бот и веб-кабинет. Оба пишут в одну базу. Чтобы они не дрались за файл, база в режиме, где чтение не блокирует запись. В настройках это одна строчка. В жизни — отдельная история про два процесса и один файл.
Мониторинг
Раз в минуту система стучится в каждый узел и смотрит нагрузку. Замолчал — вижу раньше, чем напишет пользователь. Скучный слой, который и отделяет «работает у меня» от «работает».
Это обзор сверху. Дальше буду нырять в слои по одному — но про принципы и решения, а не про готовый конфиг под копипасту.
Нейтрино