todo/subscriptions/hwid-client-lock.md
loop-uh 08b4491545
Some checks failed
Published content check / validate (push) Failing after 3s
Завершить переезд базы знаний на Forgejo
Обновить правила репозитория и подписи исходников в 99 заметках, не затрагивая пользовательские незакоммиченные файлы. Сделать Forgejo Actions содержательным: проверять опубликованный commit, а не пустое рабочее дерево после checkout.
2026-08-07 08:27:28 +03:00

134 lines
23 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
date: 2026-07-25
tags:
- подписки
- приватность
- hwid
- клиенты
- панели
aliases:
- HWID-привязка
- Привязка к клиенту
- HWID device limit
- Лимит устройств
link: https://docs.rw/docs/features/hwid-device-limit/
---
# 🔒 HWID-привязка и запрет «чужих» клиентов: как продавцы ограничивают выбор
> [!info] О чём заметка
> Разбор двух практик, которые встречаются у продавцов VPN-подписок: **привязка подписки к идентификатору устройства (HWID)** и **ограничение списка допустимых клиентов**. Здесь: как это устроено технически, почему прокси-ядра ([[Clash/02-mihomo|mihomo]], [[sing-box/sing-box-extended|sing-box]], [[xray/project-x|Xray-core]]) об этом ничего не знают, что ограничение даёт продавцу и чем оборачивается для пользователя. Про сами клиенты — в [[Clash/07-clients|обзоре оболочек]] и [[xray/clients-and-routing|клиентах Xray]].
## TL;DR
- **Ни один прокси-протокол не знает, с какого устройства вы подключаетесь.** Сервер аутентифицирует пользователя по UUID или паролю — и всё. HWID в [[xray/vless|VLESS]], [[protocols/trojan|Trojan]] или [[protocols/shadowsocks|Shadowsocks]] отсутствует как понятие.
- Привязка живёт **этажом выше** — в HTTP-запросе за подпиской. Панель управления требует от клиента заголовок с идентификатором устройства (в Remnawave это `x-hwid`, плюс необязательные `x-device-os`, `x-ver-os`, `x-device-model`, `user-agent`), и **без него отдаёт 404** — подписку нельзя ни добавить, ни обновить.
- Отсюда и запрет «чужих» клиентов: заголовок умеют слать не все. По документации Remnawave это Happ, v2RayTun, Koala Clash, FlClashX, Prizrak-Box, Throne; в v2rayN, Hiddify и Passwall на июль 2026 висят открытые запросы на такую поддержку.
- Вторая форма привязки — **на стороне клиента**: Happ поддерживает шифрованные подписки `happ://crypto...`, скрывающие адреса серверов, и настройку, запрещающую подписчику просматривать и редактировать конфигурацию.
- У ограничений есть понятная цель — борьба с перепродажей одного аккаунта на десятки людей. Но у пользователя оно отнимает свободу выбора ядра, а продавцу отдаёт **инвентарь ваших устройств** и журнал их активности.
- Этот проект такие ограничения не применяет: конфигурация выдаётся в открытом виде, HWID не собирается, конкретный клиент не навязывается.
## Что вообще ограничивают
Стоит развести два разных механизма, которые в разговорах смешивают.
**Первое — лимит устройств (HWID device limit).** Подписка привязывается к идентификаторам устройств: сервер запоминает, с каких из них её загружали, и не даёт превысить установленное число. Формулировка задачи легитимная — один оплаченный доступ не должен работать у сорока человек одновременно.
**Второе — ограничение выбора клиента.** Прямое следствие первого: раз для работы нужен особый заголовок, годятся только те приложения, которые умеют его отправлять. Клиент без поддержки получает от панели ошибку и подписку добавить не может — независимо от того, оплачен ли доступ.
К этому добавляется третья, необязательная надстройка: **скрытие самой конфигурации от пользователя**, чтобы он не смог унести адреса серверов в другое приложение.
Проще говоря: сервер по-прежнему готов вас обслужить с любого клиента — просто вам не дают взять у него настройки. Ограничение построено не на протоколе, а на доступе к конфигу.
## Как это работает технически
Разберём на примере панели **Remnawave**, где механизм задокументирован явно ([HWID device limit](https://docs.rw/docs/features/hwid-device-limit/)).
Когда клиент идёт по ссылке подписки, он отправляет обычный HTTP-запрос. При включённом лимите панель ожидает в этом запросе набор заголовков:
- **`x-hwid`** — идентификатор устройства, **обязательный**;
- `x-device-os`, `x-ver-os`, `x-device-model` — операционная система, её версия и модель устройства;
- `user-agent` — название и версия приложения.
Дальше логика простая. Заголовка `x-hwid` нет — панель отвечает **404**, и пользователь не может ни добавить подписку, ни переподключить её заново. Заголовок есть — панель регистрирует устройство и сверяет, не превышен ли лимит.
Идентификатор при этом **генерирует само приложение** и хранит у себя; это не «серийный номер процессора», а стабильная строка, привязанная к установке. Отсюда практическое следствие: переустановка клиента или смена устройства нередко занимает слот, и его приходится освобождать через продавца.
> [!note] Лимит устройств — не криптографическая защита
> Механизм держится на добросовестности клиентского приложения: заголовок формирует и отправляет сам клиент. В апреле реализации встречались и ошибки в серверной части — в Remnawave, например, публиковалось предупреждение о состоянии гонки (race condition) в логике регистрации устройств, позволявшем зарегистрировать больше устройств, чем разрешено ([GHSA-985p-44h5-v3pq](https://github.com/remnawave/backend/security/advisories/GHSA-985p-44h5-v3pq)). Конкретная ошибка исправлена, но общий вывод остаётся: лимит — административная мера, а не гарантия.
## Что при этом делают ядра: ничего
Это ключевой раздел, ради которого заметка и написана.
**Прокси-ядра к HWID-привязке непричастны.** Ни [[Clash/02-mihomo|mihomo]], ни [[sing-box/sing-box-extended|sing-box]], ни [[xray/project-x|Xray-core]] не имеют понятия «идентификатор устройства». Всё, что знает сервер при подключении, — это учётные данные: UUID пользователя в [[xray/vless|VLESS]] и [[protocols/vmess|VMess]], хеш пароля в [[protocols/trojan|Trojan]], ключ в [[protocols/shadowsocks|Shadowsocks]]. В спецификациях протоколов поля «с какого устройства» просто нет.
Из этого следуют три практических вывода.
**Конфиг работает где угодно.** Если у вас на руках ссылка `vless://…`, она заведётся в любом ядре, поддерживающем нужный протокол и транспорт: в mihomo, в sing-box, в Xray-core, в клиенте на роутере. Сервер аутентифицирует вас по UUID и не различает приложения.
**Ломается не подключение, а получение конфига.** При включённом HWID-лимите вы упираетесь в стену на шаг раньше — на этапе загрузки подписки. Симптом узнаваемый: клиент сообщает об ошибке 404 или «подписка не найдена», хотя ссылка верная и оплата в порядке. Это не поломка ядра и не блокировка провайдером, а отказ панели отдать конфигурацию приложению без нужного заголовка.
**Автообновление подписки становится точкой отказа.** Даже если конфиг однажды получен вручную, при ротации серверов у продавца обновление не пройдёт — и узлы перестанут работать по мере смены адресов.
> [!tip] Как проверить, включена ли привязка
> Откройте ссылку подписки обычным браузером или запросите её через `curl`. Если возвращается конфигурация — HWID-лимита нет, и вы свободны в выборе ядра. Если приходит 404 или пустой ответ, а в «правильном» клиенте подписка работает — значит, панель фильтрует запросы по заголовкам. Отдельный признак — ссылка вида `happ://crypto...`: это шифрованная подписка, рассчитанная на конкретное приложение.
## Привязка на стороне клиента
Второй слой ограничений реализован не панелью, а самим приложением. У Happ, по [его документации](https://www.happ.su/main/ru/faq/adding-configuration-subscription), есть **шифрованные подписки** (ссылки начинаются с `happ://crypto…`), которые скрывают настройки серверов и сам адрес подписки, и **настройка, отключающая просмотр и редактирование конфигурации** для подписчиков — причём как для уже добавленных подписок, так и для будущих.
Оценивать это стоит без демонизации: **Happ — просто клиент**, он не продаёт доступ, а даёт продавцам инструменты, и те решают, включать их или нет. Вопрос не к приложению, а к тому, кто продаёт вам подписку с такими настройками.
Но следствие для пользователя однозначное: **вы не видите, к какому серверу подключаетесь**. Нельзя проверить адрес и страну выхода, нельзя перенести доступ в другое ядро, нельзя посмотреть, какие параметры маскировки вам выдали. Доверие к продавцу перестаёт быть проверяемым — а в теме обхода блокировок это дорого стоит: именно возможность посмотреть конфигурацию отличает «сервис, которому я доверился осознанно» от «чёрного ящика с моим трафиком внутри».
## Что это значит для приватности
HWID — **стабильный идентификатор**, который приложение отправляет при каждом обращении за подпиской. Вместе с сопутствующими заголовками продавец получает:
- **список ваших устройств** — сколько их, какие операционные системы, версии и модели;
- **журнал обращений** — когда и с какого устройства подписка обновлялась, то есть косвенную картину вашей активности и смены устройств;
- **устойчивую связку** «аккаунт ↔ конкретные устройства», которая переживает смену IP-адреса.
Ничего из этого не требуется для того, чтобы прокси работал. Это данные, собираемые ради контроля за перепродажей — и, как любые собранные данные, они могут утечь, быть переданы или запрошены. Общая логика тут та же, что и в остальных заметках про слежку: **чем меньше стабильных идентификаторов вы раздаёте, тем меньше связок можно построить**; про механику таких связок в вебе — в [[Localhost-tracking-Meta-Yandex-SOCKS5|разборе локальной слежки Meta и Яндекса]].
> [!warning] Обратная сторона: у ограничений есть причина
> Справедливо признать и мотив продавца. Один аккаунт, разошедшийся по десяткам людей, съедает канал, ухудшает связь остальным и повышает шанс, что сервер попадёт под блокировку из-за подозрительной активности. Лимит устройств — это попытка решить реальную проблему, а не только желание удержать пользователя. Спор не о том, есть ли у продавца интерес, а о том, кто платит за его решение: выбор клиента и часть приватности отдаёт пользователь.
## Позиция этого проекта
Ограничения выше — не отраслевая необходимость, а решение конкретного продавца. Практика проекта, в рамках которого ведётся это хранилище, противоположная. VPN-подписка выдаётся через Telegram-бота [@zapretvpns_bot](https://t.me/zapretvpns_bot) (подробный разбор — в заметке [[premium/zapret-vpn-bot|Zapret VPN-бот]]), и правила там такие:
- **Клиент выбирает пользователь.** Приложения не фильтруются ни по названию, ни по заголовку `User-Agent`: Happ, INCY или другой «обязательный» клиент не требуется. Подойдёт любое ядро, поддерживающее нужный протокол — [[Clash/02-mihomo|mihomo]] с его оболочками, [[sing-box/sing-box-extended|sing-box]], [[xray/project-x|Xray-core]], клиент на роутере.
- **Подписка — не единственный вход.** Кроме готового профиля формата mihomo выдаются прямые стандартные конфигурации: строка `vless://…`, файл WireGuard/AWG, параметры Hysteria 2. Не понимает ваше приложение подписку — берите прямой конфиг.
- **HWID не собирается.** Аппаратный идентификатор устройства не запрашивается, заголовок `x-hwid` при выдаче не требуется, инвентарь ваших устройств не ведётся. «Слот устройства» в интерфейсе — это просто номер конфига, который вы сами подписываете («телефон», «роутер»), а `Fingerprint` у VLESS — TLS-профиль браузера для маскировки; ни то, ни другое к железу отношения не имеет.
- **Конфигурация открыта.** Адрес сервера и параметры видны: их можно проверить, сохранить у себя и перенести на другое устройство и в другое ядро, не спрашивая разрешения.
- **Единственное реальное условие — техническое:** клиент должен понимать нужный протокол и формат конфига. Если не понимает — это вопрос совместимости, а не политика сервиса.
Проще говоря: доступ, который вы оплатили, остаётся вашим, а не работает только внутри одобренного приложения.
Это не значит, что вопрос доверия снимается: любой VPN-оператор технически видит адреса, к которым вы подключаетесь, — отсутствие HWID лишь сокращает объём собираемых о вас данных. Честные оговорки на этот счёт собраны в самой [[premium/zapret-vpn-bot|заметке о боте]].
## Что делать пользователю
- **Спрашивайте до оплаты**, есть ли лимит устройств и требуется ли конкретный клиент. Это нормальный вопрос, и уклончивый ответ сам по себе информативен.
- **Проверяйте ссылку подписки** запросом из браузера или `curl` (см. подсказку выше) — так вы узнаете реальное положение дел, а не рекламное.
- **Избегайте шифрованных подписок**, если для вас важна проверяемость: скрытый конфиг означает, что вы не можете убедиться даже в стране выхода.
- **Держите конфиг у себя.** Сохранённая ссылка `vless://…` или выгруженный YAML — это ваша страховка на случай, когда клиент перестанет обновляться или продавец сменит правила.
- Если ограничение уже мешает — помните, что упирается оно в **получение конфигурации**, а не в протокол: имея на руках параметры узла, вы вольны использовать любое ядро.
## 📚 См. также
- [[Clash/07-clients|Клиенты на ядре Clash/mihomo]] — какие оболочки живы и почему обновление ядра важнее обновления интерфейса.
- [[xray/clients-and-routing|Клиенты и маршрутизация Xray]] — как подключиться и развести трафик; там же про формат ключей и подписок.
- [[Clash/08-vs-sing-box|mihomo против sing-box и Xray]] — выбор ядра, который HWID-привязка фактически отнимает.
- [[protocols/00-overview|Обзор протоколов]] — почему аутентификация в протоколах устроена как «UUID или пароль», без понятия устройства.
- [[premium/zapret-vpn-bot|Zapret VPN-бот]] — пример подписки без привязки к устройству и без обязательного клиента.
- [[Privacy|Приватность]] — общие принципы: меньше стабильных идентификаторов, меньше связок.
- 🔗 [HWID device limit — документация Remnawave](https://docs.rw/docs/features/hwid-device-limit/) — первоисточник по заголовкам и поведению панели.
- 🔗 [FAQ Happ: добавление конфигурации и подписки](https://www.happ.su/main/ru/faq/adding-configuration-subscription) — описание шифрованных подписок и скрытия конфигурации.
---
> [!quote] 🤖 Эти статьи открыты — можно обучать на них ИИ
> При желании вы можете натренировать ИИ на наших статьях. Исходное форматирование и скачивание всего репозитория одним zip-архивом доступны в Forgejo: [исходник этой заметки](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main/subscriptions/hwid-client-lock.md) · [весь репозиторий](https://git.zapret.moe/zapretdiscordyoutube/todo/src/branch/main).