Русский
Руководство по установке и использованию панели 3X-UI

3X-UI - веб-панель для настройки VPN на сервере. Она поддерживает протоколы VMess, VLESS, Trojan, ShadowSocks и WireGuard.
В панели можно создавать подключения, добавлять пользователей, ограничивать трафик и количество IP-адресов, а также задавать срок доступа.
Особенности 3X-UI
- Многоязычный интерфейс (английский, фарси, китайский, русский, вьетнамский, испанский)
- Поддержка множества протоколов (VMess, VLESS, Trojan, ShadowSocks, WireGuard)
- Управление несколькими пользователями
- Установка лимитов трафика, срока действия и IP-адресов
- Автоматическое управление SSL-сертификатами
- Интуитивно понятный веб-интерфейс
- Статистика использования трафика
- Возможность блокировки рекламы и маршрутизации трафика
- Поддержка технологии Reality для обхода блокировок
Процесс установки
Стандартная установка
Подключитесь к VPS по SSH под root или сначала выполните sudo -i. На Ubuntu или Debian установите curl перед запуском установщика:
bash
apt update
apt install -y curlЗатем установите 3X-UI:
bash
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)Во время установки вам будет предложено:
- Выбрать тип базы данных (для личного использования рекомендуется SQLite, пункт 1).

- Изменить настройки панели (для повышения безопасности рекомендуется ответить
y).
- Указать порт панели (рекомендуется использовать нестандартный порт).

- Создать SSL-сертификат для домена или IP-адреса (рекомендуется создать как минимум для IP-адреса, пункт 2).

Установка определённой версии
Чтобы установить определённую версию панели, укажите её номер в переменной VERSION. Например, для версии v1.7.9:
bash
VERSION=v1.7.9 && bash <(curl -Ls "https://raw.githubusercontent.com/mhsanaei/3x-ui/$VERSION/install.sh") $VERSIONЭто только пример указания версии. Версия v1.7.9 устарела. Для настройки REALITY и XHTTP по инструкции ниже используйте актуальный выпуск.
Установка через Docker
- Установите Docker:
bash
bash <(curl -sSL https://get.docker.com)- Создайте папку для панели и её данных:
bash
mkdir -p 3x-ui
cd 3x-ui- Создайте в этой папке файл
compose.yamlсо следующим содержимым. Здесь используются готовый образ панели и сеть сервера, чтобы Xray мог обращаться к Nginx на VPS по адресу127.0.0.1:8443:
yaml
services:
3x-ui:
image: ghcr.io/mhsanaei/3x-ui:latest
container_name: 3x-ui
network_mode: host
restart: unless-stopped
cap_add:
- NET_ADMIN
- NET_RAW
volumes:
- ./db:/etc/x-ui
- ./cert:/root/cert
- ./acme:/root/.acme.sh- Запустите панель:
bash
docker compose up -dИли альтернативный вариант:
bash
docker run -itd \
-e XRAY_VMESS_AEAD_FORCED=false \
-v $PWD/db/:/etc/x-ui/ \
-v $PWD/cert/:/root/cert/ \
-v $PWD/acme/:/root/.acme.sh/ \
--cap-add=NET_ADMIN --cap-add=NET_RAW \
--network=host \
--restart=unless-stopped \
--name 3x-ui \
ghcr.io/mhsanaei/3x-ui:latestИспользуйте только один из этих способов. При обновлении или пересоздании контейнера сохраняйте папки db, cert и acme.
При первом запуске контейнер создаёт имя пользователя и пароль и выводит их в журнал. Посмотрите и сохраните их:
bash
docker logs 3x-ui
docker exec 3x-ui /app/x-ui setting -showВторая команда показывает порт панели и путь в её адресе. Новый контейнер сначала использует HTTP. Чтобы войти в панель через защищённое SSH-соединение, пока HTTPS ещё не настроен, выполните на своём компьютере ssh -L 18053:127.0.0.1:2053 root@YOUR_SERVER_IP, подставив IP-адрес VPS. Оставьте это SSH-соединение открытым и перейдите в браузере на http://127.0.0.1:18053/. Если в настройках указан другой порт или путь панели, замените 2053 и добавьте этот путь к адресу. После настройки сертификата домена ниже используйте HTTPS-адрес панели.
Настройка SSL-сертификата
Настроить SSL-сертификат в 3X-UI можно несколькими способами.
ACME
Для управления SSL-сертификатами с помощью ACME:
- Убедитесь, что ваш домен корректно указывает на этот сервер (т.е. А-запись в DNS настроена правильно).
- Запустите команду
x-uiв терминале, затем выберите пунктУправление SSL-сертификатами(пункт 19). - Вам будут предложены следующие варианты:
- Получить SSL (Домен): Получить SSL-сертификат для домена.
- Отозвать: Отозвать существующие SSL-сертификаты.
- Принудительное продление: Принудительно продлить SSL-сертификаты.
- Показать существующие домены: Отобразить все сертификаты доменов, доступные на сервере.
- Указать пути к сертификатам для панели: Указать сертификат для вашего домена, который будет использоваться панелью управления.
- Получить SSL-сертификат для IP-адреса: Получить SSL-сертификат для IP-адреса.
Certbot
Чтобы установить и использовать Certbot, достаточно ввести эти команды:
Для сайта self-SNI используйте шаг 3 инструкции ниже. Пример с режимом standalone рассчитан на сервер со свободным портом 80: он не работает, пока этот порт занят Nginx.
bash
apt-get install certbot -y
certbot certonly --standalone --agree-tos --register-unsafely-without-email -d yourdomain.com
certbot renew --dry-run- где
yourdomain.com- ваш домен
WARNING
В этом примере запрашивается сертификат для домена. Для его продления в режиме standalone TCP-порт 80 должен быть доступен из интернета и не занят другой программой. Не совмещайте этот способ продления с настройкой Nginx ниже: там используется режим webroot.
Вход в веб-панель
После установки сохраните адрес панели, логин и пароль в надёжном месте. Если установка прошла успешно, вы получите данные для входа в следующем формате:

Настройка подключений (Inbounds)
В разделе Inbounds создаются подключения к серверу. Для каждого подключения вы выбираете протокол, порт и способ защиты соединения. В интерфейсе панели такое подключение называется inbound.
Создание нового подключения
- Перейдите на страницу "Inbounds"
- Нажмите кнопку "Add Inbound" для создания нового подключения

- В открывшемся окне укажите понятное вам название в поле "Remark"
- Выберите тип протокола (VMess, VLESS, Trojan, ShadowSocks или WireGuard)
Настройка протоколов
Для новой настройки выполните шаги по подготовке домена и сайта ниже, затем настройте VLESS + XHTTP + REALITY на порту 443. Нужны один VPS, собственный домен и клиент с поддержкой XHTTP + REALITY. Если вы уже используете TCP/RAW, для него есть отдельные инструкции. Настраивать оба транспорта не нужно.
В этой инструкции VPN и сайт работают на одном VPS. Xray принимает VPN-подключения, а обычным посетителям показывает ваш сайт. Такой способ настройки REALITY называют self-SNI, или self-steal.
SNI - доменное имя, которое VPN-приложение передаёт серверу при подключении. Здесь вы укажете домен своего сайта. Настройки Xray задаются через веб-панель 3X-UI.
Используйте свой домен
Не указывайте домены чужих сайтов в SNI и Target, даже если панель предлагает их автоматически. Использование чужого сайта для такой настройки без разрешения владельца может нарушать его условия использования. Перенаправление трафика на чужой сайт также может вызвать жалобы и ухудшить репутацию IP-адреса вашего сервера. Используйте домен и сайт, которыми управляете сами. Self-SNI не гарантирует защиту от блокировок.
Страницы сайта отдаёт веб-сервер Nginx. Порты распределяются так:
| Адрес и порт | Программа | Назначение |
|---|---|---|
Порт 80 | Nginx | Сайт по HTTP, получение и продление сертификата |
Порт 443 | Xray | VPN-подключения и посещения сайта по HTTPS |
127.0.0.1:8443 | Nginx | Сайт по HTTPS, доступный только с самого VPS |
Для TCP/RAW и XHTTP используйте публичный TCP-порт 443 как основной вариант. Нестандартные порты могут фильтроваться, даже когда 443 доступен. Локальный порт Nginx 8443 используется отдельно, открывать его в интернет не нужно.
В этой инструкции Xray работает на порту 443. VPN-подключения он обрабатывает сам, а обычные посещения сайта по HTTPS перенаправляет в Nginx по адресу 127.0.0.1:8443. Этот адрес и нужно указать в поле Target. Подробнее о таком перенаправлении - в документации REALITY.
Настройка self-SNI / self-steal
Инструкции по настройке домена и сайта подходят и для других приложений на основе Xray. Если вы управляете сервером через другое приложение, сначала прочитайте раздел «Другие варианты настройки Xray»: порты и параметры подключения могут отличаться.
1. Подготовьте домен и сервер
Для этих шагов нужен VPS с Ubuntu 22.04/24.04 или Debian 12 и установленной панелью 3X-UI. Пример рассчитан на сервер, где ещё нет сайта. Если сайты уже работают, учитывайте их настройки при добавлении новой конфигурации Nginx.
Инструкция проверена на Ubuntu 24.04, с 3X-UI 3.11.0 и Xray 26.10.21, при обычной установке и в Docker. В других версиях названия полей и расположение вкладок могут отличаться.
Если домена ещё нет, вы можете зарегистрировать его у нас. Самый доступный вариант у нас - домен в зоне .top: от €1.99 за первый год, продление - €6.69 в год.
Выберите свой домен или поддомен, например site.example.com. Везде ниже заменяйте site.example.com своим доменным именем, в том числе в путях к файлам. В поле SNI не нужно добавлять https://.
Выберите нейтральное имя
Не используйте vpn или vless в имени домена или поддомена. Например, не выбирайте vpn.example.com, vless.example.com или my-vpn.example.com. Подойдёт нейтральное имя вроде site.example.com. Так имя не будет прямо указывать на назначение подключения, но это не гарантирует защиту от блокировок.
Если вы купили домен у нас, вы можете воспользоваться нашим бесплатным DNS-хостингом. Услуга не подключается автоматически при покупке домена. Если у вас ещё нет DNS-хостинга, закажите его отдельно и дождитесь активации. Логин и пароль для панели DNSmanager придут на почту.
После получения доступа настройте домен и создайте A-запись, которая свяжет его с IP-адресом VPS. Действия описаны ниже, а подробнее о работе с панелью можно прочитать в руководстве по DNS-хостингу.
- В настройках домена в личном кабинете укажите серверы имён
ns1.senkodns.netиns2.senkodns.net. Если вы переносите существующий домен, до смены серверов имён скопируйте его текущие записи для сайта и почты в новый DNS-сервис. - Войдите в DNSmanager по данным из письма об активации DNS-хостинга. В разделе Главное → Доменные имена добавьте основной домен (например,
example.com), если его ещё нет в списке: выберите тип master, укажите публичный IPv4-адрес VPS и email администратора, затем сохраните. - Выделите домен, нажмите Записи → Создать и заполните поля ниже. Если A-запись с таким именем уже есть, отредактируйте её вместо создания новой.
| Поле | Значение для site.example.com |
|---|---|
| Имя | site |
| Тип | A |
| IP-адрес | Публичный IPv4-адрес VPS из сведений о сервере в личном кабинете |
| TTL | Оставьте значение по умолчанию |
- Нажмите Ok. Проверьте, что у
site.example.comтеперь одна A-запись с IPv4-адресом вашего VPS. Эта инструкция настраивает только IPv4: удалите существующие AAAA- или CNAME-записи для выбранного имени сайта. Записи других имён, в том числе почтовые, NS и SOA, оставьте как есть. - Дождитесь, пока изменения DNS вступят в силу. После смены серверов имён это может занять до 72 часов. На DNSChecker введите своё доменное имя и выберите тип записи A. Прежде чем получать сертификат, убедитесь, что домен указывает на IPv4-адрес вашего VPS.
Основной домен или другой DNS-провайдер
Для самого example.com отредактируйте A-запись, которую DNSmanager создал при добавлении домена. Если её нужно создать, в поле Имя укажите example.com. с точкой в конце. Точка нужна, когда вы вводите домен целиком. Если вводите только site, добавлять точку не нужно. Во всех следующих шагах используйте выбранный домен или поддомен.
У другого DNS-провайдера создайте аналогичную A-запись. Если он предлагает CDN/прокси, выберите режим «только DNS». Убедитесь, что у выбранного имени нет существующей AAAA- или CNAME-записи, ведущей на другой адрес.
Разрешите входящие подключения на TCP-порты 80 и 443 в файрволе сервера и в панели хостинга. Не закрывайте порты SSH и панели 3X-UI. Порт 8443 должен оставаться доступным только внутри сервера. Порт 443 понадобится Xray: убедитесь, что его не занимает панель или другое подключение.
Подключитесь к VPS по SSH и выполняйте команды ниже в терминале сервера, по одному блоку за раз. Если вы вошли не под пользователем root, сначала выполните sudo -i.
Установка через Docker
Эти настройки подходят и для 3X-UI в Docker, если контейнер использует сеть сервера (--network=host или network_mode: host). В режиме Docker bridge адрес 127.0.0.1 указывает на сам контейнер, поэтому Xray не сможет обратиться по нему к Nginx, установленному на VPS.
2. Создайте небольшой сайт
Используем Aerial от HTML5 UP - готовую личную страницу с фоновым изображением и ссылками на соцсети. Команды ниже скачают шаблон прямо на VPS. По условиям бесплатной лицензии нужно сохранить ссылку на HTML5 UP внизу страницы и файл лицензии из архива.
Установите Nginx, Certbot (программу для получения сертификата), текстовый редактор и программу для распаковки ZIP:
bash
apt update
apt install -y nginx certbot nano curl unzip
mkdir -p /var/www/self-sniСкачайте и распакуйте шаблон. При распаковке файлы с совпадающими именами в /var/www/self-sni будут перезаписаны. Эта папка предназначена для сайта из нашей инструкции:
bash
curl -fL --retry 3 https://html5up.net/aerial/download -o /tmp/self-sni-aerial.zip &&
unzip -o /tmp/self-sni-aerial.zip -d /var/www/self-sniОбе команды должны завершиться без ошибок. Оставьте папку assets рядом с index.html: в ней находятся стили и изображения страницы.
Откройте страницу в редакторе, чтобы заменить текст своим:
bash
nano /var/www/self-sni/index.htmlВ <title> укажите название страницы, в <h1> - своё имя или название проекта, а в <p> - короткое описание. В ссылках на соцсети замените # внутри href="#" на адреса своих страниц. Ненужные ссылки можно удалить вместе со строками <li>...</li>. Ссылку на HTML5 UP внизу страницы оставьте.
Нажмите Ctrl+O и Enter, чтобы сохранить файл, затем Ctrl+X, чтобы выйти из nano. Эти же сочетания клавиш пригодятся при редактировании следующих файлов.
Откройте новый файл конфигурации Nginx:
bash
nano /etc/nginx/conf.d/self-sni.confВставьте настройки, заменив домен своим:
nginx
server {
listen 80;
server_name site.example.com;
root /var/www/self-sni;
index index.html;
}Сохраните файл, проверьте настройки и примените их:
bash
nginx -t && systemctl enable --now nginx && systemctl reload nginxОткройте http://site.example.com в браузере. Вы должны увидеть свою страницу. Если она не открывается, проверьте DNS-запись и порт 80, прежде чем продолжать. Описание этих настроек есть в руководстве Nginx для начинающих.
3. Включите HTTPS для сайта
Выполните команду ниже, указав свой домен вместо site.example.com. Certbot попросит ввести email и принять условия использования Let's Encrypt:
bash
certbot certonly --webroot -w /var/www/self-sni --cert-name site.example.com -d site.example.comПосле сообщения об успешном получении сертификата снова откройте /etc/nginx/conf.d/self-sni.conf через nano и добавьте второй блок после первого:
nginx
server {
listen 127.0.0.1:8443 ssl http2;
server_name site.example.com;
root /var/www/self-sni;
index index.html;
ssl_certificate /etc/letsencrypt/live/site.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
}Этот блок настраивает HTTPS с поддержкой TLS и HTTP/2 по адресу 127.0.0.1:8443. Для Nginx 1.25.1 и новее замените listen 127.0.0.1:8443 ssl http2; на listen 127.0.0.1:8443 ssl;, а на отдельной строке добавьте http2 on;.
Сохраните файл и выполните команды ниже. Они применят настройки Nginx и проверят, открывается ли сайт по HTTPS с самого VPS:
bash
nginx -t && systemctl reload nginx
curl --fail --http2 --tlsv1.3 --resolve site.example.com:8443:127.0.0.1 https://site.example.com:8443/ -w '\nHTTP version: %{http_version}\n'Команда curl должна вывести HTML-код вашей страницы без ошибок сертификата и завершиться строкой HTTP version: 2. Так проверяется поддержка TLS 1.3 и HTTP/2, необходимая для REALITY. Если появилась ошибка или версия отличается от 2, сначала устраните проблему и только потом продолжайте.
Предупреждения при проверке локального Target в 3X-UI
При нажатии Scan рядом с Target 127.0.0.1:8443 панель может сообщить, что адрес находится в частной сети и недоступен из интернета. Это нормально, поскольку Xray подключается к сайту локально.
Если в результате указано SNI used: 127.0.0.1, также могут появиться сообщения certificate not trusted или cannot validate certificate for 127.0.0.1 because it doesn't contain any IP SANs. Проверка сравнивает сертификат с IP-адресом, хотя сертификат выдан для вашего домена.

Оставьте Target равным 127.0.0.1:8443, а в SNI / Server Names укажите свой домен. Команда curl --resolve выше подключается к тому же локальному адресу, но использует домен для SNI и проверки сертификата. Если она выполняется успешно, несовпадение IP-адреса при сканировании не означает проблему с сертификатом. Если команда завершается ошибкой, устраните её причину. Не отключайте проверку сертификата и не игнорируйте предупреждения о сертификате при открытии сайта по домену.
Настройте автоматическое продление сертификата. После продления Nginx будет перечитывать настройки, чтобы использовать новый сертификат:
bash
mkdir -p /etc/letsencrypt/renewal-hooks/deploy
cat > /etc/letsencrypt/renewal-hooks/deploy/reload-self-sni-nginx.sh <<'EOF'
#!/bin/sh
nginx -t && systemctl reload nginx
EOF
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-self-sni-nginx.sh
systemctl enable --now certbot.timer
certbot renew --cert-name site.example.com --dry-runТест продления должен завершиться успешно. Оставьте порт 80 открытым: Let's Encrypt использует его для проверки владения доменом. Подробности - в документации Certbot. Ключи REALITY не связаны с этим сертификатом.
Проверьте также сертификат самой панели. Если вы получили его при установке или через меню ACME, для продления в режиме standalone ему тоже может понадобиться порт 80. Теперь этот порт занят Nginx. Чтобы избежать конфликта при продлении, можно использовать только что полученный сертификат и для панели:
- Только для Docker: добавьте строку
- /etc/letsencrypt:/etc/letsencrypt:roв разделvolumesфайлаcompose.yaml, затем выполнитеdocker compose up -dиз папки с этим файлом. Если вы используетеdocker run, пересоздайте контейнер с прежними папками данных, добавив-v /etc/letsencrypt:/etc/letsencrypt:ro. Подключайте всю папку: файлы сертификата вliveявляются символическими ссылками. - Откройте Panel Settings → Certificates. В поле Public Key Path укажите файл сертификата
/etc/letsencrypt/live/site.example.com/fullchain.pem, а в поле Private Key Path - файл закрытого ключа/etc/letsencrypt/live/site.example.com/privkey.pem, заменивsite.example.comсвоим доменным именем. Сохраните настройки и перезапустите панель. - Откройте панель по доменному имени вместо IP-адреса. Сохраните прежний порт панели и секретный путь из адреса, который вы получили при установке, например
https://site.example.com:2053/your-panel-path/. Используйте свой порт и путь. Убедитесь, что вход работает без предупреждения о сертификате. - Добавьте скрипт, который будет перезапускать панель после продления сертификата. Для обычной установки выполните:
bash
cat > /etc/letsencrypt/renewal-hooks/deploy/restart-self-sni-panel.sh <<'EOF'
#!/bin/sh
systemctl restart x-ui
EOF
chmod +x /etc/letsencrypt/renewal-hooks/deploy/restart-self-sni-panel.shДля Docker замените в этом файле systemctl restart x-ui на docker restart 3x-ui. Перезапуск панели или контейнера может ненадолго прервать VPN-подключения. Проверьте скрипт: выполните /etc/letsencrypt/renewal-hooks/deploy/restart-self-sni-panel.sh и снова войдите в панель.
Убедившись, что новый сертификат работает, отключите продление старого сертификата панели, только если он больше нигде не используется. Для acme.sh следуйте инструкции по исключению сертификата из автоматического продления. Для старого сертификата Certbot найдите его имя командой certbot certificates и удалите неиспользуемый сертификат командой certbot delete --cert-name OLD_CERT_NAME, подставив это имя. Не удаляйте новый сертификат сайта. Если сертификат панели уже продлевается через проверку DNS или другим способом, совместимым с Nginx, можно оставить прежнюю настройку.
VLESS + XHTTP + REALITY
Вариант VLESS + XHTTP + REALITY использует HTTP-запросы для передачи данных. Здесь мы настроим его с тем же собственным сайтом, что и в примере выше. Приложение будет подключаться напрямую к VPS, поэтому для домена нужен режим «только DNS», без CDN или прокси.
Продолжайте здесь после шагов 1-3 выше. Сайт уже должен проходить локальную проверку HTTPS по адресу 127.0.0.1:8443.
Используйте актуальные версии панели 3X-UI, ядра Xray и приложения с поддержкой XHTTP + REALITY. Одной поддержки VLESS недостаточно. Если XHTTP отсутствует в списке транспортов панели, сначала обновите 3X-UI.
Для подключения XHTTP используйте TCP 443. Если этот порт уже занят подключением TCP/RAW, сохраните его настройки и отключите перед включением XHTTP. Оставьте старый профиль, чтобы при необходимости вернуться к нему. Для XHTTP понадобится новая ссылка подключения.
Один IP-адрес и порт может использовать только одно входящее подключение Xray. Порт сайта 8443 оставьте локальным.
4. Настройте XHTTP в 3X-UI
Создайте отдельный путь для этого подключения в терминале сервера:
bash
openssl rand -hex 16Добавьте / в начало и конец результата, затем укажите полученное значение в XHTTP Path. Используйте тот же путь в клиенте. Эти запросы обрабатывает Xray, поэтому создавать папку на сайте или менять Nginx не нужно. Случайный путь позволяет не повторять один и тот же пример на разных серверах, но не заменяет проверку подлинности клиента.
Откройте Inbounds → Add Inbound, задайте понятное название, например XHTTP, и заполните поля:
| Поле | Значение |
|---|---|
| Protocol | VLESS |
| Address / Listen IP | 0.0.0.0 |
| Port | 443 |
| Transmission / Transport | XHTTP |
| XHTTP Path | Созданный вами путь с / в начале и конце |
| XHTTP Host | Оставьте пустым |
| XHTTP Mode | auto |
| Security | Reality |
| uTLS / Fingerprint | firefox |
| Target / Dest | 127.0.0.1:8443 |
| SNI / Server Names | Ваш домен, например site.example.com |
| Xver / PROXY protocol | 0 |
| ML-DSA-65 Seed / Verify, если поля есть | Оставьте пустыми для этой настройки |
| VLESS Encryption / Decryption, если поле есть | none |
| Client Flow, если поле есть | Оставьте пустым или выберите вариант без Flow |
Создайте пару ключей REALITY для этого подключения кнопкой Get New Cert и оставьте созданные панелью Short IDs. Поля ML-DSA-65 Seed и Verify оставьте пустыми. Не нажимайте Get New Seed. Не меняйте расширенные настройки XHTTP, включая Extra, XMUX и Download Settings. Оставьте автоматическую замену Target выключенной. Нажмите Create и перезапустите Xray, если панель это предложит.
Оставьте XHTTP Mode равным auto, а расширенные настройки - по умолчанию. Отключите обычный Mux / mux.cool в клиенте: XHTTP использует собственное мультиплексирование. Эти настройки описаны в официальном руководстве XHTTP.
Для этой конфигурации оставьте Flow пустым
Не переносите xtls-rprx-vision из инструкции для TCP/RAW. В этом примере для VLESS Encryption выбрано none, а поле Flow оставлено пустым, как в официальном примере сервера XHTTP. Соединение по-прежнему защищено REALITY. Если в вашей панели есть переключатель Disable XTLS flow (или Disable Flow), включите его для этого подключения, чтобы Flow оставался пустым.
5. Добавьте клиента и импортируйте подключение
Создайте клиента на странице Clients и выберите для него созданное подключение XHTTP. На вкладке Credentials оставьте для Flow значение None, если поле отображается. При включённом Disable XTLS flow панель может скрыть его. Затем скопируйте ссылку на подключение XHTTP или откройте его QR-код для сканирования.
Используйте актуальную версию v2rayN на Windows, macOS или Linux либо v2rayNG на Android с ядром Xray. На других платформах сначала убедитесь, что приложение явно поддерживает XHTTP + REALITY. Не все приложения из общего списка ниже подходят для XHTTP.
Импортируйте ссылку или отсканируйте QR-код, затем выберите новое подключение. Проверьте, что путь совпадает с указанным в панели.
Ручные настройки и проблемы с импортом
Если приходится вводить параметры вручную, укажите:
- адрес сервера: публичный IP-адрес или домен вашего VPS.
- порт:
443. - транспорт:
XHTTP, режим:auto, путь: полное значение, созданное выше. - защита:
REALITY, SNI: домен вашего сайта. - uTLS / Fingerprint:
firefox, VLESS Encryption:none. - Flow: оставьте пустым.
Проверьте импортированные путь и режим, даже если приложение сообщило об успешном импорте. Некоторые приложения распознают type=xhttp в ссылке, но не переносят настройки транспорта. В таком случае используйте полную JSON-конфигурацию клиента Xray в приложении с её поддержкой или клиент, который правильно импортирует ссылку XHTTP. В JSON должны быть streamSettings.network: "xhttp" и совпадающие с сервером xhttpSettings.path и xhttpSettings.mode. Импортируйте конфигурацию клиента, а не конфигурацию сервера с закрытыми ключами.
UUID, публичный ключ и Short ID должны относиться к новому подключению XHTTP. Старая ссылка TCP/RAW для него не подойдёт. Пример соответствующих параметров есть в документации Xray.
6. Проверьте сайт и VPN
- При выключенном VPN откройте в браузере
https://site.example.com. Ваш сайт должен открыться без предупреждения о сертификате. Проверяйте главную страницу, а не путь XHTTP. - Подключитесь через новый профиль XHTTP и откройте сайт. Одна проверка в браузере ещё не подтверждает работу VPN.
- Если Xray не запускается, убедитесь, что выбранный порт свободен. Если сайт работает, а VPN - нет, убедитесь, что приложение поддерживает XHTTP и использует ядро Xray. Проверьте, что путь совпадает с указанным в панели, поле Flow пустое, а ключи REALITY и Short ID взяты из нового подключения. После изменения настроек скопируйте свежую ссылку из панели и заново добавьте её в приложение.
Проверьте подключение на своих устройствах через домашний интернет и мобильную сеть, если пользуетесь обоими вариантами. Проверьте длительное скачивание и загрузку, повторное подключение после простоя и публичный IP-адрес при работе через VPN. Он должен совпадать с настроенным исходящим IP. Открытие сайта напрямую или тест VPN с самого VPS не проверяет фильтрацию между вашим устройством и сервером.
Порт 443, собственный SNI и XHTTP не гарантируют доступ через белые списки IP-адресов или доменов. Проверяйте изменения в сети, где возникает проблема, прежде чем полагаться на них.
Дополнительные настройки XHTTP
Начните с конфигурации выше и меняйте по одному параметру, проверяя результат из своей обычной сети.
- Packet-up: если в режиме
autoсоединение зависает, попробуйте выбратьpacket-upв клиенте. Если на сервере оставленauto, Xray принимает и этот режим. Он отправляет исходящие данные отдельными HTTP-запросами и может работать иначе в вашей сети. Гарантии устранения проблемы нет. Если вы также зададитеpacket-upна сервере, обновите настройки всех клиентов. - Vision с VLESS Encryption: это отдельный вариант, отличающийся от примера с
noneи пустым Flow выше. Актуальные версии 3X-UI поддерживают Vision с XHTTP при включённом VLESS Encryption. Создайте пару ключей VLESS Encryption в панели, оставьте полученное значение Decryption на сервере, а соответствующее Encryption - в конфигурациях клиентов, затем выберите для этих клиентовxtls-rprx-vision. Отключите переключатель Disable XTLS flow у подключения, если он включён. Заново экспортируйте ссылки и используйте клиенты с явной поддержкой этого сочетания. Оставьте REALITY включённым: VLESS Encryption его не заменяет. Не передавайте значение Decryption с сервера другим людям.
Ключи VLESS Encryption и пара ключей REALITY - разные настройки. Перед изменением сохраните рабочую конфигурацию. Простое добавление Vision при VLESS Encryption со значением none не соответствует описанной здесь настройке XHTTP + Vision.
Отдельный исходящий IP (необязательно)
Для этой настройки REALITY достаточно одного публичного IPv4. Второй исходящий IP необязателен: параметр sendThrough позволяет выбрать настроенный на сервере адрес для исходящего подключения Xray. Это меняет адрес, который видят посещаемые сайты, но не скрывает от вашего провайдера адрес VPN-сервера и не защищает от блокировки всей подсети. Если используете этот вариант, проверьте IPv4, IPv6 и все исходящие подключения из правил маршрутизации, а не только один сайт проверки IP.
Вариант с TCP/RAW + REALITY
Используйте эти шаги, если оставляете существующее подключение TCP/RAW или ваш клиент не поддерживает XHTTP. Настройка домена и сайта из шагов 1-3 остаётся той же.
Настройки и проверка TCP/RAW
4. Настройте подключение в 3X-UI
Откройте Inbounds → Add Inbound или отредактируйте существующее подключение VLESS. В новых версиях форма разделена на вкладки: Basics для адреса и порта, Stream для транспорта и Security для REALITY. Укажите:
| Поле | Значение |
|---|---|
| Protocol | VLESS |
| Address / Listen IP | 0.0.0.0 (принимать подключения к серверу) |
| Port | 443 |
| Transmission / Transport | TCP (в некоторых версиях называется RAW) |
| Security | Reality |
| uTLS / Fingerprint | firefox |
| Target / Dest | 127.0.0.1:8443 |
| SNI / Server Names | site.example.com - ваш домен |
| Xver / PROXY protocol | 0 (отключён) |
| ML-DSA-65 Seed / Verify, если поля есть | Оставьте пустыми для этой настройки |
Для нового подключения нажмите Get New Cert, чтобы создать пару ключей REALITY, и оставьте созданные панелью Short IDs. Для существующего подключения сохраните прежнюю пару ключей и Short IDs. В настройках клиента откройте вкладку Credentials и в поле Flow выберите xtls-rprx-vision. Описание полей есть в документации 3X-UI по REALITY.
Для этой настройки не нажимайте Get New Seed. Кнопка включает дополнительную проверку ML-DSA-65, у которой есть требования к размеру сертификата. В этой инструкции они не настраиваются. Если вы меняете подключение с включённой ML-DSA-65, очистите поля Seed и Verify и заново импортируйте обновлённую ссылку в клиент.
Используйте актуальные VPN-приложение и ядро Xray с отпечатком firefox. Старые приложения могут использовать устаревший вариант рукопожатия Firefox, который новые серверы REALITY отклоняют. Устанавливать браузер Firefox для этой настройки не нужно.
Сохраните настройки кнопкой Create или Update и перезапустите Xray через панель, если она это предложит. Если панель предлагает автоматический подбор или замену Target, оставьте эту функцию выключенной для данного подключения.
Укажите в Target адрес сайта
В поле Target укажите 127.0.0.1:8443, где работает Nginx. Если указать site.example.com:443 или 127.0.0.1:443, Xray начнёт перенаправлять подключения обратно себе. В SNI указывается только ваш домен, без порта. Оставьте Xver равным 0: эта конфигурация Nginx не принимает заголовки PROXY protocol.
5. Проверьте сайт и подключитесь
- На компьютере или телефоне откройте
https://site.example.com. Ваша страница должна открыться без предупреждения о сертификате. Так вы проверите, что Xray передаёт запросы браузера вашему сайту. Работу VPN проверим отдельно. - Создайте или выберите клиента по инструкции ниже, затем отсканируйте новый QR-код или импортируйте ссылку в VPN-приложение. Если вы изменили существующее подключение, обновите подписку или заново импортируйте ссылку, чтобы приложение получило новый SNI. В приложении должны быть указаны публичный IP-адрес или домен вашего VPS и порт
443. Адрес127.0.0.1здесь использовать нельзя. - Включите VPN и проверьте, открываются ли сайты через это подключение.
| Проблема | Что проверить |
|---|---|
| Сертификат не выдан | DNS указывает на этот VPS, прокси/CDN выключен, нет неверной AAAA-записи, TCP-порт 80 доступен. |
| Локальная проверка HTTPS не проходит | Выполните nginx -t. Проверьте домен в путях к сертификату и убедитесь, что Nginx работает. |
| Локальная проверка проходит, но сайт снаружи не открывается | Xray работает на 443, TCP-порт 443 разрешён, Target - 127.0.0.1:8443, Xver - 0. |
| Сайт открывается, но VPN не подключается | Обновите конфигурацию клиента. Проверьте SNI и Flow, используйте актуальное приложение, совместимое с вашей версией Xray. |
Другие варианты настройки Xray
Этот раздел нужен, если сервером управляет другое приложение. Одного изменения SNI может быть недостаточно: приложение также должно поддерживать нужный адрес назначения для сайта.
Настройки сервера и совместимость приложений
Для использования собственного SNI необязательно устанавливать 3X-UI. Нужен доступ к настройкам вашего VPN-сервера и доступ по SSH для размещения сайта. Одна лишь импортированная ссылка на подключение такого доступа не даёт.
Если приложение используется только как клиент, сначала настройте сайт и адрес назначения REALITY на сервере, затем импортируйте обновлённую конфигурацию клиента. Клиент подключается к публичному адресу VPS на порту 443 и передаёт ваш домен в SNI. Не указывайте 127.0.0.1:8443 как адрес сервера в клиенте: это адрес сайта, к которому обращается Xray на сервере.
Перед выполнением шагов ниже проверьте настройки сервера. Должна быть возможность задать Target / Dest отдельно от SNI и обеспечить доступ Xray к сайту. Само по себе наличие поля SNI в приложении не означает, что оно поддерживает такую настройку локального сайта.
Оставьте публичный TCP-порт 443 для VPN-подключений. Если приложение позволяет задать адрес назначения REALITY отдельно от SNI, используйте ту же схему, что и выше:
| Настройка | Значение |
|---|---|
| Xray: порт VPN | 443 |
| Nginx: локальный сайт по HTTPS | 127.0.0.1:8443 |
| Адрес назначения REALITY (Target / Dest) | 127.0.0.1:8443 |
| SNI / Server Name | Ваш домен, например site.example.com |
| Xver / PROXY protocol | 0 |
- Выполните инструкции по настройке домена и сайта из шагов 1-3 выше. Пропустите установку 3X-UI, настройку сертификата панели и скрипт её перезапуска. Продление сертификата сайта и скрипт перезагрузки Nginx оставьте.
- В настройках сервера в приложении выберите REALITY и задайте VPN-порт, адрес назначения и SNI из таблицы. Для TCP/RAW используйте
xtls-rprx-vision. Для XHTTP - настройки из раздела ниже, включая значение Flow. В этом примере используйте отпечатокfirefox. - Сохраните и примените настройки. Проверьте созданную конфигурацию сервера: в
serverNamesдолжен быть ваш домен, аtarget(илиdest) должен указывать на ваш сайт. Изменение SNI только в клиенте не заменяет адрес назначения на сервере. - Экспортируйте обновлённое подключение и импортируйте его на своих устройствах. При выключенном VPN откройте
https://site.example.comдля проверки сайта. Затем подключитесь и проверьте работу сайтов через VPN из той сети, где будете им пользоваться.
Локальный адрес из примера подходит, когда Xray работает непосредственно на VPS или использует сеть Docker host. При использовании Docker с сетью bridge адрес 127.0.0.1 относится к самому контейнеру. Нужен поддерживаемый способ доступа из контейнера к Nginx на хосте или общая внутренняя сеть Docker. Не открывайте внутренний порт сайта в интернет только ради такого доступа.
Некоторые приложения всегда используют домен-SNI:443 как адрес назначения и не позволяют отдельно выбрать порт назначения. Схему с одним IP выше нельзя перенести в такие приложения без изменений: если указать публичный порт 443 вашего VPS как адрес назначения, подключения будут возвращаться в Xray. Нужен либо поддерживаемый способ задать другой адрес назначения, либо собственный HTTPS-сайт на отдельном адресе. Во втором случае клиент по-прежнему должен подключаться к адресу VPN-сервера, а в SNI указывается домен сайта. Для размещения обоих сервисов на двух IP одного VPS каждый сервис также нужно привязать к своему IP.
Если сайт размещён на отдельном адресе, A-запись его домена должна указывать на адрес сайта, а не на адрес VPN из шага 1. Сайт должен работать по HTTPS на порту 443 с действующим сертификатом для этого домена и быть доступен из контейнера Xray. VPN оставьте на публичном порту 443 своего адреса. Одно изменение SNI не настраивает сайт и не меняет привязку портов Docker.
Для XHTTP начните с VLESS Encryption: none и пустого Flow. Некоторые приложения задают эти значения автоматически. Дополнительный вариант с Vision используйте только при поддержке VLESS Encryption с XHTTP как в настройках сервера, так и в клиенте.
Перенос публичного VPN-порта на 8443 может устранить конфликт портов, но мы не рекомендуем его как основной вариант для сетей с ограничениями. Этот порт может фильтроваться, даже когда 443 доступен. Не меняйте создаваемые приложением файлы вручную, если оно не поддерживает такой способ настройки: обновление или сохранение настроек может перезаписать изменения.
Дополнительные блокировки
Эти шаги подходят как для TCP/RAW, так и для XHTTP. Они необязательны и не заменяют настройки подключения выше.
Блокировка отдельных направлений через VPN
Можно запретить VPN-подключениям обращаться к выбранным IP-адресам и доменам. В примере ниже используются списки для России. Это может сократить обращения к сервисам, собирающим исходящий IP вашего VPN, но списки не охватывают все такие сервисы. Попавшие под правила сайты и приложения перестанут работать через VPN. Правила относятся к адресам назначения, а не к местоположению подключающихся пользователей.
Правила маршрутизации и отмена изменений
- Сохраните резервную копию конфигурации панели. В Xray Configs → Outbounds создайте исходящее подключение с протоколом blackhole и тегом
block-selected. - В настройках маршрутизации задайте Domain Strategy равным
IPOnDemand. Так Xray сможет проверить IP-адрес домена по правилу для IP, даже если ниже есть общее правило маршрутизации. Если у вас уже используется скрипт маршрутизации, внесите изменения в него: эти шаги рассчитаны на обычный список правил. - Добавьте два отдельных правила маршрутизации по таблице ниже. В обоих выберите только свои VPN-подключения в Inbound tags и укажите
block-selectedв Outbound tag. Остальные поля условий оставьте пустыми.
| Правило | Domain name | IP |
|---|---|---|
| Домены | geosite:category-ru,domain:ru,domain:su,domain:xn--p1ai | Оставьте пустым |
| IP-адреса | Оставьте пустым | geoip:ru |
Не объединяйте условия для доменов и IP в одном правиле: разные поля условий проверяются одновременно, по принципу AND. Разместите оба правила после правила API панели и перед общими правилами direct, WARP и другими, сначала правило для доменов. Xray использует первое подходящее правило. Подробнее - в документации маршрутизации.
- Убедитесь, что установленный
geoip.datсодержитru, аgeosite.dat-category-ru. При необходимости обновите геоданные через панель. Отсутствующая категория может помешать запуску Xray. Список доменов поддерживается в domain-list-community. - Для выбранных VPN-подключений включите Sniffing для HTTP и TLS с включённым Route Only. Это помогает правилам для доменов, когда клиент передаёт IP-адрес, но не позволяет получить имя сайта из любого зашифрованного соединения.
- Сохраните настройки, перезапустите Xray и проверьте журнал на наличие ошибок. Через VPN проверьте один адрес из списков и посторонний сайт: первый должен быть недоступен, а второй - работать. Для отмены удалите два правила и перезапустите Xray. После этого можно удалить неиспользуемое исходящее подключение
block-selected.
Если выбранные сайты должны работать вне VPN, отдельно настройте раздельное туннелирование в клиенте. Правило blackhole на сервере не делает этого автоматически.
Блокировка сетей из списков адресов
Выберите списки в зависимости от того, какие подключения хотите блокировать:
| Список | Назначение |
|---|---|
| antiscanner.list | Расширенный список для защиты от сканирования |
| government_networks.list | Сети государственных органов и организаций по данным автора списка |
| skipa_cidr.txt | Адреса, связанные со сканированием CyberOK/Skipa |
В командах используются antiscanner.list и skipa_cidr.txt. Для более широкой блокировки можно отдельно добавить government_networks.list. Это не список подтверждённых сканеров. Правила блокируют перечисленные источники, но не защищают от неизвестных сканеров или пассивного анализа трафика.
Пример ниже блокирует перечисленные источники на всех входящих портах и протоколах, для IPv4 и IPv6. Это распространяется на SSH, панель, сайт и VPN. Локальный трафик через loopback, уже установленные соединения и связанный с ними трафик пропускаются, поэтому применение правил не прерывает текущую SSH-сессию. Блокируются только источники из выбранных списков. Исходящие подключения не ограничиваются.
Настройка файрвола и отмена изменений
Команды рассчитаны на Ubuntu/Debian с Xray непосредственно на сервере или с сетью Docker host, как в этой инструкции. При публикации портов Docker bridge пакеты проходят другим путём. См. документацию Docker по файрволу. При изменении правил держите доступной консоль в панели хостинга.
Выполняйте команды от root. Установите инструменты и скачайте оба списка. Продолжайте только после успешного скачивания обоих файлов:
bash
apt install -y nftables python3 curl
install -d -m 700 /root/vpn-scanner-listsbash
curl -fSL --retry 3 --connect-timeout 15 --max-time 120 https://raw.githubusercontent.com/shadow-netlab/traffic-guard-lists/main/public/antiscanner.list -o /root/vpn-scanner-lists/antiscanner.txt &&
curl -fSL --retry 3 --connect-timeout 15 --max-time 120 https://raw.githubusercontent.com/tread-lightly/CyberOK_Skipa_ips/main/lists/skipa_cidr.txt -o /root/vpn-scanner-lists/skipa.txtЧтобы также блокировать сети из government_networks.list, скачайте его перед созданием правил. Пропустите эту команду, если нужны только списки сканеров:
bash
curl -fSL --retry 3 --connect-timeout 15 --max-time 120 https://raw.githubusercontent.com/shadow-netlab/traffic-guard-lists/main/public/government_networks.list -o /root/vpn-scanner-lists/government.txtПросмотрите скачанные списки перед продолжением. Если вы измените их вручную, повторное скачивание файлов заменит эти локальные изменения. Генератор добавляет government.txt, если этот файл существует. Чтобы позже исключить его, удалите файл, затем заново создайте и примените правила.
Следующая команда проверит адреса, объединит пересекающиеся подсети и создаст отдельную таблицу nftables. Пока она не применяет правила:
bash
python3 - <<'PY'
import ipaddress
from pathlib import Path
directory = Path('/root/vpn-scanner-lists')
networks = {4: set(), 6: set()}
files = ['antiscanner.txt', 'skipa.txt']
if (directory / 'government.txt').is_file():
files.append('government.txt')
for name in files:
count = 0
for line in (directory / name).read_text().splitlines():
value = line.split('#', 1)[0].strip()
if not value:
continue
network = ipaddress.ip_network(value, strict=False)
if network.prefixlen == 0 or not network.is_global:
raise SystemExit(f'Rejected network: {value}')
networks[network.version].add(network)
count += 1
if count == 0:
raise SystemExit(f'Empty list: {name}')
lines = [
'add table inet vpn_scanners',
'delete table inet vpn_scanners',
'table inet vpn_scanners {',
]
for version, kind in ((4, 'ipv4_addr'), (6, 'ipv6_addr')):
entries = list(ipaddress.collapse_addresses(networks[version]))
lines += [f' set sources{version} {{',
f' type {kind}; flags interval;']
if entries:
lines.append(' elements = { ' + ', '.join(map(str, entries)) + ' }')
lines.append(' }')
print(f'IPv{version}: {len(entries)} networks')
lines += [
' chain input {',
' type filter hook input priority -10; policy accept;',
' iifname "lo" accept',
' ct state established,related accept',
' ip saddr @sources4 counter drop',
' ip6 saddr @sources6 counter drop',
' }',
'}',
]
Path('/root/vpn-scanners.nft').write_text('\n'.join(lines) + '\n')
PYПросмотрите созданные правила, затем проверьте и примените их. Файл заменяет только таблицу vpn_scanners, не очищая существующий файрвол. Если проверка или применение завершились с ошибкой, устраните её перед продолжением.
bash
less /root/vpn-scanners.nft
nft -c -f /root/vpn-scanners.nft && nft -f /root/vpn-scanners.nft
nft list table inet vpn_scannersОставьте текущую SSH-сессию открытой и проверьте, что второе SSH-подключение, сайт и VPN по-прежнему работают. Счётчики правил показывают отброшенные пакеты от адресов из списков. Нулевые счётчики не доказывают отсутствие сканирования. Правила accept выше пропускают трафик только через эту блокировку по спискам. Остальные правила файрвола продолжают действовать.
Чтобы таблица восстанавливалась после перезагрузки, сохраните проверенный файл и создайте отдельную службу:
bash
install -m 600 /root/vpn-scanners.nft /etc/vpn-scanners.nft
cat > /etc/systemd/system/vpn-scanners.service <<'EOF'
[Unit]
Description=Block listed source networks on all incoming ports
After=local-fs.target nftables.service ufw.service
Before=x-ui.service docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/nft -f /etc/vpn-scanners.nft
ExecReload=/usr/sbin/nft -f /etc/vpn-scanners.nft
ExecStop=-/usr/sbin/nft delete table inet vpn_scanners
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now vpn-scanners.serviceДля этих шагов не нужно заменять /etc/nftables.conf или включать отдельную стандартную конфигурацию файрвола. Если другая программа перезагружает правила файрвола, проверьте наличие таблицы vpn_scanners. При необходимости восстановите её командой systemctl reload vpn-scanners.service.
Для обновления повторите скачивание выбранных списков, затем просмотрите, создайте, проверьте и примените правила. После успешной проверки скопируйте новый файл в /etc/vpn-scanners.nft командой install выше и выполните systemctl reload vpn-scanners.service. В этом примере обновление выполняется вручную.
Для отмены блокировки:
bash
systemctl disable --now vpn-scanners.serviceЕсли служба ещё не создана, вместо этого выполните nft delete table inet vpn_scanners. Будут удалены только эти правила блокировки по спискам. Если оставить службу включённой, простое удаление таблицы будет временным: она вернётся при следующем запуске службы.
Управление клиентами (пользователями)
В разделе Clients вы добавляете пользователей и настраиваете их доступ к VPN. Для каждого пользователя панель выдаёт ссылку или QR-код. Их нужно добавить в VPN-приложение на телефоне или компьютере.
Создание и настройка клиента для подключения
- Перейдите на страницу "Clients"
- Нажмите кнопку "Add Clients" для создания нового клиента

- Панель заполнит параметры нового клиента автоматически. При необходимости измените их.
- В поле "Attached inbounds" выберите подключения, которыми сможет пользоваться клиент, например созданное на предыдущем шаге.
Настройка ограничений
Для каждого клиента можно настроить:
- Лимит трафика (в гигабайтах)
- Срок действия (в днях)
- Включить или отключить доступ
- Лимит IP-адресов (количество разных IP-адресов клиентов)
Подключение клиентов
Windows, macOS и Linux
Рекомендуемые клиенты:
Hiddify(Windows, Linux, macOS)- v2rayN (Windows, Linux, macOS)
Для подключения:
- В веб-панели 3x-ui нажмите на QR-код нужного пользователя
Либо скопируйте ссылку на подписку/подключение 
- Скопируйте конфигурацию либо отсканируйте QR-код с помощью VPN-клиента
- Импортируйте конфигурацию в клиент и подключитесь
Android
Рекомендуемые клиенты:
Hiddifyv2rayNG
Для подключения:
- Установите клиент из Google Play
- В веб-панели 3x-ui нажмите на QR-код нужного пользователя
Либо скопируйте ссылку на подписку/подключение 
- Отсканируйте QR-код с помощью VPN-клиента либо скопируйте и импортируйте конфигурацию
- Выберите импортированный профиль и подключитесь
iOS
Рекомендуемые клиенты:
FoXrayv2boxShadowRocket
Для подключения:
- Установите клиент из App Store
- В веб-панели 3x-ui нажмите на QR-код нужного пользователя
Либо скопируйте ссылку на подписку/подключение 
- Отсканируйте QR-код с помощью клиента либо скопируйте и импортируйте конфигурацию
- Выберите импортированный профиль и подключитесь
Мониторинг и статистика
В веб-панели 3X-UI вы можете следить за активностью пользователей:
- Общее потребление трафика
- Использование трафика по пользователям
- Статус подключений
- Срок действия подписок пользователей
- Использование IP-адресов
Маршрутизация трафика по IPv6
Клиентам нашего хостинга доступна специальная IPv6-подсеть без рекламы в популярных сервисах (например: YouTube), однако для её корректной работы необходима дополнительная конфигурация. Ниже показано, как направить через IPv6 только трафик YouTube.
Для ForceIPv6 нужны рабочее подключение по IPv6 и IPv6-адреса у целевого сервиса. Перехода на IPv4 при ошибке не будет. Если сервис перестал открываться, проверьте IPv6 или отключите это правило маршрутизации. Наличие рекламы также зависит от самого сервиса и может меняться.
Создание Outbound
В панели слева откройте вкладку Xray Configs, перейдите в Outbounds, после чего нажмите на "+ Outbounds"
Заполните поля:
- Protocol -
freedom - Tag -
ipv6-freedom - Strategy -
ForceIPv6
Ваш Outbound должен выглядеть так: 
Нажмите "Create", сохраните изменения кнопкой в левом верхнем углу и перезапустите Xray.

Создание Routing Rule
В той же вкладке перейдите в Routing Rules, после чего нажмите на "+ Routing Rules"
Заполните поля:
- Domain name - вставьте следующие домены:
geosite:youtube,domain:googlevideo.com - Inbound tags - выберите подключение, для которого будет активно это правило
- Outbound tag - выберите ранее созданный outbound
ipv6-freedom
Ваше правило должно выглядеть так: 
Нажмите кнопку "Create", после чего перенесите ваше правило на 2 позицию. 
TIP
Вы можете изменять позицию при помощи кнопок: 
Сохраните изменения кнопкой в левом верхнем углу и перезапустите Xray.

Обновление 3X-UI
Для обновления панели до последней версии выполните следующую команду:
bash
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)Если вы используете Docker, нужно будет выполнить следующие команды:
bash
cd 3x-ui
docker compose down
docker compose pull 3x-ui
docker compose up -dЭти команды относятся к файлу compose.yaml выше. Если Compose уже был настроен иначе, используйте свою папку и имя сервиса (список имён показывает docker compose config --services). Контейнер, созданный через docker run, нужно пересоздать после скачивания нового образа, сохранив прежние параметры и подключённые папки с данными.
Решение проблем
Стандартные настройки
- Порт панели: используйте порт из адреса, который показал установщик. Он может быть случайным, поэтому не ориентируйтесь на
2053. - Путь к базе данных:
/etc/x-ui/x-ui.db - Путь к конфигурации Xray:
/usr/local/x-ui/bin/config.json
Дополнительные настройки Xray
В веб-панели можно настроить дополнительные опции Xray:
- Блокировка рекламы
- Блокировка IP-адресов определенных стран
- Блокировка доменов
- Маршрутизация Google, Netflix, Spotify, OpenAI (ChatGPT) через WARP
Настройка WARP
Начиная с версии v2.1.0, WARP встроен в панель и не требует отдельной установки.
Просто включите нужную конфигурацию в панели, создайте аккаунт и Outbound. 


Доступ к панели через порт 443 (необязательно)
Панель можно открывать по адресу https://site.example.com/your-panel-path/ и закрыть её отдельный публичный порт. Xray продолжит принимать VPN-подключения на 443, а Nginx или Caddy будет отдавать сайт и передавать запросы по пути панели в 3X-UI. Для этого нужна настройка self-SNI выше, где Xray работает непосредственно на VPS или использует сеть Docker host. Выберите один из веб-серверов ниже. Оба примера также передают запросы подписок. Для любого варианта используйте настройки адреса панели и подписок ниже.
Настройка Nginx и доступ через SSH
1. Сохраните данные для доступа. Оставьте SSH-сессию открытой и сохраните текущий порт панели, секретный путь и пути к сертификату. Далее замените 2053 своим портом панели, а your-panel-path - её текущим секретным путём. Используйте длинный случайный путь, не копируйте название из примера буквально. Замените 2096 своим портом подписок, а три пути подписок - соответствующими значениями из таблицы настроек. Эти пути должны отличаться от пути панели.
2. Добавьте панель в Nginx. Откройте /etc/nginx/conf.d/self-sni.conf и добавьте следующие строки внутрь HTTPS-блока server, который слушает 127.0.0.1:8443, перед закрывающей скобкой }:
nginx
absolute_redirect off;
location /your-panel-path/ {
proxy_pass http://127.0.0.1:2053;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location /your-sub-path/ {
proxy_pass http://127.0.0.1:2096;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}
location /your-json-path/ {
proxy_pass http://127.0.0.1:2096;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}
location /your-clash-path/ {
proxy_pass http://127.0.0.1:2096;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto https;
}Не добавляйте / в конце proxy_pass, чтобы панель получала полный путь запроса. Заголовки WebSocket нужны для обновления данных в реальном времени. Подробнее в документации 3X-UI по обратному прокси.
Проверьте конфигурацию и перезагрузите Nginx:
bash
nginx -t && systemctl reload nginx3. Оставьте доступ к панели только с самого сервера. В Panel Settings укажите 127.0.0.1 в качестве IP-адреса прослушивания панели (webListen). Оставьте текущий порт и секретный путь. Очистите оба поля сертификата, Public Key Path и Private Key Path, чтобы HTTPS обрабатывал Nginx, а панель использовала HTTP только на localhost. Также примените настройки подписок, затем сохраните все изменения и перезапустите панель, чтобы оба локальных сервиса использовали новые настройки. Не меняйте адрес прослушивания и порт VPN-подключения.
Старый публичный адрес панели перестанет работать. Откройте https://site.example.com/your-panel-path/, подставив свой домен и путь, и проверьте вход в панель и обновление данных в реальном времени. Также проверьте, что сайт по пути / и VPN продолжают работать.
4. Проверьте адрес прослушивания. Выполните на VPS, указав свои порты панели и подписок:
bash
ss -ltnp '( sport = :2053 or sport = :2096 )'Адреса прослушивания должны быть 127.0.0.1:2053 и 127.0.0.1:2096, а не 0.0.0.0, * или [::]. После проверки панели и подписки удалите правила файрвола, разрешавшие публичный доступ к этим внутренним портам. Оставьте доступными SSH и порты 80 и 443.
Теперь Nginx использует сертификат сайта и для доступа к панели. Оставьте его продление и скрипт перезагрузки Nginx. Если ранее вы создали /etc/letsencrypt/renewal-hooks/deploy/restart-self-sni-panel.sh, перенесите этот скрипт из папки продления, чтобы обновление сертификата больше не перезапускало панель:
bash
mv /etc/letsencrypt/renewal-hooks/deploy/restart-self-sni-panel.sh /root/restart-self-sni-panel.sh.disabledПри указанном в инструкции Xver: 0 Nginx видит переданные браузерные подключения как подключения с localhost. Журналы и ограничения панели по IP не будут различать посетителей по их исходным IP-адресам.
Если публичный адрес панели недоступен, подключитесь напрямую через SSH. Это работает и при остановленном Xray, если сама панель запущена. Выполните команду на своём компьютере, указав пользователя SSH, адрес сервера и свой порт панели:
bash
ssh -N -L 127.0.0.1:18053:127.0.0.1:2053 root@YOUR_SERVER_IPЕсли SSH использует другой порт, добавьте -p YOUR_SSH_PORT. Оставьте команду работающей и откройте http://127.0.0.1:18053/your-panel-path/ в браузере. SSH-туннель шифрует соединение с сервером. Через него можно исправить настройки Xray или вернуть прежние настройки HTTPS для панели. Чтобы восстановить публичный доступ к панели, сначала укажите оба пути к сертификату, затем верните прежний IP-адрес прослушивания и при необходимости восстановите правило файрвола.
Вариант с Caddy
Caddy может обслуживать тот же сайт и панель, автоматически получать и продлевать сертификат. В этом варианте он заменяет Nginx на портах 80 и 127.0.0.1:8443. Xray остаётся на публичном порту 443, с Target 127.0.0.1:8443 и Xver 0.
Настройка Caddy и доступ через SSH
Эти шаги рассчитаны на один сайт из инструкции. Если Nginx или Caddy уже обслуживает другие сайты, нужно также учесть их настройки. Оставьте SSH-сессию открытой и сохраните текущий порт панели, секретный путь и пути к сертификату. Во всех примерах используйте свой домен, порт панели и секретный путь. Замените 2096 и три пути подписок соответствующими значениями из таблицы настроек.
1. Установите Caddy. Выполняйте команды от root на Ubuntu или Debian. Остановите Nginx, чтобы освободить порт 80 перед установкой официального пакета Caddy. Во время перехода сайт будет недоступен, а VPN-подключения могут не работать, пока HTTPS-сайт снова не станет доступен.
bash
systemctl stop nginx
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl gnupg
curl -fsSL https://dl.cloudsmith.io/public/caddy/stable/gpg.key -o /tmp/caddy-stable.gpg.key &&
gpg --dearmor --yes -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg /tmp/caddy-stable.gpg.key
curl -fsSL https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt -o /etc/apt/sources.list.d/caddy-stable.list
chmod 644 /usr/share/keyrings/caddy-stable-archive-keyring.gpg /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install -y caddyПродолжайте только после успешной установки. Если установка или проверки ниже завершатся ошибкой, остановите Caddy командой systemctl stop caddy и снова запустите Nginx командой systemctl start nginx, пока разбираетесь с причиной.
2. Настройте сайт и панель. Сохраните копию /etc/caddy/Caddyfile, затем замените его содержимое следующей конфигурацией:
text
{
auto_https disable_redirects
servers {
protocols h1 h2
}
}
http://site.example.com {
redir https://site.example.com{uri} permanent
}
https://site.example.com:8443 {
bind 127.0.0.1
tls {
issuer acme {
disable_tlsalpn_challenge
}
}
redir /your-panel-path /your-panel-path/ 308
handle /your-panel-path/* {
reverse_proxy 127.0.0.1:2053
}
@subscriptions path /your-sub-path/* /your-json-path/* /your-clash-path/*
handle @subscriptions {
reverse_proxy 127.0.0.1:2096
}
handle {
root * /var/www/self-sni
file_server
}
}Оставьте файлы сайта из предыдущих шагов в /var/www/self-sni, с доступом на чтение для пользователя caddy. Используйте handle, а не handle_path, чтобы панель получала полный секретный путь. Caddy автоматически обрабатывает проксирование WebSocket.
HTTPS-блок слушает 127.0.0.1:8443: :8443 задаёт порт, а bind 127.0.0.1 оставляет доступ только с самого VPS. Xray передаёт запросы к сайту и панели с публичного 443 на этот адрес. HTTP/3 отключён, поскольку эта схема передаёт TCP через Xray. Caddy получает и продлевает сертификат через HTTP-проверку на публичном порту 80, поэтому оставьте его доступным. Подробнее об адресах сайтов и ACME в Caddy.
3. Запустите Caddy и проверьте HTTPS.
bash
caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile &&
systemctl enable --now caddy &&
systemctl restart caddy
journalctl -u caddy -n 50 --no-pagerДождитесь сообщения об успешном получении сертификата в журнале, затем проверьте локальный HTTPS-сайт, заменив домен своим:
bash
curl --http2 --tlsv1.3 --tls-max 1.3 --resolve site.example.com:8443:127.0.0.1 https://site.example.com:8443/ -w '\nHTTP version: %{http_version}\n'Команда должна вернуть сайт без ошибок сертификата и вывести HTTP version: 2. Также откройте https://site.example.com/ со своего компьютера и проверьте VPN перед продолжением.
4. Переведите панель на локальный доступ. В Panel Settings задайте 127.0.0.1 в качестве IP-адреса прослушивания панели (webListen), оставьте её порт и секретный путь, очистите Public Key Path и Private Key Path. Также примените настройки подписок, затем сохраните все изменения и перезапустите панель. Теперь HTTPS обрабатывает Caddy, а панель и сервер подписок используют HTTP только на localhost. Откройте https://site.example.com/your-panel-path/ и проверьте вход в панель и обновление данных в реальном времени.
Выполните ss -ltnp '( sport = :2053 or sport = :2096 )', указав свои порты. Панель и сервер подписок должны слушать только 127.0.0.1. После проверки панели и подписки удалите правила файрвола для их старых публичных портов. Оставьте доступными SSH и порты 80 и 443.
5. Завершите переход. Когда сайт, панель, подписки и VPN работают, отключите автозапуск Nginx:
bash
systemctl disable nginxCaddy самостоятельно хранит и обновляет свой сертификат. Если старый сертификат Certbot больше не используется ни одним сервисом, удалите его из Certbot командой certbot delete --cert-name site.example.com, подставив его настоящее имя из certbot certificates. Перенесите скрипты reload-self-sni-nginx.sh и restart-self-sni-panel.sh из этой инструкции, если они существуют, из /etc/letsencrypt/renewal-hooks/deploy/ в папку для резервных копий внутри /root/. Оставьте продление Certbot включённым для других используемых сертификатов. После удаления старого сертификата для возврата к Nginx потребуется получить сертификат заново.
При Xver: 0 Caddy видит переданные браузерные подключения как подключения с localhost. Журналы и ограничения панели по IP не смогут различать их исходные адреса.
Если публичный адрес панели недоступен, выполните на своём компьютере, указав пользователя SSH, адрес сервера и свой порт панели:
bash
ssh -N -L 127.0.0.1:18053:127.0.0.1:2053 root@YOUR_SERVER_IPДобавьте -p YOUR_SSH_PORT, если SSH использует другой порт. Оставьте команду работающей и откройте http://127.0.0.1:18053/your-panel-path/. Так вы подключитесь к запущенной панели напрямую через зашифрованный SSH-туннель, даже если Xray или Caddy остановлен.
Адрес панели и подписки
Эти настройки подходят для обоих вариантов выше, Nginx и Caddy. Сначала настройте выбранный прокси, затем укажите эти значения в 3X-UI и перезапустите панель. Используйте одни и те же значения домена, путей и портов в настройках панели и прокси.
Настройки панели, ссылки подписок и проверка
Адрес панели. В Panel Settings укажите:
| Настройка | Значение |
|---|---|
Listening IP (webListen) | 127.0.0.1 |
Panel Port (webPort) | Внутренний порт панели, в примерах используется 2053 |
Panel URL Path (webBasePath) | /your-panel-path/, с обоими / |
Listening Domain (webDomain) | Оставьте пустым, чтобы сохранить прямой доступ через SSH-туннель |
| Public Key Path / Private Key Path | Оба поля пустые, HTTPS обрабатывает Nginx или Caddy |
В Panel URL Path указывается только путь, а не полный URL. Адрес для браузера - https://site.example.com/your-panel-path/, без :2053 или :8443. Оставьте внутренний порт панели прежним. Домен задаётся в конфигурации Nginx или Caddy. Listening Domain ограничивает допустимые имена хоста, а не задаёт публичный URL.
Сервер подписок. Откройте Settings → Subscription → Panel settings. Подписки используют отдельный от панели порт:
| Настройка | Значение |
|---|---|
Enable Subscription (subEnable) | Включено |
Listening IP (subListen) | 127.0.0.1 |
Subscription Port (subPort) | Отдельный свободный внутренний порт, в примерах используется 2096 |
Subscription Domain (subDomain) | В этом примере оставьте пустым |
Subscription Path (subPath) | /your-sub-path/ |
Subscription URI (subURI) | https://site.example.com/your-sub-path/ |
Пути к сертификату и ключу подписок (subCertFile, subKeyFile) | Оба поля пустые |
Если у вас уже есть путь подписок, сохраните его и укажите тот же путь в конфигурации прокси. Пути панели, обычной подписки, JSON и Clash должны различаться. Оставьте / в конце каждого URI. Указывайте публичный HTTPS-адрес без внутреннего порта и Sub ID клиента, 3X-UI добавит Sub ID при создании ссылки для каждого клиента.
Дополнительные форматы. Включайте подписки JSON или Clash/Mihomo, если они нужны вашему приложению. В Settings → Subscription Formats также задайте их пути и публичные URI:
| Формат | Путь | Публичный URI |
|---|---|---|
JSON (subJsonPath, subJsonURI) | /your-json-path/ | https://site.example.com/your-json-path/ |
Clash/Mihomo (subClashPath, subClashURI) | /your-clash-path/ | https://site.example.com/your-clash-path/ |
Оба примера прокси передают все три пути на один порт подписок. Чтобы путь работал, соответствующий формат должен быть включён в 3X-UI. Для настройки XHTTP из этой инструкции оставьте обычный Mux выключенным и в настройках JSON-подписки. Подробнее о форматах и путях подписок в документации 3X-UI.
Проверьте подписку клиента. Сохраните настройки, перезапустите панель и снова откройте её по публичному HTTPS-адресу. Заново скопируйте ссылку подписки клиента. Обычная подписка теперь должна выглядеть так:
text
https://site.example.com/your-sub-path/CLIENT_SUB_IDЗначение CLIENT_SUB_ID подставляет панель, это не UUID клиента и не секретный путь панели. Не публикуйте ссылки подписок, поскольку они содержат доступ к данным VPN-подключений. Замените старый URL подписки в VPN-приложении и обновите её. Существующие ссылки со старым портом сами не изменятся.
Проверьте, что импортированные профили используют публичный адрес сервера и порт 443, ваш домен в качестве SNI, правильный транспорт, путь XHTTP и Flow. Адрес скачивания подписки и адрес VPN-подключения задаются отдельно. Если в профиле указан локальный адрес, исправьте адрес для ссылок подключения в настройках inbound или привязанного к нему Host и обновите подписку.
В браузере может открыться информационная страница подписки вместо конфигураций. Проверить обычный ответ можно со своего компьютера, указав полную ссылку клиента:
bash
curl --fail --show-error -H 'Accept: text/plain' 'https://site.example.com/your-sub-path/CLIENT_SUB_ID'В ответе должна быть подписка, обычно текст Base64 для обычного формата, а не HTML вашего сайта или страница входа в панель. При 502 проверьте, что сервер подписок запущен на выбранном локальном порту, а оба поля сертификата пустые. При 404 проверьте путь, Sub ID и переключатель нужного формата. Если в созданных ссылках есть http:// или внутренний порт, исправьте URI соответствующего формата и заново скопируйте ссылку. Затем проверьте VPN-подключение из импортированного профиля. Успешное скачивание подписки само по себе не подтверждает работу VPN.