Skip to content

От шаблона до ссылки ​

Подписка пользователя собирается, когда её запрашивает приложение, из того, что панель знает в этот момент. Ничего не кэшируется и ничего не отправляется узлу, поэтому правка адреса, фронта или шаблона имени действует при следующем получении. Эта страница прослеживает сборку от шаблонов пользователя до байтов, которые получает его приложение. Сами настройки описаны в Подписки и страница подписки.

1. До каких инбаундов доходит пользователь ​

Панель начинает с учётной записи:

  1. Шаблоны. Пользователь входит в один шаблон, в несколько или во все.
  2. Узлы. Каждый включённый узел этих шаблонов обслуживает пользователя.
  3. Инбаунды. Каждый инбаунд шаблона узла — это вход, и каждый становится записями в файле.

Некоторые инбаунды по пути пропускаются или меняются:

  • Инбаунд за ingress доступен через порт ingress и под именем, с которым совпадает его маршрут, потому что приложение пользователя сначала говорит с ingress. Инбаунд, у которого есть и собственный порт, получает две записи: прямую и через ingress. Инбаунд, недоступный ни так, ни так, пропускается.
  • Только через фронт, включённое на инбаунде, убирает его прямые записи у каждого пользователя, для которого отрисовался фронт.
  • Запись, которую приложение не смогло бы использовать, отбрасывается, а не записывается сломанной, потому что из-за одной плохой записи некоторые приложения отклоняют весь файл.

Эндпоинты (WireGuard, OpenVPN, OpenConnect) появляются как туннель, к которому подключается приложение. Ключи WireGuard и адрес пользователя внутри туннеля панель вычисляет из идентификатора пользователя, поэтому файл и узел всегда согласны.

2. Адреса и фронты: складываются, но не умножаются ​

Каждый инбаунд на каждом узле становится одной записью на каждый адрес для ссылок этого узла. Затем каждый доменный фронт на инбаунде добавляет ещё одну запись, один раз, независимо от числа узлов.

3 nodes × 2 link addresses = 6 direct entries
          2 fronts on the inbound = 2 front entries
                                    8 entries

Причина в том, кому принадлежит каждый из них. Адрес для ссылок — ещё один способ дойти до одной машины, поэтому он повторяется для каждого узла. Фронт — это имя инбаунда у CDN, а CDN сам выбирает, на какой исходный сервер пересылать, поэтому один фронт покрывает все узлы, которые обслуживают инбаунд.

  • Первый адрес для ссылок — основной. Записи WireGuard, OpenVPN и OpenConnect и скачиваемые файлы .conf и .ovpn используют только его, потому что сохранённый файл не может нести альтернатив.
  • Адрес, по которому панель подключается к узлу, отделён от его адресов для ссылок. Панель может обращаться к узлу по частному адресу, а пользователи — по публичному.
  • Фронт заменяет адрес, порт, имя сервера, заголовок Host, ALPN и отпечаток браузера (fingerprint) записи и убирает отпечаток сертификата и любой диапазон смены портов: CDN предъявляет собственный сертификат и слушает один порт.

3. Клиентские параметры инбаунда ​

У инбаунда есть настройки для узла и настройки для приложения. Вторые, в разделе Клиентские настройки (ссылки и подписки), используются только при сборке ссылок и никогда не отправляются узлу. Среди прочего они могут:

  • объявить другой адрес или порт, чем у узла, для инбаунда, до которого доходят через что-то, стоящее перед ним;
  • задать имя сервера, ALPN, fingerprint или другие клиентские параметры TLS;
  • задать параметры, которые читает только клиент, например интервал смены портов.

Запись, чей адрес указан в клиентских настройках инбаунда, не копируется на другие адреса для ссылок узла: этот адрес вы указали намеренно.

4. Клиентский TLS: три уровня, объединённые по полям ​

То, что приложение узнаёт о TLS, берётся из трёх мест. Каждое поле берётся из самого конкретного места, где оно задано:

ПриоритетГде задаётсяТипичное применение
1 (побеждает)Клиентские настройки инбаундаимя сервера или ALPN одного инбаунда
2клиентские настройки сертификата узлато же для каждого инбаунда, который использует сертификат этого узла
3клиентские настройки сертификата панелиобщие значения по умолчанию для сертификата, который используют несколько узлов

Под всеми тремя лежат значения, выведенные из самого сертификата: имя сервера — это первое DNS-имя в нём (никогда не wildcard), а самоподписанный сертификат помечается как подлежащий закреплению. Инбаунды REALITY полностью пропускают уровни сертификата: вместо этого они несут свой публичный ключ и short ID.

5. Отпечатки сертификатов ​

Отпечаток (pin) — это хеш сертификата, который должен принять клиент. Панель вычисляет его при выпуске или продлении сертификата; вводить его не нужно никогда.

  • Самоподписанные сертификаты закрепляются всегда, поэтому приложение проверяет именно этот сертификат, а не принимает любой.
  • Загруженный сертификат закрепляется, только если его клиентские настройки отключают проверку.
  • Сертификат ACME никогда не закрепляется: за него ручается публичный центр, и он меняется при каждом продлении.

Каждый формат несёт отпечаток в том виде, который читают его приложения, и приложению, поддерживающему отпечаток, даётся отпечаток, а не отключение проверки. Когда самоподписанный сертификат продлевается, его отпечаток меняется, и приложения получают новый при следующем обновлении. См. Выпуск и продление сертификатов.

6. Имена ​

Каждой записи нужно имя, которое показывает приложение. Если Шаблон имени в разделе Имена ссылок пуст, записи сохраняют фиксированные имена панели. Шаблон вроде {USER} · {ROUTE} · {REMAINING} заполняется для каждой записи учётной записью, инбаундом, узлом, маршрутом (меткой адреса для ссылок или фронта), адресом подключения, расходом и сроком. Пустая переменная забирает с собой свой разделитель, неизвестная остаётся как написана, а имя, которое превращается в пустоту, заменяется фиксированным. Приложения запоминают выбранную пользователем запись по её имени, поэтому шаблон стоит выбрать один раз, а не менять часто.

7. Формат, который читает каждое приложение ​

Один адрес подписки отвечает в нескольких форматах:

ФорматКто читает
Ссылки, base64 (по умолчанию)большинство приложений: v2rayNG, v2rayN, Streisand, Happ, Shadowrocket
Ссылки открытым текстомвсё, что читает по одной ссылке в строке
Clashприложения Clash Meta и Stash
Профиль sing-boxприложения sing-box: SFA, SFI, Hiddify, Karing
Профиль Xray JSONприложения на базе Xray, которые импортируют полный профиль
Страница подпискибраузер

Формат выбирается в таком порядке: формат, названный в адресе (путь формата или ?format=), побеждает всегда. Иначе браузер получает страницу подписки, а приложение узнаётся по имени и получает свой формат. Структурированные форматы начинаются с базового документа, который можно заменить в разделе Шаблоны подписок; сгенерированные записи вливаются в него, с группой по умолчанию, которая проверяет каждую запись.

8. Что передаётся вместе с файлом ​

Ответ подписки несёт и заголовки, которые приложения показывают, не требуя от пользователя ничего открывать: название профиля, полосу квоты и срока, интервал обновления, объявление, ссылку на поддержку и ссылку обратно на страницу. Текст на других алфавитах кодируется так, как ожидают эти приложения. Подробности — в Подписки и страница подписки.

9. Перед тем как отдать файл ​

  • Лимит устройств. Приложение, которое называет своё устройство, учитывается в Лимит устройств пользователя, прежде чем что-либо отправлено. Устройство сверх лимита получает отказ, а уже учтённые устройства продолжают получать подписку. Приложения, которые не присылают идентификатор устройства, обслуживаются, если не включён строгий режим. Это единственное место, где действует лимит устройств; узлы никогда не видят устройств. См. Трафик, квоты и лимиты.
  • Получение записывается. Время, приложение и адрес записываются, когда отдаётся тело. Первое получение учётной записи создаёт событие. Открытие страницы в браузере записывается отдельно, поэтому никогда не затирает имя приложения, через которое подключается пользователь.

Откуда берётся адрес ​

Сам адрес подписки строится на первом из ваших доменов подписки, или на отдельном имени хоста для каждого подписчика под wildcard-доменом, или на публичном адресе панели. Каждый домен в списке продолжает обслуживать выданные им ссылки, поэтому заблокированный домен заменяют, сначала добавив новый. На этих именах панель отвечает только на своём базовом пути, поэтому адрес, который есть у ваших клиентов, ничего не говорит о том, где администрируется панель. См. Подписки и страница подписки и Доменный фронтинг.

Текст и изображения — CC BY 4.0.