VPN-TIME: уход с OpenVPN на Xray, multi-hop на iptables и биллинг по минутам
PrimeCoder · 2026 · формат: tech
Разбор новинки простыми словами: что это, кому нужно и брать ли.
Показывает рабочий паттерн для микро-SaaS: биллинг по факту активности через Xray API и multi-hop на голом Netfilter вместо прокси-узла — это снижает стоимость инфраструктуры и число компонентов, которые нужно поддерживать.
Связанные услуги: каталог, AI Boost Team, стать клиентом.
Событие, которое легко пропустить
Разработчик под ником DVoropaev2 ведёт VPN-сервис VPN-TIME. Опубликовал вторую статью о проекте: что изменилось с момента запуска. Охват — 949 читателей, пять минут чтения, уровень сложности автор обозначил как простой.
Формально это отчёт о развитии маленького платного сервиса. Фактически — рабочий паттерн для любого микро-SaaS, где деньги берут за инфраструктуру. Три узла этого паттерна: биллинг по минутам через Xray API вместо готовой панели, multi-hop на голом Netfilter вместо второго прокси-узла, плюс побочная линия с Telegram-прокси, которая появилась как реакция на блокировки начала 2026 года.
Разбираем по частям. Что там реально сделано, что можно тащить к себе, а где пока тестовая зона.
Модель: часы, которые не сгорают
Напомню базу, без неё остальное не читается. В VPN-TIME нет месячной подписки. Пользователь покупает часы работы и расходует их только тогда, когда подключён.
Пользователь покупает часы работы VPN, которые не сгорают и расходуются только во время подключения.
Цена зависит от объёма: 10 часов — 4 рубля за час, 1000 часов — 1 рубль за час. После покупки баланс живёт в минутах. Подключился на семь минут — списали семь, с погрешностью ±1 минута.
Автор называет две группы, на которых модель держится. Первая — редкие: пара подключений в неделю или в месяц. Вторая — те, кому стабильный VPN нужен постоянно, но кто держит этот сервис резервным на случай, когда основной лёг. Обе группы не хотят платить за месяц, которым не пользуются.
Для владельца микро-SaaS тут спрятана неочевидная экономия. Подписка тянет за собой целый обоз: рекуррентные списания, письма про неудавшийся платёж, ручные возвраты, разбор «почему списали, я же не пользовался». Модель «предоплаченные минуты» вырезает половину этого списка. Вы не воюете с оттоком в конце месяца, потому что конца месяца нет.
Вторая сторона медали: предоплата — это обязательство. Деньги взяты вперёд, часы лежат на балансе, и вы обязаны их отдать. Для сервиса на одном авторе это ответственность, которую стоит считать заранее.
Биллинг, который считает трафик, а не сессии
Самое очевидное изменение после первой публикации — переезд с OpenVPN на Xray. Готовые панели не подошли: биллинг специфический, пришлось работать с Xray напрямую через API.
Логика простая до неприличия. Раз в минуту скрипт вытягивает через Xray API статистику по каждому пользователю: uplink и downlink. Сравнивает с предыдущими значениями. Если за минуту трафика набежало больше заданного порога — пользователь считается активным, с баланса уходит одна минута. Если трафика не было или он ниже порога — не уходит ничего.
Что это меняет по сравнению с привычным подходом. Классический биллинг считает факт открытой сессии: подключился — таймер пошёл. Здесь таймер привязан к движению данных. Разница видна на клиенте, который забыл отключиться и уехал на дачу: сессия висит, трафика нет, минуты не тают.
Инженерно это ещё и способ не строить лишнего. Не нужен свой RADIUS, не нужна биллинговая надстройка панели, не нужна синхронизация между панелью и балансом. Есть скрипт, есть API, есть порог.
Подвох тоже на поверхности. Порог — эвристика, его надо подбирать под реальный трафик: фоновые обновления, keepalive, служебные запросы. Скрипт раз в минуту даёт задержку — отсюда и ±1 минута, которую автор честно закладывает в погрешность. Для сервиса с ценой в 1–4 рубля за час такая точность нормальна. Для корпоративного биллинга с аудитом она бы не прошла.
Multi-hop: цепочка, где промежуточному узлу нечего расшифровывать
Дальше самое интересное с точки зрения инфраструктуры. У многих VPN-сервисов цепочка выглядит так: клиент приходит на Xray-сервер в России, тот перекидывает трафик на Xray-сервер в Европе. Два прокси, два конфига, два набора сертификатов, две поверхности для обновлений.
Автор посчитал, что Xray на промежуточном узле — лишняя сущность. Промежуточному серверу не нужно понимать трафик. Ему нужно принять соединение на 443-м порту, подменить адрес назначения на IP зарубежной ноды, подменить адрес источника на собственный и развернуть преобразования обратно для ответных пакетов.
Дальше история почти анекдотическая: он собирался написать для этого небольшую программу, а знающие люди объяснили, что описанное называется DNAT + SNAT и живёт в Linux со времён, когда никакого Xray не было. Всю работу делает Netfilter.
В результате на промежуточном сервере не требуется ни Xray, ни TLS-сертификатов, ни отдельного прокси. Вся переадресация выполняется средствами ядра Linux.
Схема в четыре шага. Клиент стучится на 443-й порт промежуточного сервера. Правило в PREROUTING меняет адрес назначения на IP зарубежного Xray-сервера. Правило в POSTROUTING через MASQUERADE меняет адрес источника на IP промежуточного — иначе ответный трафик пойдёт мимо. Conntrack запоминает соединение и сам разворачивает адреса для ответных пакетов, цепочка FORWARD пропускает established-соединения.
Ключевой момент, который чаще всего путают: TLS-сессия устанавливается между клиентом и конечным зарубежным сервером. Промежуточный узел в этой сессии не участник. Он гоняет пакеты на уровне ядра и не видит содержимого.
Практический выигрыш считайте сами. Минус пакет Xray на промежуточной машине. Минус сертификаты и их продление. Минус конфигурация, которую надо держать в синхроне. Минус один компонент, который может упасть в три часа ночи. Железо под такой узел нужно скромнее — он не терминирует TLS и не разбирает протокол.
Статус: внедрено недавно, работает в тестовом режиме на швейцарском направлении. Автор смотрит, как покажет себя в эксплуатации. Это честная оговорка, и она важна — тест на одном направлении не равен проду на десяти.
Android TV: пять символов вместо простыни URL
Отдельный кусок, который к биллингу отношения не имеет, зато хорошо показывает, где микро-SaaS теряет клиентов. Настройка VPN на телевизоре — это ввод длинного URL пультом. Кто пробовал, тот знает цену вопроса.
Решение построено на Android TV API приложения HAPP. При первом запуске HAPP показывает на экране одноразовый код из пяти символов — это UID телевизора, не путать с VLESS UUID. Пользователь жмёт в боте кнопку «Подключить Android TV» и отправляет код боту. Дальше бот POST-запросом шлёт URL подписки на адрес сервиса с UID в пути. Сервис находит среди своих клиентов нужный телевизор и передаёт ему URL. HAPP подписку применяет.
Почему не QR-код, хотя он есть в некоторых клиентах. У сервиса правило «1 подписка = 1 устройство». QR требует сначала активировать подписку на телефоне, а потом переносить — правило ломается.
Побочный эффект приятнее основного: телевизор можно настроить удалённо. Клиент хочет подключить технику родственников в другом городе — просит открыть HAPP, получает код на экране, отправляет боту. Личное присутствие не нужно. Для сервиса, который живёт на одного человека, это минус звонок в поддержку.
Telegram, RIPE Atlas и свой инструмент инвентаризации
Блокировки Telegram начала 2026 года для этого сервиса были не абстрактной новостью. Telegram-бот — единственный канал, через который пользователь пополняет баланс и получает подписку. Заблокировали мессенджер — сервис встал.
Первый ответ на это — не технический. Тем, у кого оплаченное время кончилось, начали автоматически начислять 10 бесплатных минут в день. Этого хватает, чтобы поднять VPN, зайти в Telegram и заплатить. Механизм работает до сих пор.
Второй ответ — инфраструктурный. Развёрнуто несколько бесплатных MTProxy на базе Telemt. Плюс появился новый тип прокси — WEB Proxy, который в отличие от классического MTProxy гонит трафик в настоящем HTTPS-соединении и маскируется под обычное посещение сайтов. Такой прокси у сервиса тоже поднят, подключиться можно бесплатно, в списке на сайте он называется «Экспериментальный».
Дальше — мониторинг. Кроме стандартного набора (трафик, CPU, ОЗУ) автор использует RIPE Atlas: глобальную сеть точек замера. Через её API автоматизируются проверки доступности нод из российских сетей. Логика правильная: вопрос не «жив ли сервер», а «виден ли сервер оттуда, откуда приходят клиенты». Это разные вопросы, и второй задают реже.
Последний пункт — собственный open-source проект SINVER для инвентаризации, пока на стадии MVP. Когда узлов становится больше двух, а конфиги живут в голове, инвентарь перестаёт быть роскошью.
Кому это применимо
- Микро-SaaS с оплатой по факту. Биллинг по трафику через API — готовый шаблон. Считать можно не только минуты VPN: рендеры, прогоны моделей, минуты транскодинга.
- Сервисы, где промежуточный узел нужен только для географии. Если задача узла — принять соединение в нужной стране и перекинуть дальше, Xray на нём не нужен. DNAT + SNAT закрывает сценарий на уровне ядра.
- Проекты, где Telegram-бот — единственный канал. Схема с бесплатными минутами на нулевом балансе и прокси в обход блокировок — не изящество, а страховка от потери доступа к собственной платежной кнопке.
- Тем, у кого уже есть панель и всё работает. Не трогайте. Свой биллинг через API оправдан, когда готовая панель не умеет вашу модель. Иначе вы платите временем за то, что уже куплено.
- Корпоративному VPN с SSO и аудитом. Не сюда. Здесь нет ни ролей, ни журналов доступа в привычном виде, а точность ±1 минута для внутреннего биллинга не аргумент.
Ограничения и подвох
Multi-hop на Netfilter в тестовом режиме и на одном направлении. Это не приговор, но и не готовое решение под копирку: правила придётся согласовывать с остальным файрволом, делать постоянными после перезагрузки и проверять на своём трафике.
Ошибка в цепочке FORWARD — не «не работает», а дыра. Схема из четырёх правил выглядит как магия, но требует понимания, что именно вы разрешаете. Копировать команды из статьи в прод без разбора — плохая идея.
Порог активности и ±1 минута. Для цены в 1–4 рубля за час нормально. Для чего-то дороже — нужен разбор, что считать активностью.
10 бесплатных минут в день — компенсация блокировок, а не SLA. Пользователь, у которого не работает Telegram, всё равно останется без доступа к управлению балансом.
Правило «1 подписка = 1 устройство» отсекает часть аудитории. Это осознанный выбор автора, но для сервиса с другим позиционированием он не подходит.
WEB Proxy помечен как экспериментальный — относиться к нему как к основе инфраструктуры рано. SINVER на стадии MVP, то есть инвентарь пока держится на энтузиазме. И общий фон: один автор, один сервис. Паттерны отсюда переносятся, зависимости — нет.
Брать или подождать: вердикт за 30 секунд
Брать сейчас. Две вещи. Первая — биллинг по факту трафика через Xray API: снимать статистику раз в минуту, сравнивать с предыдущим значением, списывать при превышении порога. Вторая — multi-hop на DNAT + SNAT + conntrack: если промежуточному узлу не нужно расшифровывать трафик, Xray и сертификаты на нём лишние.
Подождать. WEB Proxy — экспериментальный статус, нет статистики эксплуатации. SINVER — MVP. Схема с Android TV API привязана к конкретному клиенту HAPP и к правилу «одно устройство», её переносить стоит только при похожей конфигурации.
Не трогать. Если у вас работает готовая панель и модель совпадает — не изобретайте биллинг ради биллинга.
Вердикт
Статья ценна не тем, что кто-то перешёл с OpenVPN на Xray. Таких переходов достаточно. Ценна она тем, что показывает: три компонента инфраструктуры можно выкинуть, ничего не потеряв. Готовая панель — если биллинг пишется скриптом на 40 строк. Прокси-узел — если задача узла сводится к переадресации пакетов. Отдельная подписка на телефоне — если клиент умеет принимать URL по API.
Каждый выкинутый компонент — это минус обновление, минус точка отказа, минус строчка в чек-листе. Для команды из десяти человек это приятная экономия. Для команды из одного — вопрос выживания.