REALITY в sing-box: полное руководство по server_name, public_key, short_id и fingerprint
Разбираем параметры REALITY в sing-box: что означает server_name, как получить public_key и private_key, зачем нужен short_id и как правильно подобрать fingerprint. Пошаговая настройка клиента и сервера.
Содержание
Что такое REALITY и зачем он нужен
REALITY (от англ. reality — «реальность») — это современный способ маскировки прокси-трафика. Он был разработан для обхода DPI и блокировок, используя технологию TLS 1.3 и подмену сертификата. Вместо того чтобы создавать собственный TLS-сертификат, REALITY «одалживает» сертификат реального сайта, например, такого как www.microsoft.com. Это делает трафик практически неотличимым от обычного посещения сайта.
sing-box реализует REALITY для протокола VLESS. Для работы используется несколько параметров: server_name, public_key, short_id и fingerprint. Без их правильной настройки соединение не установится или будет легко заблокировано.
Основные параметры REALITY в конфигурации sing-box
Прежде чем переходить к настройке, разберёмся, что означает каждый параметр.
- server_name — домен реального сайта, под который маскируется соединение. Это должен быть HTTPS-сайт с поддержкой TLS 1.3 и HTTP/2. На клиенте и сервере эти значения должны совпадать.
- public_key — публичный ключ сервера, полученный из пары x25519. Клиент использует его для шифрования.
- private_key — секретный ключ, который хранится только на сервере. Он нужен для расшифровки.
- short_id — короткий идентификатор (до 16 байт в hex), используемый для различения клиентов. Может быть случайным, но должен совпадать с одним из ID на сервере.
- fingerprint — отпечаток TLS-клиента (например, chrome), который эмулирует клиент. Нужен, чтобы DPI не обнаружил несоответствие.
На сервере эти параметры задаются во inbound-секции, а на клиенте — в outbound. Рассмотрим обе стороны.
Настройка серверной части (inbound)
Создайте файл конфигурации сервера config.json. Минимальный inbound для REALITY будет выглядеть так:
{
"inbounds": [
{
"type": "vless",
"listen": "::",
"listen_port": 443,
"users": [
{
"uuid": "ваш-uuid",
"flow": "xtls-rprx-vision"
}
],
"tls": {
"enabled": true,
"server_name": "www.microsoft.com",
"reality": {
"enabled": true,
"handshake": {
"server": "www.microsoft.com",
"server_port": 443
},
"private_key": "ваш-private-key",
"short_id": ["abcdef"]
}
}
}
],
"outbounds": [
{
"type": "direct"
}
]
}
Обратите внимание на структуру: параметры REALITY находятся внутри tls.reality. Поле handshake указывает, к какому реальному сайту обращаться на стороне сервера. Значение server_name в tls и в handshake должно совпадать.
Перед запуском сгенерируйте ключи и UUID:
sing-box generate uuid
sing-box generate reality-keypair
Вместо ваш-private-key подставьте сгенерированный приватный ключ. short_id — это массив, можно задать несколько вариантов. Для простоты используйте один.
Настройка клиентской части (outbound)
На клиенте (например, на компьютере или телефоне) создайте конфигурацию с outbound-секцией. Пример:
{
"outbounds": [
{
"type": "vless",
"server": "адрес-вашего-сервера",
"server_port": 443,
"uuid": "ваш-uuid",
"flow": "xtls-rprx-vision",
"tls": {
"enabled": true,
"server_name": "www.microsoft.com",
"utls": {
"enabled": true,
"fingerprint": "chrome"
},
"reality": {
"enabled": true,
"public_key": "ваш-public-key",
"short_id": "abcdef"
}
}
}
]
}
Здесь public_key — публичный ключ из пары, сгенерированной на сервере. short_id должен совпадать с одним из значений, указанных на сервере. Параметр fingerprint задаётся внутри utls — это настройка имитации TLS-отпечатка. Если её не указать, будут использованы системные библиотеки, что не всегда безопасно.
Обратите внимание: на клиенте нет поля private_key и handshake — они нужны только на сервере.
Взаимодействие параметров: откуда берутся значения
Чтобы всё работало, параметры должны быть согласованы между двумя сторонами. Рассмотрим, как они связаны.
Пары ключей. Для REALITY используются асимметричные ключи X25519. Приватный ключ хранится на сервере, публичный — на клиенте. Если они не совпадают, рукопожатие не пройдёт.
server_name. Это имя хоста, которое клиент передаёт в TLS Server Name Indication (SNI). Сервер REALITY перехватывает запрос и устанавливает TLS-соединение с реальным сайтом, используя это имя. Поэтому сервер и клиент должны указывать один и тот же домен.
short_id. Это необязательное поле, но оно помогает серверу быстрее отличить «своих» клиентов. short_id на клиенте должен совпадать с одним из short_id на сервере. Если клиент его не указывает, сервер может использовать специальное значение, но лучше всегда задавать.
fingerprint. Это параметр, который влияет на то, как клиент выглядит при TLS-рукопожатии. В REALITY рекомендуется использовать fingerprint известного браузера, например chrome или firefox. Сервер не проверяет fingerprint напрямую, но от него зависит, насколько «чистым» будет трафик.
Интеграция с маршрутизацией, DNS и TUN
Чтобы использовать REALITY в sing-box как полноценный VPN-клиент, нужно настроить маршрутизацию, DNS и, при необходимости, TUN-интерфейс. Это позволяет направлять весь трафик через прокси и избегать утечек.
Добавьте в конфигурацию клиента следующие секции:
route— задаёт правила маршрутизации. Например, можно направить все подключения через outbound REALITY, кроме локальной сети.dns— настройте DNS через прокси, чтобы избежать DNS-утечек. Рекомендуется использоватьtype: "fakeip"или указать публичный DNS.tun— создание виртуального сетевого интерфейса. Включите его, чтобы перехватывать трафик с уровня системы.
Пример клиента с TUN и маршрутизацией:
{
"tun": {
"enabled": true,
"stack": "system"
},
"dns": {
"servers": [
{
"address": "https://1.1.1.1/dns-query"
}
]
},
"route": {
"final": "proxy"
},
"outbounds": [
{
"type": "vless",
"tag": "proxy",
"...": "остальные настройки REALITY"
}
]
}
Этот пример упрощён, но он демонстрирует ключевую идею: все исходящие соединения попадают в outbound с тегом proxy. Подробные правила маршрутизации зависят от ваших задач, поэтому не забывайте про документацию sing-box.
Диагностика типичных проблем
Даже опытные пользователи иногда сталкиваются с ошибками. Вот список частых проблем и способы их решения.
- Ошибка «TLS handshake failed» — проверьте, что
server_nameна клиенте совпадает с серверным и что указанный домен действительно существует и поддерживает TLS 1.3. - Клиент не может подключиться — возможно, ключи не совпадают. Проверьте
public_keyиprivate_keyиз одной пары. - Сервер не принимает соединения — убедитесь, что
short_idклиента указан в спискеshort_idна сервере. - Трафик блокируется или соединение рвётся — попробуйте сменить
fingerprintна более актуальный для вашего региона. - Низкая скорость — проверьте, что
flowустановлен вxtls-rprx-visionна обеих сторонах, и что выбранный сайт (server_name) не перегружен.
Всегда проверяйте логи sing-box с помощью log.level: "debug", чтобы увидеть подробности ошибок.
Заключение
REALITY — мощный инструмент, который в паре с sing-box обеспечивает высокий уровень приватности и устойчивость к блокировкам. Главное — правильно понять и настроить параметры server_name, public_key, short_id и fingerprint. Мы разобрали, где они задаются и как взаимодействуют. Не забывайте регулярно обновлять sing-box и следить за официальной документацией.
Проверено на практике
- Дата проверки: 2025-04-01
- Среда: Linux (Ubuntu 22.04), клиент sing-box v1.10.0
- Версии: sing-box v1.10.0
Мини-чеклист
- Сгенерируйте пару ключей x25519
- Выберите реальный сайт для server_name
- Задайте short_id на сервере и клиенте
- Проверьте согласованность fingerprint
- Настройте клиентский outbound с VLESS+REALITY
Частые ошибки
- Использование одного и того же private_key для нескольких серверов
- Неверный server_name, который не соответствует хосту
- Несовпадение short_id между клиентом и сервером
- Отсутствие настройки uTLS или неправильный fingerprint
Источники и документация
FAQ
Что такое server_name в REALITY?
Это домен реального сайта, который используется для TLS-рукопожатия. Сервер REALITY подменяет ответ, маскируя трафик под этот сайт.
Как сгенерировать public_key и private_key?
Используйте команду sing-box generate reality-keypair для генерации пары x25519.
Что такое short_id?
Short ID — это короткий идентификатор клиента (до 16 байт в hex), который позволяет серверу отличить ваше соединение от посторонних.
Какой fingerprint выбрать?
Рекомендуется выбрать fingerprint популярного браузера, например chrome или safari. Убедитесь, что клиент поддерживает uTLS.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ