Pelmeni VPN / Каскад двух VPS · 3x-ui
20 БОЛЬШИХ ШАГОВ · 3X-UI

Каскад двух VPS
3x-ui

Последовательно пройдите все шаги. Сначала прочитайте объяснение, затем выполните действие и проверьте результат.

Важное ограничение: панели и Xray регулярно обновляются. Для сложных схем Selfsteal и маршрутизации нет единой конфигурации для всех версий. Там, где требуется адаптация под ваш сервер, это указано явно. Не вводите вымышленные ключи и адреса.

Содержание

ШАГ 01 / 20

Что мы будем строить

Зачем это нужно

Перед началом важно понимать путь пакетов: это исключает путаницу между сервером, панелью и клиентом.

Что делать

Схема: телефон → VPS №1 → VPS №2 → интернет. Первый сервер принимает VPN, второй выходит в интернет. Подготовьте два независимых VPS.

✓ Как проверить: Запишите схему и назначение каждого VPS на бумаге.

ШАГ 02 / 20

Как подключиться по SSH

Зачем это нужно

SSH — удалённая командная строка сервера.

Что делать

Откройте Termius или терминал. Создайте подключение: Address — публичный IP VPS; Port — 22, если провайдер не указал иной; Username — root или предоставленный пользователь. Сверьте отпечаток ключа сервера с информацией провайдера. Для каскада повторите на обоих VPS.

Команды для терминала

whoami
hostname
cat /etc/os-release

✓ Как проверить: Появляется приглашение терминала и версия Ubuntu.

Если не получилось: Если Connection timed out — проверьте IP, порт и сетевой экран. Если Permission denied — проверьте имя пользователя и ключ.

ШАГ 03 / 20

Проверяем систему без изменений

Зачем это нужно

Не устанавливайте вторую панель поверх работающей: можно занять те же порты и потерять сервис.

Что делать

Выполните команды только для просмотра. Обратите внимание на 80, 443, 2053, 8443 и порт SSH. Если сервер уже используется, лучше взять чистый тестовый VPS.

Команды для терминала

ss -lntup
ip -br addr
ip route
df -h

✓ Как проверить: Вы видите список занятых портов, интерфейсов и свободное место.

Если не получилось: Если порт занят, не останавливайте неизвестный процесс. Узнайте, какая служба его использует.

ШАГ 04 / 20

Устанавливаем 3x-ui из официального репозитория

Зачем это нужно

Установка панели должна быть воспроизводимой и безопасной.

Что делать

На чистом тестовом VPS откройте README официального репозитория 3x-ui, прочитайте Installation и выполните актуальную команду из README. Не копируйте устаревшие скрипты из сторонних блогов. После установки задайте уникальные логин, пароль и путь панели.

Команды для терминала

systemctl status x-ui --no-pager

✓ Как проверить: Служба x-ui активна; веб-панель открывается по настроенному защищённому адресу.

Если не получилось: Если не открывается — проверьте systemctl status x-ui, порт и правила провайдера.

Первоисточник: https://github.com/MHSanaei/3x-ui

ШАГ 05 / 20

Защищаем административную панель

Зачем это нужно

Панель позволяет выдавать доступ к VPN; открытая админка — риск компрометации.

Что делать

Смените стандартные учётные данные, включите HTTPS через поддерживаемый способ, ограничьте доступ по IP или VPN и включите 2FA, если доступно в версии. Не используйте тот же порт, что Xray.

Команды для терминала

ss -lntup | grep -E "x-ui|:443|:80" || true

✓ Как проверить: Войти можно только по защищённому адресу с вашими учётными данными.

Если не получилось: Не публикуйте адрес панели вместе с логином и паролем.

Первоисточник: https://github.com/MHSanaei/3x-ui

ШАГ 06 / 20

Выбираем межсерверный транспорт

Зачем это нужно

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

Что делать

Для понятной и проверяемой схемы используйте WireGuard между VPS №1 и VPS №2, а Xray на входном сервере направляйте через этот туннель. В этой статье показана сетевая часть; способ привязки Xray к туннелю зависит от панели и версии.

✓ Как проверить: Вы выбрали WireGuard и понимаете, что это отдельный компонент.

ШАГ 07 / 20

Устанавливаем WireGuard на оба VPS

Зачем это нужно

WireGuard создаёт зашифрованную связь между серверами.

Что делать

Выполните команду отдельно на VPS №1 и VPS №2. Установка не изменяет маршруты автоматически.

Команды для терминала

sudo apt install -y wireguard
wg --version

✓ Как проверить: Команда wg --version показывает установленную версию.

Если не получилось: Если пакет недоступен, проверьте apt update и репозитории Ubuntu.

ШАГ 08 / 20

Генерируем ключи WireGuard

Зачем это нужно

У каждого VPS собственная пара ключей. Приватные ключи нельзя передавать третьим лицам.

Что делать

На КАЖДОМ сервере отдельно создайте ключи. Не копируйте один и тот же приватный ключ на оба сервера. Публичные ключи можно обменять между VPS.

Команды для терминала

sudo install -m 700 -d /etc/wireguard
umask 077
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey >/dev/null
sudo cat /etc/wireguard/publickey

✓ Как проверить: На каждом сервере есть разные публичные ключи.

Если не получилось: Никогда не вставляйте privatekey в скриншоты и публичные инструкции.

ШАГ 09 / 20

Планируем адреса туннеля

Зачем это нужно

Адреса внутри туннеля должны отличаться от Docker-сетей и домашних подсетей.

Что делать

В примере используем 10.77.77.1/30 для VPS №1 и 10.77.77.2/30 для VPS №2. Сначала проверьте, что 10.77.77.0/30 не используется в вашей инфраструктуре.

Команды для терминала

ip -4 route
docker network ls 2>/dev/null || true

✓ Как проверить: Подсеть не пересекается с существующими маршрутами.

Если не получилось: Если пересекается, выберите другую частную /30 подсеть и замените адреса в обоих конфигурациях.

ШАГ 10 / 20

Настраиваем WireGuard на VPS №2

Зачем это нужно

Выходной сервер принимает зашифрованный трафик от первого VPS.

Что делать

Создайте /etc/wireguard/wg0.conf на VPS №2: Interface Address=10.77.77.2/30, ListenPort=51820, PrivateKey=его приватный ключ; Peer PublicKey=публичный ключ VPS №1, AllowedIPs=10.77.77.1/32. Ключи подставляйте из локальных файлов. Не копируйте текст с угловыми скобками буквально.

Команды для терминала

sudo nano /etc/wireguard/wg0.conf
sudo chmod 600 /etc/wireguard/wg0.conf

✓ Как проверить: Файл существует и доступен только root.

Если не получилось: Если nano не установлен, установите sudo apt install -y nano.

ШАГ 11 / 20

Настраиваем WireGuard на VPS №1

Зачем это нужно

Входной сервер должен знать, куда отправлять пакеты второго сервера.

Что делать

Создайте /etc/wireguard/wg0.conf на VPS №1: Interface Address=10.77.77.1/30, PrivateKey=его приватный ключ; Peer PublicKey=ключ VPS №2, Endpoint=публичный_IP_VPS2:51820, AllowedIPs=10.77.77.2/32, PersistentKeepalive=25. Не ставьте AllowedIPs=0.0.0.0/0 на этапе проверки: можно потерять SSH.

Команды для терминала

sudo nano /etc/wireguard/wg0.conf
sudo chmod 600 /etc/wireguard/wg0.conf

✓ Как проверить: В конфигурации VPS №1 указан публичный адрес VPS №2.

Если не получилось: Проверьте отсутствие лишних пробелов в ключах и правильность Endpoint.

ШАГ 12 / 20

Запускаем туннель и проверяем handshake

Зачем это нужно

Handshake показывает, что серверы договорились о ключах.

Что делать

Сначала разрешите UDP 51820 в firewall провайдера на VPS №2 только с IP VPS №1. Затем на обоих VPS запустите wg-quick@wg0.

Команды для терминала

sudo systemctl enable --now wg-quick@wg0
sudo wg show
ping -c 3 10.77.77.2

✓ Как проверить: На VPS №1 в wg show виден latest handshake и ping до 10.77.77.2 проходит.

Если не получилось: Если handshake отсутствует, проверьте UDP firewall, Endpoint и пары публичных ключей.

ШАГ 13 / 20

Разрешаем маршрутизацию на VPS №2

Зачем это нужно

Чтобы VPS №2 стал выходом в интернет, ядро должно пересылать пакеты.

Что делать

На VPS №2 включите net.ipv4.ip_forward. Перед NAT узнайте имя внешнего интерфейса (например, ens3) через ip route. Не вставляйте ens3 без проверки.

Команды для терминала

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/90-pelmeni-forward.conf
sudo sysctl --system
ip route get 1.1.1.1

✓ Как проверить: net.ipv4.ip_forward = 1; известен внешний интерфейс.

Если не получилось: Если используется собственный firewall, сохраните его конфигурацию перед изменениями.

ШАГ 14 / 20

NAT на выходном VPS

Зачем это нужно

Частные адреса WireGuard не маршрутизируются напрямую в интернет.

Что делать

На VPS №2 нужен SNAT/MASQUERADE для подсети туннеля через внешний интерфейс. В Ubuntu это можно сделать через nftables, но правила зависят от действующего firewall. Сначала изучите текущие правила; не сбрасывайте их.

Команды для терминала

sudo nft list ruleset
ip route get 1.1.1.1

✓ Как проверить: Вы видите действующие правила и можете добавить узкое правило MASQUERADE без удаления других.

Если не получилось: Не выполняйте nft flush ruleset: это может оборвать SSH и другие сервисы.

ШАГ 15 / 20

Направляем трафик Xray в туннель

Зачем это нужно

Один только WireGuard не означает, что клиенты VPN идут через VPS №2.

Что делать

В Remnawave используйте поддерживаемый механизм outbound/routing для ноды, в 3x-ui — раздел Xray Outbounds и Routing (названия зависят от версии). Для маршрутизации через системный WireGuard нужен отдельный outbound или политика маршрутизации; не меняйте default route VPS без консоли восстановления.

✓ Как проверить: Тестовый клиент использует нужный outbound; SSH к VPS №1 не теряется.

Первоисточник: https://github.com/MHSanaei/3x-ui

ШАГ 16 / 20

Проверяем работу через внешний IP

Зачем это нужно

Внешний IP показывает, через какой сервер трафик покидает сеть.

Что делать

На телефоне с включённым VPN откройте сервис определения IP. В каскаде адрес должен совпадать с публичным IP VPS №2, в одиночной схеме — с IP VPN-сервера. Также проверьте DNS и IPv6, если они включены.

Команды для терминала

curl -4 https://api.ipify.org; echo

✓ Как проверить: Адрес соответствует ожидаемому выходному узлу.

Если не получилось: Если виден IP провайдера телефона — VPN не используется или приложение настроено на обход.

ШАГ 17 / 20

Проверяем журналы и ошибки

Зачем это нужно

По логам можно отличить ошибку авторизации от ошибки сети.

Что делать

В Remnawave откройте журналы ноды и контейнеров; в 3x-ui — журналы x-ui/Xray. Проверяйте только последние строки и не публикуйте полные логи с токенами и адресами клиентов.

Команды для терминала

sudo journalctl -u x-ui -n 80 --no-pager

✓ Как проверить: Нет повторяющихся критических ошибок при тестовом подключении.

Если не получилось: Если встречается bind: address already in use — порт уже занят; если invalid config — проверьте поля inbound.

ШАГ 18 / 20

Типовые проблемы и порядок диагностики

Зачем это нужно

Бессистемная замена настроек обычно ухудшает ситуацию.

Что делать

Проверяйте по цепочке: DNS → доступность порта → состояние панели/ноды → Xray inbound → ключи и SNI → маршрут/туннель → DNS клиента. После каждого исправления меняйте только один параметр и повторяйте тест.

Команды для терминала

getent hosts example.com
ss -lntup
ip route

✓ Как проверить: Вы определили конкретный этап, на котором соединение ломается.

Если не получилось: Если всё работало до изменения, восстановите резервную копию этого изменения.

ШАГ 19 / 20

Резервные копии и обновления

Зачем это нужно

Без копии настроек обновление может привести к потере пользователей и ключей.

Что делать

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

✓ Как проверить: Есть резервная копия и записанная процедура восстановления.

Первоисточник: https://github.com/MHSanaei/3x-ui

ШАГ 20 / 20

Финальная проверка и памятка читателю

Зачем это нужно

Готовая инструкция должна завершаться воспроизводимым результатом.

Что делать

Проверьте подключение с мобильного интернета и Wi-Fi, внешний IP, DNS, доступность сайта, перезапуск служб и возможность войти по SSH. Запишите версии Xray, панели и Ubuntu, порты и даты обновления — без паролей и приватных ключей.

✓ Как проверить: Другой человек может повторить настройку по вашей записи, а вы можете восстановить доступ после ошибки.

Дополнительные официальные источники

Xray / XTLS · WireGuard Quick Start · Ubuntu Server

Практикум: от чистого VPS до проверки

Ниже не общие советы, а действия с командами, ожидаемыми результатами и диагностикой. Все примеры выполняйте на отдельных тестовых VPS, не на сервере с работающими сервисами.

Подготовьте чистый тестовый сервер

Что это и зачем

Рабочий сервер с действующим VPN нельзя использовать как полигон: установщик может занять порт или изменить сеть.

Действия по порядку

  1. Возьмите отдельный VPS с Ubuntu 24.04 и публичным IPv4.
  2. Сохраните IP, логин SSH и способ входа через веб-консоль провайдера.
  3. Подключитесь через Termius: Host = IP, Port = 22 (или указанный провайдером), Username = root либо выданный пользователь.
  4. Перед первым подключением проверьте отпечаток SSH-ключа по консоли провайдера.

Команда или пример конфигурации

whoami && cat /etc/os-release && uname -m
ss -lntup

Правильный результат: Видна Ubuntu, архитектура и список уже занятых портов.

Если возникла ошибка: Если порт 443 занят, не останавливайте процесс вслепую: нужен другой VPS или согласованная схема с веб-сервером.

Подготовьте необходимые утилиты

Что это и зачем

Пакетный менеджер apt ставит программы из репозиториев Ubuntu. Обновление списка пакетов не равно обновлению всей ОС.

Действия по порядку

  1. Убедитесь, что подключены к нужному тестовому VPS.
  2. Вставьте команды по одной.
  3. Дождитесь завершения apt; не закрывайте терминал во время установки.

Команда или пример конфигурации

sudo apt update
sudo apt install -y curl ca-certificates openssl jq nano dnsutils

Правильный результат: Команда curl --version показывает версию.

Если возникла ошибка: Если apt сообщает о блокировке, дождитесь завершения автоматического обновления; не удаляйте lock-файлы.

Подготовьте домен и DNS

Что это и зачем

A-запись связывает доменное имя с IPv4. REALITY может использовать чужой target для маскировки, но собственный сайт требует своего домена.

Действия по порядку

  1. В личном кабинете регистратора откройте DNS-зону.
  2. Создайте A-запись vpn.example.com, указывающую на IP вашего VPS.
  3. Подождите распространения DNS и проверьте ответ.
  4. Во всех следующих примерах заменяйте 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 нужен свободный входной порт; панель управления должна работать отдельно.

Действия по порядку

  1. На сервере посмотрите занятые TCP-порты.
  2. Выберите свободный порт, например 24443; проверьте, что провайдер разрешает входящие TCP на нём.
  3. Не открывайте административный порт панели всем подряд: ограничьте его по IP либо используйте SSH-туннель.

Команда или пример конфигурации

sudo ss -lntp | grep -E ":(22|80|443|24443|2053)\b" || true

Правильный результат: Выбранный порт не занят; SSH остаётся доступным.

Если возникла ошибка: Если команда показывает LISTEN на выбранном порту, выберите другой и используйте его одинаково в панели и клиенте.

Установите 3x-ui официальным способом

Что это и зачем

3x-ui управляет Xray через браузер. Установщик из официального репозитория создаёт случайные реквизиты и путь панели.

Действия по порядку

  1. Убедитесь, что это новый VPS без другой панели.
  2. Откройте официальную страницу установки https://docs.sanaei.dev/ru/docs/guide/installation/ и сравните команду с приведённой.
  3. Выполните команду. Сохраните выданные логин, пароль, порт и web base path в менеджер паролей.
  4. Откройте выданный URL только через защищённый доступ; до публикации настройте HTTPS или SSH-туннель.

Команда или пример конфигурации

bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
sudo systemctl status x-ui --no-pager

Правильный результат: Служба x-ui active (running), меню x-ui доступно.

Если возникла ошибка: Если installer не стартует, проверьте curl и DNS. Если веб-панель не открывается, проверьте порт, путь и правила firewall провайдера.

Безопасно войдите в панель

Что это и зачем

Незащищённый HTTP передаёт пароль без TLS. Пока HTTPS не настроен, используйте локальный SSH-туннель или консоль провайдера.

Действия по порядку

  1. Выполните x-ui и посмотрите текущие параметры панели.
  2. Смените логин и пароль, включите 2FA, если доступна.
  3. Настройте сертификат TLS согласно разделу First login официальной документации.
  4. Не публикуйте в открытом доступе URL административной панели и секреты.

Команда или пример конфигурации

sudo x-ui
sudo journalctl -u x-ui -n 40 --no-pager

Правильный результат: Вход возможен с новым паролем; соединение HTTPS не выдаёт предупреждение о сертификате.

Если возникла ошибка: При потере учётных данных используйте меню x-ui в SSH, а не переустановку с потерей базы.

Создайте inbound VLESS + REALITY

Что это и зачем

Inbound — точка, в которую подключается клиент. В REALITY сервер хранит private key, а клиент получает public key.

Действия по порядку

  1. В 3x-ui откройте Inbounds → Add inbound.
  2. Protocol: VLESS; Remark: Reality-test; Listen IP: пусто; Port: 24443 (или ваш свободный порт).
  3. Transmission: TCP / RAW (название зависит от версии). Security: REALITY. Flow для клиента: xtls-rprx-vision.
  4. В настройках REALITY создайте пару x25519 ключей, Short ID и задайте Server Names (SNI) и target:443 одного доступного TLS-сайта. Выбирайте target, разрешённый вашей сетью и совместимый с REALITY; проверьте его доступность.
  5. Создайте одного клиента с новым UUID, сохраните inbound.

Правильный результат: В списке inbound виден порт 24443, VLESS, REALITY и один клиент.

Если возникла ошибка: Если настройки не сохраняются, проверьте обязательные поля, тип транспорта и логи Xray; не вставляйте приватный ключ в клиент.

Экспортируйте клиентскую ссылку

Что это и зачем

Ссылка содержит UUID, публичный ключ, SNI, shortId, порт и flow. Ошибка в одном параметре нарушает подключение.

Действия по порядку

  1. В строке inbound откройте список Clients и нажмите QR или Copy link.
  2. Импортируйте ссылку в v2rayNG или другой совместимый Xray-клиент.
  3. Проверьте: security=reality; pbk = public key; sid = short ID; sni = serverName; flow = xtls-rprx-vision; port = порт inbound.
  4. Включите VPN и откройте сайт проверки IP.

Команда или пример конфигурации

curl -4 https://api.ipify.org; echo
sudo journalctl -u x-ui -n 80 --no-pager

Правильный результат: При подключении виден IP VPS, а не IP мобильного оператора.

Если возникла ошибка: Если не подключается: проверьте сетевой экран провайдера, порт, SNI, publicKey, shortId и журналы Xray.

Схема каскада без изменения default route

Что это и зачем

Чтобы не потерять SSH, нельзя наугад перенаправлять весь трафик VPS A в WireGuard. Безопаснее сначала создать отдельный туннель A↔B и направлять через него только исходящие соединения Xray.

Действия по порядку

  1. Назовите VPS A входным сервером, VPS B выходным.
  2. Публичный IP B — тот, который должен видеть сайт проверки IP.
  3. Межсерверная подсеть примера 10.77.77.0/30: A = 10.77.77.1, B = 10.77.77.2.
  4. На обоих VPS проверьте пересечения с Docker и другими VPN-сетями.

Команда или пример конфигурации

ip -4 route
sudo apt update && sudo apt install -y wireguard
sudo install -d -m 700 /etc/wireguard
umask 077
wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey >/dev/null
sudo cat /etc/wireguard/publickey

Правильный результат: На A и B созданы разные ключи; публичные ключи можно обменять.

Если возникла ошибка: Не публикуйте /etc/wireguard/privatekey. Не выполняйте wg-quick up до проверки обоих конфигов.

Создайте конфигурацию туннеля на VPS B

Что это и зачем

B принимает UDP-соединение от A. В этом минимальном туннеле не включается системная переадресация всего трафика; для выхода Xray используется отдельный SOCKS-прокси на B.

Действия по порядку

  1. Сохраните публичный ключ A.
  2. На B создайте /etc/wireguard/wg0.conf. Вместо меток подставьте реальные ключи.
  3. В firewall провайдера B разрешите UDP 51820 только с публичного IP A.
  4. Проверьте конфигурацию перед запуском.

Команда или пример конфигурации

[Interface]
Address = 10.77.77.2/30
ListenPort = 51820
PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_B>

[Peer]
PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_A>
AllowedIPs = 10.77.77.1/32

Правильный результат: Файл chmod 600, ключи не содержат угловых скобок.

Если возникла ошибка: Команды с угловыми скобками — образец, не вставляйте буквально.

Создайте конфигурацию туннеля на VPS A

Что это и зачем

A знает публичный адрес B и шифрует трафик к внутреннему адресу 10.77.77.2.

Действия по порядку

  1. Сохраните публичный ключ B.
  2. На A создайте /etc/wireguard/wg0.conf.
  3. В Endpoint укажите настоящий публичный IP B и порт 51820.
  4. Установите права 600 и запустите туннель на обоих серверах.

Команда или пример конфигурации

[Interface]
Address = 10.77.77.1/30
PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_A>

[Peer]
PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_B>
Endpoint = <ПУБЛИЧНЫЙ_IP_B>:51820
AllowedIPs = 10.77.77.2/32
PersistentKeepalive = 25

Правильный результат: После sudo wg-quick up wg0 на обоих серверах команда ping -c 3 10.77.77.2 с A получает ответы.

Если возникла ошибка: Если handshake нет: проверьте UDP 51820, Endpoint, ключи и AllowedIPs. Не меняйте default route VPS.

Проверка WireGuard до настройки Xray

Что это и зачем

Если туннель не работает, каскад через него не заработает.

Действия по порядку

  1. На B выполните sudo wg-quick up wg0, затем на A ту же команду.
  2. На A запустите ping и wg show.
  3. На B проверьте, что виден peer A.
  4. Только после этого настраивайте SOCKS и Xray.

Команда или пример конфигурации

sudo chmod 600 /etc/wireguard/wg0.conf
sudo wg-quick up wg0
sudo wg show
ping -c 3 10.77.77.2

Правильный результат: Есть latest handshake и растут transfer rx/tx.

Если возникла ошибка: Если wg0 уже поднят, wg-quick up сообщит об ошибке существующего интерфейса — проверьте ip addr show wg0.

Выход через B: SOCKS только внутри туннеля

Что это и зачем

Для каскада Xray на A должен передавать исходящие запросы на B. Один вариант — SOCKS inbound Xray на B, доступный только по 10.77.77.2:10808; затем SOCKS outbound Xray на A. Это не то же самое, что обычная цепочка из двух VLESS inbound.

Действия по порядку

  1. На B установите Xray через выбранную панель и создайте SOCKS inbound: listen 10.77.77.2, port 10808, auth no auth, UDP выключен для первого теста.
  2. На B ограничьте порт 10808 межсерверной сетью; никогда не публикуйте неаутентифицированный SOCKS в интернет.
  3. На A добавьте в Xray outbound с protocol socks и settings.servers address 10.77.77.2 port 10808.
  4. В правилах routing направьте трафик тестового VLESS inbound в outbound с tag exit-b.
  5. Для DNS и UDP потребуется отдельная проработка: этот пример рассчитан на TCP.

Команда или пример конфигурации

{
  "tag": "exit-b",
  "protocol": "socks",
  "settings": {
    "servers": [{"address": "10.77.77.2", "port": 10808}]
  }
}

Правильный результат: После применения профиля на A TCP-трафик клиента выходит с публичного IP B.

Если возникла ошибка: Если нет подключения: с A проверьте nc -vz 10.77.77.2 10808, журналы Xray на обоих VPS и наличие маршрута в routing. Формат добавления outbound различается между версиями панелей.

Проверьте каскад с телефона

Что это и зачем

Внешний IP позволяет проверить выходной сервер, но не доказывает отсутствие утечек DNS или IPv6.

Действия по порядку

  1. Подключите телефон к входному VLESS на A.
  2. Откройте сайт определения IPv4. Ожидается IP B.
  3. Проверьте DNS и IPv6; если они не маршрутизируются через B, настройте их отдельно или явно отключите соответствующий тип трафика у клиента.
  4. На A и B посмотрите журналы во время подключения.

Команда или пример конфигурации

curl -4 https://api.ipify.org; echo
sudo wg show
sudo ss -lntp | grep 10808 || true

Правильный результат: На телефоне IPv4 совпадает с B, а в wg show увеличиваются счётчики.

Если возникла ошибка: Если IP A — правило маршрутизации не применилось. Если соединение не работает — проверьте SOCKS B и WG.

Границы примера: эта конфигурация не проверялась на вашем VPS. Для каскада показана воспроизводимая схема TCP через SOCKS и WireGuard; UDP, DNS и IPv6 требуют отдельной настройки. Selfsteal зависит от поддерживаемого target и схемы локального HTTPS. Не публикуйте страницу как гарантию готовой настройки без теста на чистых серверах.

Практический пример: 3x-ui и VLESS REALITY

На чистом Ubuntu 24.04 (не на сервере с действующим Caddy) проверьте порты: ss -lntup. Скачайте официальный установщик: curl -fsSL https://raw.githubusercontent.com/MHSanaei/3x-ui/master/install.sh -o install.sh. Изучите less install.sh, затем выполните bash install.sh. Сохраните случайные логин, пароль, порт и путь, которые покажет установщик.

В панели откройте Inbounds → Add Inbound. Выберите VLESS, свободный TCP-порт, Transport TCP/raw, Security REALITY. Для базового варианта задайте dest www.microsoft.com:443, serverNames www.microsoft.com, сгенерируйте x25519 и short ID. Создайте клиента с UUID и flow xtls-rprx-vision. Скопируйте ссылку через меню клиента и импортируйте в v2rayNG или другой совместимый клиент. Откройте страницу определения IP и убедитесь, что отображается адрес VPS.

Это пример базового REALITY. Он не является законченным Selfsteal: для Selfsteal нужен отдельный контролируемый веб-ресурс и проверенная схема fallback, совместимая с вашей версией Xray.

Практический пример: Remnawave

Remnawave Panel не содержит Xray: для обработки подключений нужна Remnawave Node. На отдельном сервере панели установите Docker Compose, создайте /opt/remnawave, скачайте официальные docker-compose-prod.yml и .env.sample. Сгенерируйте секреты APP_SECRET, METRICS_PASS, WEBHOOK_SECRET_HEADER, смените пароль Postgres и укажите FRONT_END_DOMAIN и SUB_PUBLIC_DOMAIN. Запустите docker compose up -d. Обязательно настройте HTTPS reverse proxy; не выставляйте внутренние сервисы наружу.

На другом VPS в панели Nodes → Management → + создайте Node, скопируйте предложенный compose, запустите его в /opt/remnanode. Создайте Config Profile с VLESS REALITY inbound, назначьте профиль ноде. В Hosts создайте адрес подключения, выберите inbound; в Internal Squads включите этот inbound, создайте пользователя и назначьте ему Squad. Только после этого проверяйте подписку в клиенте.

Официальные руководства: Node, Config Profiles, Hosts.

Каскад: критерий правильной настройки

Каскад A → B не появляется от добавления двух серверов в панель. На B должен быть отдельный inbound для A. На A должен быть outbound с адресом B, UUID, публичным REALITY-ключом, short ID и SNI. Правило routing на A должно отправлять клиентский inbound в этот outbound. Важно исключить циклическую маршрутизацию B → A.

Проверка: подключитесь клиентом к A, откройте внешний IP. Он должен совпадать с публичным IP B. Затем временно отключите B: если строгий каскад настроен верно, подключение через A перестанет работать. Если внешний IP равен A, правило маршрутизации не применилось.

Конкретный JSON зависит от Xray-core, версии панели и транспорта. Без этих данных готовый конфиг может оказаться несовместимым, поэтому здесь не приводится фиктивный универсальный JSON.