REALITY + Selfsteal
Remnawave
Последовательно пройдите все шаги. Сначала прочитайте объяснение, затем выполните действие и проверьте результат.
Содержание
Что мы будем строить
Зачем это нужно
Перед началом важно понимать путь пакетов: это исключает путаницу между сервером, панелью и клиентом.
Что делать
Схема: телефон → VPS с Xray → интернет. REALITY — защита подключения, а Selfsteal — дополнительная схема использования собственного сайта; это не переключатель, который автоматически есть в каждой панели.
✓ Как проверить: Запишите схему и назначение каждого VPS на бумаге.
Что потребуется и сколько серверов
Зачем это нужно
Без заранее подготовленных доступов придётся прерывать настройку.
Что делать
Нужны один тестовый VPS с Ubuntu 24.04, доступ SSH, домен (для собственного сайта), телефон с Xray-совместимым клиентом и доступ к панели.
✓ Как проверить: Проверьте, что у вас есть IP, логины и способ восстановления доступа через веб-консоль провайдера.
Как подключиться по SSH
Зачем это нужно
SSH — удалённая командная строка сервера.
Что делать
Откройте Termius или терминал. Создайте подключение: Address — публичный IP VPS; Port — 22, если провайдер не указал иной; Username — root или предоставленный пользователь. Сверьте отпечаток ключа сервера с информацией провайдера. Для каскада повторите на обоих VPS.
Команды для терминала
whoami
hostname
cat /etc/os-release✓ Как проверить: Появляется приглашение терминала и версия Ubuntu.
Если не получилось: Если Connection timed out — проверьте IP, порт и сетевой экран. Если Permission denied — проверьте имя пользователя и ключ.
Проверяем систему без изменений
Зачем это нужно
Не устанавливайте вторую панель поверх работающей: можно занять те же порты и потерять сервис.
Что делать
Выполните команды только для просмотра. Обратите внимание на 80, 443, 2053, 8443 и порт SSH. Если сервер уже используется, лучше взять чистый тестовый VPS.
Команды для терминала
ss -lntup
ip -br addr
ip route
df -h✓ Как проверить: Вы видите список занятых портов, интерфейсов и свободное место.
Если не получилось: Если порт занят, не останавливайте неизвестный процесс. Узнайте, какая служба его использует.
IP-адрес, DNS и домен
Зачем это нужно
IP — адрес сервера; DNS связывает имя с IP. У VPN и сайта могут быть разные имена.
Что делать
В панели управления доменом создайте A-запись, например docs.example.com → IP вашего тестового VPS. Для REALITY и сайта заранее определите, какой домен будет доступен через HTTPS. В каскаде домен обычно указывает на входной VPS.
Команды для терминала
getent ahostsv4 example.com
curl -4 https://api.ipify.org; echo✓ Как проверить: Ответ DNS соответствует ожидаемому адресу. В примере замените example.com своим доменом.
Если не получилось: Если адрес старый, проверьте запись у DNS-провайдера и TTL.
Устанавливаем Remnawave по официальному руководству
Зачем это нужно
Remnawave обычно разделяет панель и ноды, поэтому один случайный скрипт из интернета может не подойти.
Что делать
На чистом тестовом VPS откройте раздел Installation официальной документации Remnawave. Проверьте требования к Docker/Compose, переменным окружения, доменам и HTTPS. Выполните команды именно для выбранной версии; сохраните секреты вне публичной документации.
Команды для терминала
docker --version
docker compose version✓ Как проверить: Панель доступна по защищённому адресу, а контейнеры работают.
Если не получилось: Если контейнер не стартует, смотрите docker compose logs; не удаляйте тома с данными.
Первоисточник: https://docs.rw/
Создаём ноду и связываем с панелью
Зачем это нужно
Панель сама по себе не принимает VPN-трафик: нужна Xray-нода.
Что делать
В Remnawave откройте раздел Nodes, создайте ноду, получите данные подключения/токен и настройте Remnawave Node по инструкции именно вашей версии. Не вставляйте токен в общедоступный чат или скриншот.
Команды для терминала
docker ps --format "table {{.Names}}\t{{.Status}}"✓ Как проверить: Нода отображается онлайн в панели.
Если не получилось: При статусе Offline проверьте адрес панели, токен, TLS, DNS и логи ноды.
Первоисточник: https://docs.rw/
Создаём собственный HTTPS-сайт
Зачем это нужно
Selfsteal предполагает наличие собственного работающего сайта, но не равен простой установке сайта.
Что делать
Подготовьте отдельное доменное имя и небольшой статический сайт на HTTPS. Можно использовать Caddy или Nginx на отдельном порту/адресе. Важно заранее решить, как Xray и веб-сервер разделят входящий TCP 443: два процесса не могут слушать один IP:порт одновременно.
Команды для терминала
curl -I https://example.com✓ Как проверить: Сайт открывается с корректным TLS-сертификатом.
Если не получилось: Если порт 443 занят Xray, не запускайте второй веб-сервер на том же IP:443.
Генерируем ключи REALITY
Зачем это нужно
Публичный ключ получает клиент, приватный остаётся на сервере.
Что делать
Откройте в панели форму REALITY и используйте кнопку генерации ключей, если она предусмотрена вашей версией. Альтернатива — команда Xray x25519 на ноде с установленным бинарником. Не путайте ключи REALITY с ключами WireGuard.
Команды для терминала
xray x25519✓ Как проверить: Получены PrivateKey и PublicKey. Приватный ключ не публикуется.
Если не получилось: Если xray: command not found — Xray может работать внутри контейнера; используйте генератор в панели.
Создаём inbound VLESS + REALITY
Зачем это нужно
Inbound — входная точка, на которую подключается телефон.
Что делать
В панели создайте новый inbound: Protocol=VLESS, Transport=TCP/RAW (в зависимости от версии), Security=REALITY, Port=выбранный свободный TCP-порт. При необходимости для Vision установите flow=xtls-rprx-vision. Не включайте несовместимые варианты транспорта и flow одновременно.
✓ Как проверить: Inbound сохранён, а Xray запущен без ошибок.
Первоисточник: https://docs.rw/
Заполняем поля REALITY
Зачем это нужно
Параметры сервера и клиента должны совпадать побуквенно.
Что делать
Укажите serverNames (разрешённое имя TLS), dest/target (подходящий TLS-адрес), privateKey и shortIds. Для selfsteal со своим сайтом корректный target и SNI зависят от конкретной топологии и возможностей Xray. Не считайте, что указание собственного домена само по себе завершает настройку.
✓ Как проверить: В конфигурации есть privateKey, serverNames и shortIds; панель принимает настройки.
Первоисточник: https://xtls.github.io/en/config/transport.html#realityobject
Разделяем REALITY и сайт
Зачем это нужно
Самая частая ошибка — пытаться посадить Xray и Caddy на один IP:443 без прокси/разделения.
Что делать
Если сайт и Xray находятся на одном VPS, используйте документированную схему разделения трафика, разные IP или порты. Проверьте совместимость конкретной версии Xray с нужным вариантом Selfsteal. Не добавляйте произвольные fallback-поля из старых инструкций.
Команды для терминала
sudo ss -lntup | grep ":443" || true✓ Как проверить: Вы точно знаете, какая служба принимает соединения на 443 и куда попадает веб-трафик.
Если не получилось: Если сайт перестал открываться, откатите последний inbound и проверьте конфликты портов.
Создаём пользователя VPN
Зачем это нужно
Каждому человеку лучше выдавать отдельный идентификатор: это упрощает отзыв доступа.
Что делать
В Remnawave создайте пользователя и назначьте доступный inbound/хост подписки; в 3x-ui откройте Clients внутри inbound и добавьте клиента с новым UUID. Не публикуйте пользовательские ссылки.
✓ Как проверить: В панели виден отдельный тестовый пользователь и его UUID.
Первоисточник: https://docs.rw/
Экспортируем ссылку и сверяем поля
Зачем это нужно
QR-код или VLESS-ссылка содержит параметры, без которых подключение не заработает.
Что делать
Скопируйте ссылку или QR только для тестового пользователя. Проверьте address, port, id, security=reality, pbk (publicKey), sni (serverName), sid (shortId), type и flow. Не подменяйте ключи другого inbound.
✓ Как проверить: Все значения соответствуют сохранённой конфигурации сервера.
Подключаем телефон
Зачем это нужно
Тест на телефоне показывает результат с точки зрения конечного пользователя.
Что делать
Установите актуальный Xray-совместимый клиент из официального источника. Импортируйте ссылку или QR, разрешите создание VPN-профиля в ОС и включите подключение. Сначала тестируйте на мобильном интернете.
✓ Как проверить: Клиент сообщает о соединении, а сайты открываются.
Первоисточник: https://github.com/2dust/v2rayNG
Проверяем работу через внешний IP
Зачем это нужно
Внешний IP показывает, через какой сервер трафик покидает сеть.
Что делать
На телефоне с включённым VPN откройте сервис определения IP. В каскаде адрес должен совпадать с публичным IP VPS №2, в одиночной схеме — с IP VPN-сервера. Также проверьте DNS и IPv6, если они включены.
Команды для терминала
curl -4 https://api.ipify.org; echo✓ Как проверить: Адрес соответствует ожидаемому выходному узлу.
Если не получилось: Если виден IP провайдера телефона — VPN не используется или приложение настроено на обход.
Проверяем журналы и ошибки
Зачем это нужно
По логам можно отличить ошибку авторизации от ошибки сети.
Что делать
В Remnawave откройте журналы ноды и контейнеров; в 3x-ui — журналы x-ui/Xray. Проверяйте только последние строки и не публикуйте полные логи с токенами и адресами клиентов.
Команды для терминала
docker ps
docker logs --tail 80 <имя_контейнера>✓ Как проверить: Нет повторяющихся критических ошибок при тестовом подключении.
Если не получилось: Если встречается bind: address already in use — порт уже занят; если invalid config — проверьте поля inbound.
Типовые проблемы и порядок диагностики
Зачем это нужно
Бессистемная замена настроек обычно ухудшает ситуацию.
Что делать
Проверяйте по цепочке: DNS → доступность порта → состояние панели/ноды → Xray inbound → ключи и SNI → маршрут/туннель → DNS клиента. После каждого исправления меняйте только один параметр и повторяйте тест.
Команды для терминала
getent hosts example.com
ss -lntup
ip route✓ Как проверить: Вы определили конкретный этап, на котором соединение ломается.
Если не получилось: Если всё работало до изменения, восстановите резервную копию этого изменения.
Резервные копии и обновления
Зачем это нужно
Без копии настроек обновление может привести к потере пользователей и ключей.
Что делать
Сохраните конфигурации панели, базы пользователей и приватные ключи в зашифрованном хранилище. Перед обновлением читайте release notes, проверяйте совместимость ноды и панели, тестируйте восстановление на отдельном сервере.
✓ Как проверить: Есть резервная копия и записанная процедура восстановления.
Первоисточник: https://docs.rw/
Финальная проверка и памятка читателю
Зачем это нужно
Готовая инструкция должна завершаться воспроизводимым результатом.
Что делать
Проверьте подключение с мобильного интернета и Wi-Fi, внешний IP, DNS, доступность сайта, перезапуск служб и возможность войти по SSH. Запишите версии Xray, панели и Ubuntu, порты и даты обновления — без паролей и приватных ключей.
✓ Как проверить: Другой человек может повторить настройку по вашей записи, а вы можете восстановить доступ после ошибки.
Дополнительные официальные источники
Xray / XTLS · WireGuard Quick Start · Ubuntu Server
Практикум: от чистого VPS до проверки
Ниже не общие советы, а действия с командами, ожидаемыми результатами и диагностикой. Все примеры выполняйте на отдельных тестовых VPS, не на сервере с работающими сервисами.
Подготовьте чистый тестовый сервер
Что это и зачем
Рабочий сервер с действующим VPN нельзя использовать как полигон: установщик может занять порт или изменить сеть.
Действия по порядку
- Возьмите отдельный VPS с Ubuntu 24.04 и публичным IPv4.
- Сохраните IP, логин SSH и способ входа через веб-консоль провайдера.
- Подключитесь через Termius: Host = IP, Port = 22 (или указанный провайдером), Username = root либо выданный пользователь.
- Перед первым подключением проверьте отпечаток SSH-ключа по консоли провайдера.
Команда или пример конфигурации
whoami && cat /etc/os-release && uname -m
ss -lntupПравильный результат: Видна Ubuntu, архитектура и список уже занятых портов.
Если возникла ошибка: Если порт 443 занят, не останавливайте процесс вслепую: нужен другой VPS или согласованная схема с веб-сервером.
Подготовьте необходимые утилиты
Что это и зачем
Пакетный менеджер apt ставит программы из репозиториев Ubuntu. Обновление списка пакетов не равно обновлению всей ОС.
Действия по порядку
- Убедитесь, что подключены к нужному тестовому VPS.
- Вставьте команды по одной.
- Дождитесь завершения apt; не закрывайте терминал во время установки.
Команда или пример конфигурации
sudo apt update
sudo apt install -y curl ca-certificates openssl jq nano dnsutilsПравильный результат: Команда curl --version показывает версию.
Если возникла ошибка: Если apt сообщает о блокировке, дождитесь завершения автоматического обновления; не удаляйте lock-файлы.
Подготовьте домен и DNS
Что это и зачем
A-запись связывает доменное имя с IPv4. REALITY может использовать чужой target для маскировки, но собственный сайт требует своего домена.
Действия по порядку
- В личном кабинете регистратора откройте DNS-зону.
- Создайте A-запись vpn.example.com, указывающую на IP вашего VPS.
- Подождите распространения DNS и проверьте ответ.
- Во всех следующих примерах заменяйте example.com на собственный домен; не вводите пример буквально.
Команда или пример конфигурации
dig +short A vpn.example.com @1.1.1.1
curl -4 https://api.ipify.org; echoПравильный результат: DNS возвращает IP нужного VPS.
Если возникла ошибка: Если DNS пустой, проверьте NS-записи и правильность имени; не путайте A и CNAME.
Проверьте доступность порта
Что это и зачем
На одном IP и одном TCP-порту обычно может слушать только один процесс. Для REALITY нужен свободный входной порт; панель управления должна работать отдельно.
Действия по порядку
- На сервере посмотрите занятые TCP-порты.
- Выберите свободный порт, например 24443; проверьте, что провайдер разрешает входящие TCP на нём.
- Не открывайте административный порт панели всем подряд: ограничьте его по IP либо используйте SSH-туннель.
Команда или пример конфигурации
sudo ss -lntp | grep -E ":(22|80|443|24443|2053)\b" || trueПравильный результат: Выбранный порт не занят; SSH остаётся доступным.
Если возникла ошибка: Если команда показывает LISTEN на выбранном порту, выберите другой и используйте его одинаково в панели и клиенте.
Установите Remnawave Panel по официальной схеме
Что это и зачем
Remnawave состоит из панели и ноды. Панель хранит пользователей и профили, нода запускает Xray. Для панели рекомендованы 2+ CPU, 2+ ГБ RAM и отдельная нода.
Действия по порядку
- Используйте отдельный тестовый VPS под панель и другой VPS под ноду.
- Установите Docker Engine и Compose plugin согласно официальной инструкции Docker для Ubuntu.
- Откройте https://docs.rw/install/remnawave-panel/ и скачайте production compose и пример .env.
- Заполните .env по таблице официальной документации, создайте случайные секреты и установите домены/HTTPS. Не публикуйте .env.
- Запустите контейнеры и проверьте журналы.
Команда или пример конфигурации
sudo docker --version
sudo docker compose version
sudo mkdir -p /opt/remnawave && cd /opt/remnawave
sudo curl -fLo docker-compose.yml https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/docker-compose-prod.yml
sudo curl -fLo .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sample
sudo nano .env
sudo docker compose up -d
sudo docker compose psПравильный результат: Все обязательные контейнеры панели работают, HTTPS панели доступен.
Если возникла ошибка: Если compose не стартует, смотрите docker compose logs --tail 100. Не используйте готовые значения секретов и не удаляйте тома базы.
Создайте Remnawave Node
Что это и зачем
Нода принимает VPN-подключения. Она регистрируется в панели через уникальную конфигурацию Compose.
Действия по порядку
- В панели откройте Nodes → Management → +.
- Укажите имя и Node Port — это порт внутреннего API, не клиентский порт REALITY.
- Нажмите Copy docker-compose.yml.
- На отдельном VPS ноды создайте /opt/remnanode/docker-compose.yml и вставьте именно сгенерированное содержимое.
- Запустите контейнер и в мастере панели выберите Config Profile, затем Create.
- Ограничьте доступ к Node Port IP-адресом панели.
Команда или пример конфигурации
sudo mkdir -p /opt/remnanode
cd /opt/remnanode
sudo nano docker-compose.yml
sudo docker compose up -d
sudo docker compose ps
sudo docker compose logs --tail 60Правильный результат: В Nodes статус ноды Online.
Если возникла ошибка: Если Offline, проверьте DNS, Node Port, токен в compose и firewall; не выкладывайте compose в общий доступ.
Настройте профиль Xray для REALITY
Что это и зачем
Config Profile определяет inbound и outbound Xray, а Host определяет параметры клиентской подписки. Это разные сущности.
Действия по порядку
- Откройте Config Profiles и создайте тестовый профиль.
- Добавьте VLESS inbound на свободный порт 24443 с transport TCP/RAW, security REALITY и flow xtls-rprx-vision.
- Сгенерируйте x25519 private/public key и Short ID, выберите допустимый target:443 и SNI.
- Привяжите профиль к созданной ноде.
- Создайте Host с IP/доменом ноды, портом, SNI, public key и short ID, соответствующими inbound.
- Создайте тестового пользователя, выдайте ему подписку и импортируйте в Xray-клиент.
Команда или пример конфигурации
sudo ss -lntp | grep 24443 || true
cd /opt/remnanode && sudo docker compose logs --tail 80Правильный результат: Нода Online, inbound слушает выбранный порт, клиент подключается.
Если возникла ошибка: При неработающей подписке сравните Host и inbound: порт, public key, shortId, SNI, flow. Версии UI могут различаться; сверяйте https://docs.rw/.
Что такое Selfsteal и почему это отдельная задача
Что это и зачем
REALITY с target внешнего сайта — это не автоматически Selfsteal. Selfsteal обычно означает, что неавторизованный TLS-трафик попадает на собственный HTTPS-сайт на том же сервере; реализация зависит от Xray, версии панели и архитектуры портов.
Действия по порядку
- Подготовьте свой домен с корректной A-записью на VPS.
- Разместите простой HTTPS-сайт на локальном веб-сервере; он должен отвечать на localhost по отдельному порту, например 8444.
- Убедитесь, что внешний порт REALITY не занят веб-сервером.
- Выберите поддерживаемую вашей версией Xray схему передачи неавторизованного трафика к локальному HTTPS target.
- Не копируйте чужие privateKey/shortId. Не направляйте target на случайные CDN-хосты: это может сделать сервер открытым форвардером.
Команда или пример конфигурации
sudo ss -lntp | grep -E ":(24443|8444)\b" || true
curl -kI https://127.0.0.1:8444/ || trueПравильный результат: Локальный сайт отвечает HTTPS; REALITY inbound слушает отдельный порт.
Если возникла ошибка: Если сайт на 8444 отвечает только HTTP, его нельзя бездумно назначать TLS target. Сначала настройте TLS у локального сервера.
Проверка REALITY и Selfsteal отдельно
Что это и зачем
Успешный VPN-трафик не доказывает, что неавторизованный запрос корректно попадает на сайт. Нужны два независимых теста.
Действия по порядку
- Сначала подключитесь по VLESS и проверьте IP.
- Затем отключите VPN-клиент и выполните TLS-проверку домена на публичном порту REALITY.
- Сравните сертификат, SNI, ответ сайта и логи Xray.
- Если используется нестандартный порт, укажите его явно; не принимайте успешный curl с -k за доказательство доверенного сертификата.
Команда или пример конфигурации
openssl s_client -connect vpn.example.com:24443 -servername vpn.example.com </dev/null 2>&1 | head -35
curl -vkI --resolve vpn.example.com:24443:203.0.113.10 https://vpn.example.com:24443/Правильный результат: VPN-клиент работает, а отдельный TLS-тест возвращает ожидаемый сайт по выбранной архитектуре.
Если возникла ошибка: 203.0.113.10 — адрес из документации, его обязательно заменяют. Реакция TLS может различаться в зависимости от конфигурации REALITY.
Границы примера: эта конфигурация не проверялась на вашем VPS. Для каскада показана воспроизводимая схема TCP через SOCKS и WireGuard; UDP, DNS и IPv6 требуют отдельной настройки. Selfsteal зависит от поддерживаемого target и схемы локального HTTPS. Не публикуйте страницу как гарантию готовой настройки без теста на чистых серверах.