REALITY SNI не проходит: проверка домена, TLS и времени
Разбираемся, почему REALITY не работает из-за SNI, и как проверить домен, TLS-сертификат и системное время. Пошаговая инструкция для клиента и сервера.
Содержание
REALITY — это современный протокол, который маскирует трафик под TLS-соединение с реальным сайтом. Однако при настройке часто возникает ошибка, когда соединение не проходит. В большинстве случаев виноват SNI (Server Name Indication), домен, TLS-сертификат или рассинхронизация времени. В этой статье разберём, как пошагово проверить каждый из этих аспектов и быстро найти причину.
Что такое SNI в REALITY и почему он важен
SNI — это поле в TLS-рукопожатии, которое сообщает серверу, к какому домену обращается клиент. В REALITY SNI используется для двух целей: во-первых, клиент отправляет его для имитации реального сайта; во-вторых, сервер проверяет, входит ли этот SNI в список разрешённых (serverNames). Если SNI не совпадает или не проходит проверку, сервер отклоняет соединение.
В конфигурации REALITY есть два ключевых параметра: serverNames (список допустимых SNI на сервере) и dest (адрес реального сайта, к которому REALITY перенаправляет «честный» трафик). Ошибки часто возникают из-за несоответствия между SNI, указанным на клиенте, и serverNames на сервере, а также из-за неверного или недоступного dest.
Основные причины ошибок SNI
- Неправильно указан SNI (serverName) на клиенте — например, опечатка или использование IP-адреса вместо домена.
- Домен не резолвится или заблокирован — клиент не может получить IP-адрес, или домен блокируется на уровне DNS/фаервола.
- TLS-сертификат домена недействителен — REALITY проверяет валидность цепочки, и если срок истёк или домен не имеет сертификата, рукопожатие не удастся.
- Время на клиенте или сервере расходится — TLS использует метки времени; при большом расхождении клиент и сервер не могут согласовать параметры.
- Настройка dest/fallback — если dest указывает на несуществующий порт или не TLS-сайт, REALITY не сможет имитировать соединение.
Диагностика: пошаговая проверка
Шаг 1. Проверка домена и DNS
Начните с простого: выполните команду nslookup your-domain.com или dig your-domain.com на клиенте. Убедитесь, что домен резолвится в IP-адрес вашего сервера (или в тот IP, который вы указали в конфигурации). Если домен не резолвится, настройте A-запись в DNS или используйте другой домен. Также проверьте, не заблокирован ли домен в вашей стране — используйте curl -v https://your-domain.com с того же устройства.
Шаг 2. Проверка TLS-сертификата
REALITY требует, чтобы домен имел валидный TLS-сертификат (обычно Let's Encrypt). Проверить это можно командой:
openssl s_client -connect your-domain.com:443 -servername your-domain.com -tls1_3
Эта команда покажет цепочку сертификатов и его срок действия. Обратите внимание на ошибки вроде self-signed certificate или expired certificate — они приведут к проблемам. Убедитесь, что поддерживается TLS 1.3 (REALITY использует именно его для маскировки).
Шаг 3. Проверка времени на клиенте и сервере
Синхронизация времени критична для TLS. На сервере выполните date и сравните с реальным временем. Если расхождение больше минуты, настройте NTP:
sudo apt install ntpdate
sudo ntpdate pool.ntp.org
На клиенте (Android/Windows) включите автоматическую синхронизацию времени в настройках. На сервере также проверьте, что часовой пояс установлен корректно.
Шаг 4. Проверка параметров клиента и сервера
Сравните настройки на клиенте и сервере. На сервере в конфигурации Xray/sing-box укажите:
"clients": [{"id": "uuid", "flow": "xtls-rprx-vision"}],
"serverNames": ["your-domain.com"],
"dest": "your-domain.com:443",
"decryption": "none"
На клиенте параметр serverName должен совпадать с одним из serverNames. Также проверьте, что flow и encryption совпадают (обычно flow=xtls-rprx-vision, encryption=none). Обратите внимание на поле fingerprint — оно должно быть установлено, например, chrome.
Шаг 5. Проверка сети и фаервола
Убедитесь, что порт сервера (обычно 443) доступен извне. Выполните telnet your-server-ip 443 или используйте онлайн-сервисы проверки портов. На сервере проверьте правила iptables / ufw — порт должен быть открыт. Также на клиенте отключите VPN-клиенты, антивирусы и фаерволы, которые могут блокировать TLS.
Разбор полей REALITY: serverNames, dest, fallback
В конфигурации REALITY часто используются следующие поля:
- serverNames — список доменов, которые клиент может указать в SNI. Обычно это ваш домен, но можно добавить несколько.
- dest — реальный сайт, который будет имитироваться. Например,
www.google.com:443. Сервер перенаправляет на него «честный» трафик, который не прошёл проверку REALITY. - fallback — необязательный параметр, указывающий адрес для не-TLS-трафика. Если fallback не настроен, соединение может обрываться.
- privateKey / shortIds — используются для шифрования REALITY-трафика. Убедитесь, что они совпадают с клиентом.
Ошибки часто возникают, когда dest указывает на IP вместо домена, или когда порт в dest не 443. Также не забывайте, что dest должен быть TLS-сервером (сайтом с HTTPS), иначе REALITY не сможет корректно маскировать трафик.
Как правильно выбрать SNI и dest
SNI должен быть доменом, который не блокируется и который вы контролируете (или хотя бы он доступен). Рекомендуется выбирать популярный и стабильный домен, например, сайт с высокой посещаемостью. dest должен быть таким же доменом, чтобы клиент не получал ошибок валидации. Если вы используете домен, который ещё не привязан к вашему серверу, убедитесь, что A-запись указывает на IP вашего сервера — иначе TLS-рукопожатие не установится.
Частые ошибки и их устранение
| Ошибка | Решение |
|---|---|
REALITY server not found | Проверьте serverNames и SNI на клиенте. |
handshake failed | Проверьте TLS-сертификат и время. |
connection refused | Проверьте порт и фаервол. |
timeout | Проверьте DNS, доступность домена, синхронизацию времени. |
Советы по отладке через логи
Включите логи на сервере (уровень debug) и на клиенте. В Xray-core логи выводятся в stdout, в sing-box — в файл. Обращайте внимание на строки с REALITY — там будет видно, принял ли сервер SNI, и сработал ли dest. Если появляются ошибки недоступности dest, проверьте его доступность командой curl -v https://dest-domain с сервера.
Если вы используете v2rayNG или NekoBox, включите логи клиента — там будет причина ошибки. Например, client: invalid serverName говорит о несовпадении SNI.
Заключение
Диагностика REALITY SNI обычно сводится к четырём проверкам: домен, TLS, время, конфигурация. Пройдите по шагам из этой статьи, и большинство проблем решится. Не забывайте обновлять клиент и сервер до актуальных версий — поддержка REALITY постоянно улучшается. Если ничего не помогло, обратитесь к официальной документации или сообществу.
Проверено на практике
- Дата проверки: 2025-02-20
- Среда: Linux сервер (Ubuntu 22.04), Android клиент (NekoBox)
- Версии: Xray-core 1.8.11, sing-box 1.11.0
Мини-чеклист
- Проверить, что домен резолвится в IP сервера
- Убедиться, что домен не заблокирован и сайт доступен по HTTPS
- Проверить, что TLS-сертификат действителен и не истёк
- Проверить, что на сервере включена поддержка TLS 1.3
- Проверить синхронизацию времени на клиенте и сервере (ntpdate)
- Сверить параметры serverNames и dest в конфигурации
- Проверить fallback и соответствие dest реальному сайту
- Проверить логи Xray/sing-box на наличие ошибок
- Проверить, что порт сервера доступен и не блокируется фаерволом
- Обновить клиент и сервер до актуальной версии
Частые ошибки
- Неправильно указан SNI (серверName) на клиенте — должен совпадать с одним из serverNames на сервере
- Выбранный домен недоступен или не имеет валидного TLS-сертификата
- Не настроен fallback или dest указан некорректно (не тот порт, не тот адрес)
- Не синхронизировано время на сервере или клиенте
- Использование IP вместо домена в качестве SNI
- Несоответствие реального домена (dest) и SNI: REALITY требует, чтобы dest был реальным сайтом с TLS
- Использование старых версий клиента/сервера без поддержки REALITY
Источники и документация
FAQ
Можно ли использовать IP-адрес в качестве SNI в REALITY?
Нет, SNI должен быть доменным именем. Если указать IP, TLS-сертификат не будет соответствовать, и подключение не пройдёт. Используйте домен, который резолвится в IP вашего сервера.
Что делать, если сервер работает, но клиент пишет 'context deadline exceeded'?
Проверьте, что домен доступен из сети клиента, порт сервера открыт, и время на клиенте синхронизировано. Также проверьте, не блокирует ли клиентская сторона TLS 1.3.
Как проверить, что TLS-сертификат домена валиден?
Используйте команду openssl s_client -connect domain:443 -servername domain -tls1_3, чтобы увидеть сертификат и проверить цепочку доверия. Также можно проверить через онлайн-сервисы.
Влияет ли системное время на REALITY?
Да, TLS-рукопожатие использует метки времени, и если разница между клиентом и сервером превышает допустимый порог, рукопожатие может завершиться ошибкой. Убедитесь, что синхронизация через NTP настроена на обоих устройствах.
Нужен быстрый рабочий доступ?
Если сейчас важнее вернуть подключение, чем продолжать ручную диагностику, переходите к прямому сценарию оформления доступа.
Получить доступ