Это уже даже более чем традиция - нейрокартинка для отвлечения внимания
Это уже даже более чем традиция - нейрокартинка для отвлечения внимания

В серии предыдущих статей я описывал, почему повсеместно используемые VPN- и прокси-протоколы такие как OpenVPN и L2TP очень уязвимы к выявлению и могут быть легко заблокированы цензорами при желании, обозревал существующие гораздо более надежные протоколы обхода блокировок, клиенты для них, а также описывал настройку сервера двух видов для всего этого.

Многим читателям, однако, ручная настройка показалась сложной и неудобной - хотелось иметь понятный легко устанавливаемый графический интерфейс без необходимости ручного редактирования конфигов и вероятности допустить ошибки, а еще мы не поговорили про механизм "подписок", позволяющих клиентам автоматически подключать список новых серверов с настройками подключений.

Поэтому сегодня мы поговорим об установке и использовании графической панели 3X-UI для сервера X-Ray с поддержкой всего того, что умеет X-Ray: Shadowsocks-2022, VLESS с XTLS и т.д.

Почему 3X-UI? Существует, на самом деле, довольно много панелей для V2Ray/XRay: оригинальный X-UI, Marzban, Libertea, Hiddify. Проблема в том, что в процессе экспериментов у меня и ряда других хабраюзеров заставить их нормально работать с пол-пинка не получилось. Например, одним из требований была установка в Docker (чтобы не создавать бардак в системе и не запускать непонятные bash-скрипты на хосте вне контейнера), и на этом этапе отвалились уже многие панели: у каких-то установка падала еще на этапе разворачивания docker-контейнера из-за ошибок в скриптах, какие-то устанавливались, но не могли нормально запуститься (фронтенд говорил, что не может подключиться к бэкенду), какие-то в итоге запускались, и после получаса тыканья везде в попытках переключить язык с китайского или фарси хотя бы на английский выяснялось что что-то глючит или не работает.

3X-UI, который является доработанным форком оригинального X-UI, в сравнении со всем вышеописанным, почти идеален: легко устанавливается в Docker, сразу на английском с возможностью переключения на русский, имеет в себе все что надо - и главное, работает! Пара багов, конечно, тоже нашлась, но они не критичны и о них будет чуть позже.

Установка

Официальный репозиторий 3X-UI: https://github.com/MHSanaei/3x-ui

Итак, дано: VPS с IPv4 (неплохо бы иметь еще IPv6, но не обязательно) и Debian либо Ubuntu Linux (на других дистрибутивах суть будет примерно та же самая). И установленные Docker и docker-compose (если вдруг нет - следуйте инструкциям для вашего дистрибутива, у меня без проблем установилось простым "apt install docker.io docker-compose"). Ну и git в придачу.

Сначала клонируем исходники. Лучше всего использовать последнюю стабильную версию, на сегодняшний день это 1.4.6, можно проверить в "Releases" на гитхабе:

git clone https://github.com/MHSanaei/3x-ui.git
cd 3x-ui
git checkout v1.4.6

Запускаем docker-compose:

 docker-compose up -d

Готово! Вы восхитительны! Я серьезно, все, панель установлена и работает.

Дело осталось за малым - настроить ее:

Идем браузером по адресу http://yourserverip:2053/panel/, где yourserverip - IP-адрес вашего сервера или доменное имя, если оно у вас есть и настроено (обратите внимание, протокол http://, а не https://).

Логинимся под стандартными реквизитами admin/admin и видим нашу прекрасную панель управления:

Первым делом я советую сделать несколько вещей. Перейти в "Settings" (настройки) и там:

  1. Изменить порт на котором работает панель со стандартного 2053 на какой-нибудь другой (лучше всего где-нибудь в верхнем конце диапазона, до 65535);

  2. Изменить корневой путь URL-адреса панели с / на что-то типа /mysecretpanelroot/;

  3. При желании переключить язык на русский (но имейте в виду, в русском переводе есть некоторые неточности сбивающие с толку);

  4. На второй вкладке "Настройки безопасности" изменить стандартный админский пароль на свой;

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

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

Создаем подключения

Идем в раздел меню Inbounds (в русском переводе он почему-то называется "Пользователи", это неправильно и сбивает с толку). Нажимаем "Add Inbound" ("Добавить пользователя"):

Появляется милое окошо. Сначала добавим возможность подключаться через Shadowsocks-2022.
"Remark" (Примечание) - ввести что угодно, это просто человекочитаемое название;
"Протокол" выбираем shadowsocks;
"Listening IP" (в русском переводе называется "Порт IP", и это тоже неправильно и запутывает) можно оставить пустым, тогда сервер будет слушать на всех IP-адресах, либо можно явно указать требуемый;
"Порт" - панель выберет рандомный.

Далее настраиваем пользователя (в момент создания inbound'а создается один, других при желании можно добавить позже):
Поле "Email" на самом деле не обязательно должно содержать емайл, может быть любой текст (имя пользователя) - панель генерирует рандомный набор символов, если вы хотите создавать несколько разных пользователей (например, раздать аккаунты друзьям, смотреть кто сколько накачал и при желании блокировать доступ), то лучше вбить сюда что-то человекочитаемое и понятное;
"Subscription" - пока что можно вбить тот же самый юзернейм (о подписках я расскажу чуть позже).

Дальше снова идут настройки протокола:
"Шифрование" - выбираем что-нибудь что начинается с "2022", вариант по умолчанию вполне неплох;
"Пароль" (ключ) панель сгенерирует автоматически с правильной длиной для выбранного метода шифрования.

Нажимаем "Создать" и на этом настройка для Shadowsocks закончена, им уже можно пользоваться.

Теперь переходим к настройке VLESS с XTLS-Reality. Тут все будет чуточку сложнее, но в целом так же просто.

"Remark" (Примечание) - любое название;
"Протокол" - "vless",
"Listening IP" ("Порт IP", который на самом деле не порт, а адрес) - оставляем пустым, либо задаем вручную если надо;
"Порт" - вместо рандомного ставим 443;

Далее переходим к настройкам клиента.
"Email" - как в и в прошлом пункте, лучше указать что-то человекочитаемое и понятное. Важно: пользователи разных подключений не могут иметь один и тот же емайл (например, наш новый VLESS и старый Shadowsocks созданный в предыдущем пункте), поэтому можно добавить какой-нибудь префикс (например user1vl) для избежания конфликтов.
"Subscription" - тут наоборот, лучше будет если текст в этом поле будет совпадать с тем, что вы задали для Shadowsocks (подробности ниже)
"Flow" - надо выбрать "xtls-rprx-vision". Обратите внимание, поле Flow (см. скриншот) появится только после того, как чуть ниже вы поставите галочку на пункте "Reality". То есть лучше всего настривать так: сначала ставите галочку Reality, а потом заполняете поля с настройками пользователя.

Дальше у нас идут настройки транспорта:
"Reality" - как уже сказано выше, должно быть активно;
"XTLS" - наоборот, должно быть неактивно (это немного запутывает, не смотря на то, что Reality тоже относится к XTLS, здесь под XTLS подразумеваются только устаревшие версии протокола, и галочки "XTLS" и "Reality" в панели являются взаимоисключающими);
"uTLS" - по умолчанию "firefox", я обычно выбираю "chrome", по факту особо без разницы (главное чтобы не "android", могут быть проблемы с клиентами);
"Домен" - на самом деле это не домен, а адрес для подключения к вашему серверу. Можно оставить пустым, тогда панель автоматически подставит IP-адрес или домен, по которому вы обращаетесь в панели на сервере.
"ShortIds" - панель сгенерирует рандомный ID;
"Public Key", "Private Key" - можно кликнуть на "Get new keys", и панель сама сгенерирует новые для вас;
"Dest" и "Server names" - вот это самое интересное, это домен, под который вы будете маскироваться. По умолчанию панель предлагает маскировку под yahoo.com и www.yahoo.com с переадресацией на yahoo.com:443, но лучше выбрать какой-нибудь другой домен, как описано в предыдущей статье;

Сохраняем введенную форму, и - всё! Настройка завершена.

После этого на странице видим примерно вот это:

Если тыкнуть на кнопочку "Меню" соответствующую нужному протоколу, можно его активировать/деактивировать, сбросить счетчики трафика, добавить пользователей (в том числе сгенерировать разом N аккаунтов по шаблону), и самое главное - раскрыв (плюсиком) список пользователей, можно посмотреть настройки подключения для вбивания в клиенты для этого пользователя.

Нажав на значок QR-кода, панель покажет QR-код, который можно отсканировать камерой в мобильных клиентах (v2rayNG или Nekobox на Android, Wings X или Shadowrocket на iOS). Подробнее о клиентах читайте в этой статье.

ремарочка

Обратите внимание, v2rayNG и Nekobox из сторов основаны на старой версии XRay и еще не поддерживают Reality, нужно переключиться на бета-канал или устанавливать APK с гитхаба.

Нажав на иконку информации (с буквой "i") можно посмотреть настройки для вбивания в десктопные клиенты, в том числе и URL, который можно скопировать и вставить.

Под дестоп я рекомендую Nekobox (есть под Windows, Linux и билды от сообщества для MacOS). Подробнее о клиентах читайте в этой статье.

краткая настройка Nekobox

Если вы раньше им не пользовались, нужно переключить его на использование движка sing-box, Preferences -> Basic Settings -> Core.

Далее копируем URL подключения в буфер обмена, в Nekobox нажимаем Server -> Add profile from clipboard - вжух, и у нас в списке добавилось новое подключение!

Сохраняем, кликаем правой кнопкой мыши на новый сервер в списке, жмем Start, и проверяем подключение выбрав там же Current Select -> URL test.

Если все нормально, то галочками "VPN Mode" или "System proxy" можно завернуть трафик всех приложений на прокси.

Там же вы можете найти "subscription URL". Это - специальным образом сгенерированный список подключений для клиентов. Помните, вы указывали "Subscription" при создании пользователя? При запросе по такому subscription URL, сервер выдаст список настроек (сервера, ключи) для всех подключений с этим ID в поле subscription. Многие клиенты (включая v2rayNG, v2rayN, Nekobox, и другие) умеют автоматически либо по запросу скачивать настройки с таких URL и добавлять их к себе - таким образом, если вы добавили какие-то новые протоколы или решили поменять конфигурацию, пользователи могут легко получить новые параметры с вашего сервера.

Дополнительные настройки

В менюшках панели можно найти много интересностей, например, можно запретить клиентам качать торренты (если у вас на сервере не слишком широкий канал или есть лимит трафика), добавить фильтр доменов рекламных сервисов, запретить доступ к порносайтам (ума не приложу, кому вообще в жизни может понадобиться такая ужасная функция).

А еще можно заблокировать доступ через сервер к IP-адресам и доменам Ирана, Китая и России (Россия здесь в отличной компании, не правда ли?) - это нужно если вы по ряду соображений настроили на клиентах доступ к российским сайтам напрямую, и хотите заблокировать их на сервере чтобы случайно не вылезти в рунет через него из-за ошибок в настройках.

Улучшения и баги

Сначала о паре багов.

При установке в Docker не получается посмотреть логи Xray, панель выплевывает ошибку. Иногда что-то подсмотреть и понять можно используя команду "docker logs 3x-ui", но там логи довольно куцые. Будем надеяться, что в следущих версиях это исправят (зарепортите им там кто-нибудь, а?).

Второй баг - не удается создать несколько inbounds с одним и тем же портом, но разными listening IP - панель ругается. Из-за этого, например, нельзя реализовать классическую схему с XTLS-Reality слушающем на 443 порту на IPv4-адресе, и VLESS+Websockets или VLESS+gRPC для работы через CDN (как запасной вариант) на IPv6 адресе. Опять же, будем надется, что авторы это когда-нибудь пофиксят.

И да, если по каким-то причинам вам не подходит вариант с Reality, черканите в комментариях, расскажу как настроить 3X-UI для обычного VLESS+XTLS-Vision (опционально с вебсокетами и gRPC).

Из того, что можно улучшить при конфигурации - по умолчанию панель слушает на чистом HTTP, без шифрования. Вариантов решения несколько:

  1. Если у вас есть домен (даже бесплатный от no-ip, freenom, dynu), то можно установить certbot от letsencrypt, запросить сертификат для своего домена, положить его в папку ./certs (внутри директории, куда вы склонировали 3x-ui) или сделать туда симлинки, и указать путь к ключам в панели в виде /root/cert/privkey.pem и /root/cert/public.crt. Не забудьте добавить post-update hook для рестарта контейнера;

  1. Другой вариант - поменять в настройках listen IP для панели на 127.0.0.1 - после этого панель станет недоступна "снаружи", но на нее всегда можно будет зайти с помощью SSH:
    "ssh -L 8080:localhost:2053 your_server_ip" - тогда вбивая в браузере http://localhost:8080, подключение через SSH пойдет на локальный порт 2053 сервера, где и слушает ваша панель;

  2. Третий вариант - повесить на сетевой интерфейс на сервере еще один "виртуальный" IP-адрес: прописать в /etc/network/interfaces что-то типа
    iface lo:1 inet static
    address 192.88.99.1
    network 192.88.99.0
    netmask 255.255.255.0
    и настроить панель, чтобы она слушала только на нем. Тогда "снаружи" панель будет недоступна, но при подключении через Shadowsocks/VLESS-прокси вы сможете до нее достучаться по этому адресу.

Telegram

И занимательное на последок. Панель может работать как Telegram-бот :)

Сначала обращаемся к боту BotFather и просим его зарегистрировать нового бота:

Он сгенерирует для вас API-токен. Его надо вставить в настройки панели, и там же указать ваш ID как админа (его можно запросить у бота userinfobot):

После этого можно разговаривать с панелью через Telegram - смотреть статистику, делать бэкапы конфигурации, и т.д.

Комментарии (20)


  1. FaustRUS
    18.05.2023 21:26
    +1

    Просто КАЙФ!!!!


  1. anonym0use
    18.05.2023 21:26

    Спасибо за ваш труд, теперь отпал вопрос какой из кучи интерфейсов использовать)


  1. Mayurifag
    18.05.2023 21:26

    Присоединяюсь ко всем благодарностям, очень большое Вам ещё одно спасибо за то, что популяризуете эту тему! И притом, в статье Вы покрыли все возникшие вопросы, особенно если читать гайд чуть забегая вперед и открывая спойлеры.

    У меня, к сожалению, не получилось завести рабочее соединение с обоими inbounds, но я c участием traefik делал (мне бы хотелось чтобы вопросы с сертификатами он на себя брал), в целом результат, пожалуй, предсказуем. URL тест провал у обоих новых соединений, но vless пингуется, хотя скорее всего это просто сабдомен на который я выставил панель, тоже 443 порт.

    Проект действительно ещё только в ранней стадии, не хватает каких-то ожидаемых вещей — того же логирования, Вы уже это отметили. Тут возможно бы помогли энвы XUI_LOG_LEVEL='debug' и/или XUI_DEBUG=true.

    На мой взгляд из ещё не хватающего проекту:

    • Сильно больше энвов, — для админских логина-пароля, для блокировки-разрешения соединений (торренты/реклама) и т.д. Те 4 штуки что есть сейчас на момент написания комментария какие-то бесполезные конечному юзеру.

    • Чуть больше примеров бы хотелось, с тем же traefik.

    • Было бы идеально отключать ненужные фичи — например, не нужен мне ещё один мониторинг CPU/RAM, тут он видимо больше для Telegram бота

    • Некоего быстро настраиваемого ультимативного шаблона, подходящему 95% пользователей, чтобы можно было 2 соединения из статьи настроить в минимальное количество кликов. Точнее, все, которые могут в теории понадобиться, включая упомянутые фоллбеки использующие grpc/websockets.

    P.S. пока пытался добавлять соединения в Shadowrocket, сосканировал QR из статьи случайно, ха-ха


    1. MiraclePtr Автор
      18.05.2023 21:26

      Некоего быстро настраиваемого ультимативного шаблона, подходящему 95% пользователей, чтобы можно было 2 соединения из статьи настроить в минимальное количество кликов. Точнее, все, которые могут в теории понадобиться, включая упомянутые фоллбеки использующие grpc/websockets.

      Вот этого реально не хватает, да. Потому что настройка SS элементарная, настройка Reality тоже простая (хотя flow я бы ставил по-умолчанию), а вот настройка websockets или gRPC требует цепочки fallback'ов, которые создавать руками муторно и можно легко ошибиться.

      А ещё чего не хватает - интегрированного ACME клиента, чтобы можно было запросить и автоматически обновлять бесплатные сертификаты для домена сразу из панели (для того же TLS без Reality и проксирование через CDN).


  1. StressDaun
    18.05.2023 21:26

    Все настроил, но не завелось, завтра еще покопаюсь, через QR code пароль профиля тоже криво копирует


    1. MiraclePtr Автор
      18.05.2023 21:26

      А в чем проблема с QR? Только что проверил, v2rayNG и Nekobox на Андроиде считали QR без проблем и сразу заработали.

      После настроек inbounds на панели имеет смысл пойти на главную страницу и проверить, что Xray на сервере нормально стартанул. Если вдруг видео, что не стартанул - медитировать (логи-то сломаны :)) и думать, скорее всего или что-то совсем плохое в одном из полей (некорректные символы), или порт уже занят каким-то другим процессом, или неправильно задан listening IP (если его задавали явно).


  1. SignFinder
    18.05.2023 21:26

    Спасибо за отличную статью. А кто-то пробовал проксирование через nginx делать?


    1. MiraclePtr Автор
      18.05.2023 21:26

      Конкретно с панелью или без? Без панели - рабочий вариант проксирование VLESS-over-websockets описан в одной из предыдущей статей советским примерами конфигов.


      1. SignFinder
        18.05.2023 21:26

        Спасибо, изучу предыдущую статью. я не про проксирование панели спрашивал, а проксирование именно соединения к x-ray серверу. Ибо чего VPS простаивать, на нем можно еще пару сайтов развернуть и 443 будет занят, а для полной красоты нужен коннект к стандартному https порту.


        1. MiraclePtr Автор
          18.05.2023 21:26

          Да, тут есть несколько вариантов:

          1. Xray слушает 443 порт, там настроен VLESS+TLS, и настроен fallback на Nginx - если клиент не был опознан как VLESS, то подключение передается на Nginx и открывается сайт.

          2. Nginx слушает 443 порт, и там прописан location для проксирование вебсокетов по определенному пути на другой порт, где слушает Xray с настроенными websocket-транспортом

          3. Разруливать по SNI (с HAproxy или ngx_ssl_preread), один домен отправляем на Xray, все остальное на прокси - тут модно будет использовать даже XTLS-Reality

          4. Вариант тупой, но очень простой в настройке (по функционалу и маскировке примерно аналогичен варианту 1): все как в статье, только при настройке VLESS+XTLS-Reality указать в качестве dest не какой-нибудь yahoo.com:443, а localhost:444 (и на 444 порту локалхоста будет слушать Nginx).


  1. xexeboi
    18.05.2023 21:26

    i know that such comments brings you energy for it
    https://www.youtube.com/watch?v=lut2_mGAavA
    https://www.youtube.com/watch?v=lut2_mGAavA

    :)


  1. mercurykd
    18.05.2023 21:26

    на каких принципах реализованы блокировки доменов/торрентов? днс?


    1. MiraclePtr Автор
      18.05.2023 21:26

      Сложнее и интереснее. XRay (на котором основана панель) довольно продвинутый в этом плане.

      Фильтрация IP: если запрос на прокси приходит сразу с IP как target, то сервер просто его проверяет по GeoIP базам или маске; если запрос приходит с доменом как target, домен резолвится и дальше то же самое;

      Фильтрация по домену: если запрос на прокси приходит сразу с доменом как target, то сервер просто его проверяет по подстроке/регэкспу, если запрос приходит для IP, то XRay умеет анализировать первые пакеты подключения и выцеплять домен из HTTP-запроса (для HTTP) или из SNI (для TLS).

      Как фильтруют торренты - фиг его знает, надо в код заглянуть, но не удивлюсь, если у них тоже реализован парсер заголовков для BT и uTP протоколов.


  1. ger_soc_truda
    18.05.2023 21:26

    Доступ к панели c HTTPS можно подключить, на гитхабе проекта есть инструкция.


    1. MiraclePtr Автор
      18.05.2023 21:26

      Конечно можно, я в статье упомянул про TLS-сертификаты и как их прописать.


  1. s3int
    18.05.2023 21:26

    Очередное спасибо за такое грамотное просвящение. Shadowsocks встал сразу, а вот с xtls-reality что-то не получилось, и т.к норм логов нет, непонятно почему. Из прошлого гайда у меня оставался обычный xray, я его поставил в статус inactive, он же не должен активным быть в системе? И вроде бы конфликтов никаких нет и статус xray стоит как running


    1. s3int
      18.05.2023 21:26

      И такой вопрос по поводу udp.Если я правильно понимаю, xtls-rprx-vision-udp443 отвечает за его поддержку? т.к стандартный v2ray только tcp поддерживает, значит можно его выбирать?


      1. MiraclePtr Автор
        18.05.2023 21:26

        Не, это совсем о другом.

        Идея Vision - что если у нас подключение к серверу (не к прокси, а к серверу назначения, например ютуб, гугл, и т.д.) идёт по TLSv1.3, то шифрование туннеля на уровне прокси отключается, чтобы не шифровать ещё раз уже зашифрованный трафик и не попасться на детектирование цензорами TLS-in-TLS. Поэтому Vision по умолчанию не пропускает QUIC (UDP на 443 порт), т.к. это ломает всю идею Vision. Но если кому-то сильно надо и он знает что делает, есть вот эта опция udp443.

        А если вам QUIC не сильно нужен, но важна просто работа UDP для чего-то другого - то хватит просто xtls-rprx-vision, а на клиенте стоит включить encoding как "xudp" чтобы был полноценный full cone nat (правда, в последних версиях xray и sing-box вроде был какой-то баг на эту тему, но должны были уже исправить).


    1. s3int
      18.05.2023 21:26

      UPD. Запустился xtls, но надо было в dest добавить приставку www к сайту


      1. MiraclePtr Автор
        18.05.2023 21:26

        Хм... Это странно :) dest отвечает только за fallback (когда клиент не опознан как валидный, подключение передается на dest для маскировки под этот сервер), на клиентские подключения от прокси по идее влиять никак не должно... Но хорошо, что в итоге заработало.