Обновить

3X-UI: Shadowsocks-2022 & XRay (XTLS) сервер с простой настройкой и приятным интерфейсом

Уровень сложности Простой
Время на прочтение 10 мин
Количество просмотров 135K

Статья опубликована под лицензией Creative Commons BY-NC-SA.

В серии предыдущих статей я описывал, почему повсеместно используемые 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, сразу на английском с возможностью переключения на русский, имеет в себе все что надо - и главное, работает! Пара багов, конечно, тоже нашлась, но они не критичны и о них будет чуть позже.

Update: в конце мая в своем Telegram-канале автор 3X-UI написал, что возможно больше не будет работать над проектом, но есть альтернатива - еще один из форков оригинального X-UI под названием (внезапно!) X-UI, который очень похож на 3X-UI и тоже работает без проблем.

Установка

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

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

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

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

Для 3X-UI:

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

Для X-UI:

git clone https://github.com/alireza0/x-ui.git
cd x-ui
git checkout 1.4.1

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

 docker-compose up -d

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

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

Для 3X-UI идем браузером по адресу http://yourserverip:2053/panel/, где yourserverip - IP-адрес вашего сервера или доменное имя, если оно у вас есть и настроено (обратите внимание, протокол http://, а не https://). Для X-UI нужно сначала посмотреть с помощью команды "docker logs x-ui", на каком именно порту запустилась панель.

Логинимся под стандартными реквизитами 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 (подробности ниже). Внимание: в отличие от 3X-UI, в X-UI поле Subscription по умолчанию не отображается, нужно сначала активировать функционал подписок в настройках панели.
"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/FoXray или 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 и добавлять их к себе - таким образом, если вы добавили какие-то новые протоколы или решили поменять конфигурацию, пользователи могут легко получить новые параметры с вашего сервера.
Внимание: в отличие от 3X-UI, в X-UI поле Subscription по умолчанию не отображается и вообще функционал подписок по умолчанию отключен, его нужно активировать в настройках панели.

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

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

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

Про опцию запрета IPv6 для Google

При включенном IPv6 в TUN-режиме есть одна проблема. Nekobox (возможно другие клиенты тоже, не проверял) в качестве "внутреннего" IPv6 адреса использует адрес из такого зарезервированного диапазона (ULA), где они должны генерироваться рандомно, и вероятность случайного совпадения двух рандомных адресов ничтожна. То есть такой адрес должен быть уникальным, но в Nekobox он наоборот захардкожен один для всех случаев, и в итоге некоторые сервисы, которые могут каким-то образом получать и анализировать локальные адреса клиентов (например, Google с его телеметрией в Chrome и в Android), считают всех клиентов с таким внутренним адресом... одним и тем же клиентом, после чего матчат их то ли с геолокацией, то ли с другими внутренними адресами, то ли и с тем и с тем, и в итоге в ряде случаев все пользователи Nekobox (и возможно других клиентов) для Гугла выглядят как юзеры откуда-то из Ирана, Китая или Азербайджана, вплоть до того, что со временем Гугл начинает считать публичный адрес прокси-сервера тоже иранским/китайским/etc, и это приводит к довольно забавным эффектам.
Варианты решения: не использовать TUN-режим (он же VPN mode), либо в правилах маршрутизации запретить доступ до Google по IPv6, что и позволяют сделать некоторые форки X-UI.

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

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

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

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

Из того, что можно улучшить при конфигурации - по умолчанию панель слушает на чистом 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-прокси вы сможете до нее достучаться по этому адресу.

Про работу через веб-сокеты, gRPC и CDN: Особенности проксирования через CDN/Websocket/gRPC для обхода блокировок

Telegram

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

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

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

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

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

Теги:
Хабы:
Всего голосов 38: ↑37 и ↓1 +36
Комментарии 186
+186
Закрыть

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Комментарии 186

Закрепленные Закреплённые комментарии

Спасибо за статьи, сильно помогли. Хотел добавить, что также существует клиент на роутеры Asus - "Merlin Clash". Главный минус - клиент и требуемая прошивка добавляющая дополнительное меню (Asus Merlin-Koolshare) полностью на китайском. Ссылка на неполную англ. инструкцию - MerlinClash - WannaFlix.

PS: Если кому-то захочется его использовать, то найдите настройки DNS и уберите все китайские.

Настройка маршрутизации в Shadowrocket (iOS)

Если нужна фильтрация только по .ru-доменам, то все вообще просто

На главном экране в пункте Global routing выбираем Config:

Далее идем на вкладку Config, там идем в General:

Скроллим ниже к Skip Proxy, и добавляем туда новый пункт "*.ru":

Сохраняем. Всё, готово.

Если нужен именно GeoIP, то чуть сложнее

Идем на MaxMind Geolite2 и регистрируемся там: https://dev.maxmind.com/geoip/geolite2-free-geolocation-data

Как зарегались и залогинились - нажимаем Manage License Keys -> Create License Key. Он сгенерит новую лицензию - важно сразу сохранить Account ID и License Key, ключ целиком показывается в интерфейсе только один раз, потом еще раз посмотреть уже нельзя будет!

В Shadowrocket идем в Settings, там ищем Geolite2, и заполняем наши данные:

Нажимаем Update - он должен подтянуть актуальную базу.

Потом как и в прошлом пункте, на главном экране выбираем Global Routing - Config, идем в Config, и там не в General, а в Rules:

Жмем плюсик, и создаем новое правило с типом geoip, policy = direct, и country/area пишем "RU" (обязательно большим буквами, иначе не сработает):

Сохраняем, пользуемся.

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

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

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

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

У меня, к сожалению, не получилось завести рабочее соединение с обоими 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 из статьи случайно, ха-ха

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

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

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

Я себе таки настроил Reality через traefik.

Идея в том, что нужно создать роутер, который будет отправлять запросы на поддельный адрес (www.microsoft.com в моем случае) на 443 порт контейнера. Для этого используется директива HostSNI.

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

Вот так выглядит мой docker-compose:
version: "3.9"

services:
  xui:
    image: alireza7/x-ui
    container_name: x-ui
    volumes:
      - ПУТЬ_ДЛЯ_БЕКАПА_НАСТРОЕК:/etc/x-ui/
    environment:
      PUID: 1000
      PGID: 1000
      TZ: America/Los_Angeles #ПОМЕНЯЙТЕ НА СВОЙ ЧАСОВОЙ ПОЯС
      XRAY_VMESS_AEAD_FORCED: "false"
    networks:
      - intranet
    restart: unless-stopped
    labels:
      - traefik.http.routers.xui.rule=Host(`xui.ДОМЕН_TRAEFIK.com`)
      - traefik.http.routers.xui.service=xui-web-config
      - traefik.http.services.xui-web-config.loadbalancer.server.port=54321 #ПОРТ ДЛЯ Web-морды

      - traefik.http.routers.xui-sub.rule=Host(`sssub.ДОМЕН_TRAEFIK.com`)
      - traefik.http.routers.xui-sub.service=xui-subscription
      - traefik.http.services.xui-subscription.loadbalancer.server.port=4433 #ПОРТ для подписок

      - traefik.tcp.routers.vless.rule=HostSNI(`www.microsoft.com`) 
      - traefik.tcp.routers.vless.tls.passthrough=true
      - traefik.tcp.routers.vless.service=xui-reality
      - traefik.tcp.services.xui-reality.loadbalancer.server.port=443
      
networks:
  intranet: #СЕТЬ В КОТОРОЙ РАБОТАЕТ TRAEFIK
    external: true

Единственная проблема в том, что в веб-морде неправильно отображается ссылка на подписки, приходится менять http на https в начале и удалять порт. Если кто-то знает где это принудительно настроить, буду очень благодарен.

О, спасибо большое за Traefik! Как раз думал, как с помощью Traefik на VPS разнести X-Ray и сервисы, которые с домашнего сервера через VPN во внешний мир выходят.

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

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

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

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

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

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

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

  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).

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

:)

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

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

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

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

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

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

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

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

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

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

Идея 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 вроде был какой-то баг на эту тему, но должны были уже исправить).

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

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

Подскажите, настройка direct по geoip для России у кого-нибудь заработала? Поставил отметки, но всё равно через прокси идёт. Проверял яндексом.

Настройка на клиенте или на сервере?

На сервере.
Выставляю галки "Direct connection to Russia IP ranges" и "Direct connection to Russia domains" в Xray Configuration>Direct Country Configs.
Ничего не происходит, весь *.ru через прокси идёт. Хотя настройки Block Country Configs работают (отдельно выставлял, вместо директ, не вместе).

Через windows клиент, по вашей методичке из предыдущей статьи отлично работает.

Если через маршруты в Nekobox на android такое настроить, то работает паршиво.
Первое посещение домена *.ru заканчивается "не удаётся получить доступ к сайту", с энной попытки перезагрузить страницу проваливается в direct.

По этому хотел на сервере настроить.

Выставляю галки "Direct connection to Russia IP ranges" и "Direct connection to Russia domains" в Xray Configuration>Direct Country Configs.

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

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

Со стороны сервера возможно запилить такие правила, но... для этого нужно два сервера :) Например, вы подключаетесь на первый сервер (в России), там стоит эта самая опция которая делает direct для российских доменов и IP-адресов, а все остальное отправляет на второй сервер. Скорее всего эти опции они сделали для такого случая, но там, как я уже сказал, нужно два сервера, и дополнительные настройки в конфигурации первого из них (outbound на второй сервер).

Если через маршруты в Nekobox на android такое настроить, то работает паршиво.

Первое посещение домена *.ru заканчивается "не удаётся получить доступ к сайту", с энной попытки перезагрузить страницу проваливается в direct.

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

На v2rayng пашет давно, а вот в v2box на айфон не нашёл как добавить

v2box еще куцый и сырой и в такое не умеет, там только совсем базовый функционал.

Зато пашет стабильно... а вот остальное не работает либо криво работают

Интересно, API routes указанный на GitHub, кто-то использовал? Как это работает? Я пытался через телеграмм бота подключаться (по мимо возможности настройки бота в панели, он кстати хорошо работает но не очень функционален), как то не получается(((

API работает, но как-то странно.

1. Создание пользователей с данными в формате json мне не удалось, но в urlencode успешно отработало.

2. Эксперименты проводил в консоли bash с помощью curl, отдельно пришлось указывать версию http0.9

P.S.: Тележный бот только для информирования.

А никто не знает панель, которую можно было бы развернуть у себя локально, чтобы настраивать сразу несколько удаленных серверов, собирать статистику по пользователям сразу со всех серверов?

Увы, мне не попадалось. Сам такую хочу.

Я нашел одну (https://trojanpanel.github.io/), даже получилось развернуть ее, кое-как работает. Но во-первых, сам код панели закрыт, а во-вторых она требует неимоверного количества открытых наружу портов для функционирования.

Redis, MySQL... да, что-то они прям слишком навернули для такой задачи...

Все работает. Но, одно непонятно:

Почему у клиентов теперь все предложения на YouTube, в браузере тоже хоть сбрасывай все настройки, показывает Тегеран. У этого xray...весь трафик прогоняется через какой-то сервер в Иране?

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

У XRay совершенно точно трафик не прогоняется через какие-либо сервера ни в Иране, ни где-либо еще - это не то чтобы даже невозможно, но точно бессмысленно технически. В коде XRay ничего подобного нет.

Было подозрение что автор панели добавил в XRay какую-то отсебятину - проверили, в docker-образе оно собирается из исходников с гита, там никаких подозрительных патчей нет, и потом еще кто-то в комментариях к одной из старых статей пожаловался на такое же, только не про Иран, а про Китай :)

Для уверенности мы довольно долго смотрели в netstat и wireshark, вердикт - никаких левых подключений не делается.

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

Так что фиг знает. Единственное, что наталкивает на размышления - в docker-контейнере из коробки стоит таймзона Asia/Tehran, но как именно оно утекает - вопрос, потому что по идее из контейнера если "свои" запросы и делаются, то таймзона там не фигурирует - есть теория про проверку связности (обычно делается запрос на gstatic за 204-м кодом) или про DoH, в результате чего таймзона контейнера как-то все-таки уходит в запросе Гуглу и тот использует часовой пояс как основной критерий для геолокации, причем оно у них донельзя забаговано и через браузерные куки распространяется половым путем - например, Гугл стал считать иранским айпишник одного европейского хостера, на котором никогда не XRay, ни панели не было, а был обычный OpenConnect, причем считать стал ретроспективно, с 2021 года (когда на этом сервере вообще никаких прокси не водилось).

Есть кстати ещё одна идея. Случайно не Nekobox в TUN-режиме используете? И Chrome как браузер?

можете подсказать как бы настроить "постоянный протокол ws" + tls ? мне нужны сертификаты... где их добыть и как их внедрить ? да ваша инструкция хороша но на айфоне нету Wings X , а Shadowrocket кривой (

Сначала нужно зарегистрировать домен. Если нет нужды работать через CDN, то подойдет даже какой-нибудь no-ip или dynu. Если нужно работать через CDN, то домен должен быть настоящий (не dyndns).

Домен должен указывать на IP-адрес вашего сервера.

Сертификаты можно запросить у Let's Encrypt бесплатно, инструкции есть на сайте certbot.

Просто говоря, нужно установить certbot (apt install certbot на debian/ubuntu), потом сделать

certbot certonly --standalone --preferred-challenges http -d example.com

подставив там свой домен, он получит сертификаты и будет автоматически их обновлять каждые три месяца. Ну и потом использовать эти сертификаты.

Настройка XRay вручную описана в предыдущей статье, и там же есть про сертификаты.

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

Wings X по-прежнему в аппсторе: https://apps.apple.com/us/app/wings-x/id6446119727
Другое дело, что он не работает на устройствах со старой iOS.

А что кривого в Shadowrocket? Я им пользовался когда еще не знал про Wings X, он крутой, все что надо есть и работает как надо, своих денег вполне стоит.

Wing X, поменял региональную доступность для сторов

А, понятно. Тогда остается Shadowrocket.

Подскажите настроки geoip для Shadowrocket.

Настройка маршрутизации в Shadowrocket (iOS)

Если нужна фильтрация только по .ru-доменам, то все вообще просто

На главном экране в пункте Global routing выбираем Config:

Далее идем на вкладку Config, там идем в General:

Скроллим ниже к Skip Proxy, и добавляем туда новый пункт "*.ru":

Сохраняем. Всё, готово.

Если нужен именно GeoIP, то чуть сложнее

Идем на MaxMind Geolite2 и регистрируемся там: https://dev.maxmind.com/geoip/geolite2-free-geolocation-data

Как зарегались и залогинились - нажимаем Manage License Keys -> Create License Key. Он сгенерит новую лицензию - важно сразу сохранить Account ID и License Key, ключ целиком показывается в интерфейсе только один раз, потом еще раз посмотреть уже нельзя будет!

В Shadowrocket идем в Settings, там ищем Geolite2, и заполняем наши данные:

Нажимаем Update - он должен подтянуть актуальную базу.

Потом как и в прошлом пункте, на главном экране выбираем Global Routing - Config, идем в Config, и там не в General, а в Rules:

Жмем плюсик, и создаем новое правило с типом geoip, policy = direct, и country/area пишем "RU" (обязательно большим буквами, иначе не сработает):

Сохраняем, пользуемся.

Спасибо! у Shadowrocket (iOS) вышло обновление, завезли поддержку Reality.

Не смог зарегистрироваться в dev.maxmind.com, не нравится почта (пробовал разные) и говорит что сижу через VPN. Домашний/рабочий ip, vpn разных локаций, толку ноль.

Кривой он кревее не бывает ... он так " с коробки" и не запустился... поставил x2box и пошло как по маслу

Вы что-то делаете не так. По моему опыту, Shadowrocket наоборот самый стабильный клиент под айфоны. У меня на сервере торчат несколько айфоноюзеров именно с ними проблем вообще никаких - установили, добавили сервер через QR, все заработало сразу же и без глюков с пол-пинка.

как shadowrocket подружить с ss, который генерит 3x-ui?

раньше без панели 3x-ui в xray можно было указать один пароль

       "port": 111,
       "protocol": "shadowsocks",
       "settings": {
         "method": "2022-blake3-aes-128-gcm",
         "password": "1111",
         "network": "tcp"

3x-ui генерит два пароля, а в shadowrocket только один пароль можно указать.

"port": 111,
      "protocol": "shadowsocks",
      "settings": {
        "clients": [
          {
            "email": "em@il",
            "password": "1111"
          }
        ],
        "method": "2022-blake3-aes-128-gcm",
        "network": "tcp",
        "password": "22222"
      },

все разобрался. пароли в клиенте разделяются двоеточием.

Спасибо за статьи, сильно помогли. Хотел добавить, что также существует клиент на роутеры Asus - "Merlin Clash". Главный минус - клиент и требуемая прошивка добавляющая дополнительное меню (Asus Merlin-Koolshare) полностью на китайском. Ссылка на неполную англ. инструкцию - MerlinClash - WannaFlix.

PS: Если кому-то захочется его использовать, то найдите настройки DNS и уберите все китайские.

Тут нужно только добавить. что, судя по названию, он основан на Clash, а у Clash во-первых свой специфичный формат конфигов (в прошлой статье я приводил пример), а во-вторых, оригинальный Clash не поддерживает VLESS и все эти новомодные штуки типа XTLS, и этот проект, судя по всему основан именно на оригинальном Clash, а не на форке Clash Meta (который гораздо прогрессивнее)

Такой вопрос, можно ли как-нибудь настроить DNS over HTTPS формата "https://dns.google/dns-query" , хочу чтобы рекламу резало на уровне dns, но не могу разобраться как правильно вписать это в конфиг в json формате.

И второй вопрос, хочу настроить чтобы все российские сайты шли напрямую, но чтобы это было настроено на сервере, а не на клиентской стороне, возможно ли такое?

можно ли как-нибудь настроить DNS over HTTPS формата "https://dns.google/dns-query" , хочу чтобы рекламу резало на уровне dns, но не могу разобраться как правильно вписать это в конфиг в json формате.

Во-первых можно настроить чтобы все обычные (не DoH) запросы переадресовывались на какой-нибудь сервер (например 8.8.8.8 или на локальный типа dnsmasq или PiHole), это сработает при использовании VPN/TUN-режима, но для тупого системного прокси может не прокатить.

В outbounds добавить специальный outboud:

  {
      "tag": "DNS-Internal",
      "protocol": "dns",
      "settings": {
        "address": "127.0.0.53",
        "port": 53
      }
  }

и добавить специальное правило в routing, чтобы все что идет на 53 UDP или TCP порт заворачивалось туда:

{
  "type": "field",
  "port": 53,
  "network": "tcp,udp",
  "outboundTag": "DNS-Internal"
},

DoH можно попробовать вкрячить через sniffing, для прокси-inbound'а включить sniffing:

"sniffing": {
  "enabled": true,
  "destOverride": ["http", "tls", "quic"]
}

и в корне конфига добавить секцию "dns", типа так:

"dns": {
    "servers": [
      {
        "address": "https://8.8.8.8/dns-query",
        "domains": [],
        "queryStrategy": ""
      },
    ],
    "tag": "dns"
  },

Но будет ли оно работать - вопрос открытый :)

Можно не печалиться. Автор упомянул "панель Алирезы", не знаю, означает ли это что будет что-то принципиально новое, но у Ализеры есть форк X-UI: https://github.com/alireza0/x-ui
(и туда, судя по всему, контрибьтит и автор 3X-UI), я только что потестировал - тоже работает без проблем, есть небольшие отличия, но в целом инструкции подходят те же самые.

Хорошо что хотяб можно на 443 порту добавить сотню и более пользователей с разным ip)

Жаль что они никак не сделают 1 классную панель.

В панели Libertea - https://github.com/VZiChoushaDui/Libertea
есть 2 классных фишки - мультисерверность и возможность добавить "вторичные" сервера. Но при этом нет современных протоколов (((

В панели 3x-ui - всё круто, но нет мультисерверности. Придется придумывать как это реализовывать.

И ни в 1й, кроме hiddify, нет MTproxy для телеги (
А в hiddify нет ограничений по количеству одновременных сессий для юзера (

Спасибо, я пока сам не пробовал, лишь видел упоминание этой панели в официальных рекомендациях от Xray. Можешь подсказать про мультисерверность? Она умеет настраивать несколько удаленных серверов, как я спрашивал в этой ветке, или просто соединять их в цепочку (inbounds / outbounds)?

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

на этом "вторичном" сервере по сути они ничего не делают, только создают там конфиг haproxy в докере, и проксируют весь траф на первичный сервер))
Ну добавляют естественно такие же порты и протоколы, что и на основном сервере

так что никакой "мультисерверностью" там и не пахнет

@Drno Дружище, приветствую! "А в hiddify нет ограничений по количеству одновременных сессий для юзера (" - здесь ты имеешь в виду чтобы один конфиг был только для 1 устройства? Вот например на Pritunl можно можно поставить такую галочку как "Disable multiple devices". В этом случае запрещается одновременное подключение двух разных устройств с одного конфига. На практике это работает так - они просто "перебивают" друг друга. Тоесть если ты включил у себя, а твой друг включит у себя, то тогда у тебя соединение разорвется. И соответственно наоборот. Так вот к чему я это пишу - возможно ли что-то подобное сделать на 3X-UI ? Просто ты пишешь про hiddify и я подумал, может ты знаешь как это сделать в 3X-UI. Видел там есть ограничение по IP, но как это работает пока нифига не понимаю. Поставил значение 1(чтобы не больше одного), сохранил настройки на серваке, на двух устройствах обновил подписку(URL конфиг один и тот же есно) - хоть бы хны! Сначала включил на айфоне, даже включил видео на ютубчике. Потом запустил этот же конфиг на андроиде, он спокойно подцепился и тоже начал гонять трафик. Причем сначала он ничего не пробивал, но после пары обновлений страниц в браузере все завелось. Также ютуб и остальные приложение, везде все прогружалось. При этом на айфоне соединение тоже осталось активным, гоняло трафик и даже не думало отключаться. При всей продуманности 3X-UI(просто мечта впнщика), как они могли так облажаться с такой элементарной необходимой функцией - я не понимаю, правда. Есть ли решение этой проблемы в этой панельке? Просто получается, что одной подпиской может пользоваться хоть целый город, а так не пойдет.

Я еще не проверял этот функционал досконально. Но объяснение, которое я находил на гитхаб, было такое - мол при подключении 2го клиента, 1й отключается в течении минуты.
Так еще было что то про добавление строки команды в кронтаб... подозреваю для отслеживания как раз изменений в IP... но не могу пока ссылку нарыть. это было в одном из форков указано

Этих форков куча на github, вот один из основных, может он будет лучше.
https://github.com/FranzKafkaYu/x-ui/blob/main/README_EN.md

Забавно, как только ответил - нашлась ссылка. Если я правильно понял - это будет работать только если внешние IP у клиентов разные ))

https://github.com/NidukaAkalanka/x-ui-english#ip-limitation-and-multi-user-on-same-port

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

Могу только сказать, что мысль - промаркировать трафик клиента, далее перенаправить на прокси (3proxy к примеру), далее уже лимитировать скорость и количество подключений.
Но тут придется в под каждого юзера вносить изменения в серв конфиг Xray - который config.js...

Спасибо, прочекаю ссылки. Ну вот смотри, по идее, а как он определяет, какой именно конфиг подключился к серверу? Правильно, скорее всего по id или ключу.

Так почему разрабам было сложно таким же образом маркировать кол-во подключений на 1 конфиг? Ведь по идее, у нас есть несколько способов понять, кто именно подключился и держит соединение:
1. email клиента(в 3x-ui графа при добавлении клиента);
2. Имя подписки(тут отметаем, поскольку не все будут использовать режим подписки, нужен более универсальный метод);
3. Для Reality - по id, а для SS password. Определяется и назначается в панели автоматически;
4. Ограничение общего кол-ва устройств. Пример: допустим мы добавили 5 пользователей, ставим макс ограничение на сервере в 5 устройств и вуаля! Больше 5-ти устройств априори не подключиться.

Тоесть понятно, что способы идентифицировать подключение имеются. И не совсем понятно, почему разрабы выбрали именно по IP.

"Но тут придется в под каждого юзера вносить изменения в серв конфиг Xray - который config.js..." - возможно ты прав, только чтобы ручками потом все это дело не редактировать под каждого, можно добавить этот пунктик сразу в панель. Еще на этапе добавления этого самого конфига в систему. Вопрос в другом, есть ли среди существующих форков хоть один, который нормально работает с ограничением по ip? Попробую поиграть с настройками на 3x-ui, исходя из тех ссылок, что ты скинул. Если не проканает, буду пробовать баловаться с другими форками.

П.с. На данный момент 3x-ui работает коряво с ограничением по ip. На этапе добавления конфига ставлю циферку 1, т.е. не более одного. В итоге работает это примерно так: я подключаюсь с основного устройства, включаю видео в инсте. После этого, по этой же конфигурации подключаюсь с другого устройства. Сети использую разные, у одного WF, у другого LTE. В итоге на втором устройстве подключение проходит успешно, но трафик сначала не идет(поиск и переход по стр. в браузере, приложения итд). После он начинает потихоньку пробиваться, то инста прогрузиться, то браузер, то телега и так по кругу. Тоесть переодически какой-то трафик гасится, а какой-то нет. Да конечно можно предположить, что юзер который решил схалявить и схитрить и это выбесит, но не слишком наверняка.

Причем потом добавил это же подключение и на 3-е устройство, уже под андроидом - тоже все криво со скрипом, но работало. Что еще интереснее, видимо он смотрит именно по активности трафика, а не самого факта подключения к серверу. Как только с основного устройства отправляешь телефон на блокировку экрана, тут же на 2-ом все начинает работать вообще без каких-либо сбоев.

Итого - мне не совсем понятно, нафига там вообще тогда можно создавать разные конфиги, если можно создать всего 1 и раздать хоть всей планетушке :) У меня было предположение, что возможно трафик пробивается на 2-ом устройстве, потому что сервер работает в режиме ipv4 и ipv6 одновременно, что из-за этого ip детектер работает коряво. Не знаю насколько это может быть правдой, но а вдруг?

Так почему разрабам было сложно таким же образом маркировать кол-во подключений на 1 конфиг?

 И не совсем понятно, почему разрабы выбрали именно по IP.

Потому что таков протокол, по-другому никак.

Большое отличие прокси-протоколов от VPN в том, что когда вы нажимаете "Подключиться" в VPN-сервере, то устанавливается одно подключение между клиентом и сервером, и по нему бегает весь трафик. С проксями все по-другому: когда вы нажимаете "подключиться" в приложении, между клиентом и сервером ничего не происходит. Вообще ничего, сервер даже не знает, что вы нажали кнопку. Зато когда какое-нибудь приложение с вашего устройства пытается вылезти в инет и подключиться к какому-нибудь ресурсу, на каждое такое подключение прокси-клиент установит соответствующее подключение к прокси-серверу. А когда это подключение к сайту закрывается - тогда закрывается и соответствующее подключение к прокси.
То есть невозможно ставить ограничения по количеству активных подключений для одного user ID, у вас просто не будет ничего работать - когда вы заходите на любой сколь-менее сложный сайт, ваш браузер создает десятки подключений (например, одно к самому сайту, одно к поддомену где лежат картинки, одно к CDN где лежат скрипты, а это еще может быть умножено на N при параллельной загрузке ради ускорения) - соответственно, при открытии сайта будут висеть десятки подключений к прокси. А когда браузер через N минут закроет подключения по таймауту, пропадут и подключения к проксе.

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

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

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

Почему на втором работает при неактивности первого - потому что это ПРОКСИ, это не VPN сервер. у него как такового постоянного подключения к серваку нет. Только когда активные запросы идут...

Насчет ipv6 ничего сказать не могу. но вполне реально что для сервака это 2 разных "запроса" - через ipv4 и через ipv6

Нашел вот такой момент, что за пункт maxclient? За что он отвечает?

вижу там maxversion, не клиент. Или ты что-то другое хотел донести до меня?)

да, я ошибся. у меня такого нет. Оно есть только в графе PrivateKey
настроен vless + reallity

Прочекал ссылку что ты дал, не заметил разницы в коде с тем, что у меня в настройках. Разве что лишь про днс там удалено. Хз повлияет ли как-то это или нет. Придется наверное еще другие панельки потестить, как у них реализована блокировка лишних ip.

Вообщем Miracle всё расписал правильно про протокол прокси. С ограничением на кол коннектов реально перестает грузится часть сайтов \ окон \ рекламы итд...

Это происходит при указании низкого connlim в конфиге 3proxy

По сути варианта решения толком не существует.

С ограничением скорости решили - перенаправив каждого пользователя на 3proxy с авторизацией и ограничив уже там скорость

вот такими параметрами
bandlimin 1048576 user9
bandlimout 1048576 user9

Ну и щас в 3proxy есть скрипт на добавления юзеров изкоропки, пришлось его немножко поправить, чтобы он добавлял и параметр bandlimout.
Начало скрипта теперь вот так выглядит
if [ $4 ]; then..
<------>echo bandlimin $4 $1 >> /etc/3proxy/conf/bandlimiters
echo bandlimout $4 $1 >> /etc/3proxy/conf/bandlimiters
fi

Обнаружена утечка ip по webRTC кода используешь NEKORAY + windows. Подскажите почему?

Не подскажу, слишком мало информации, я не телепат :) чтобы сказать, нужно знать, какой именно адрес утек. Нередко все эти кривые "сервисы проверки анонимности" паникуют и кричат про утечку, показывая в качестве "утекшего" адреса локальный класса C (за роутером) или вообще адрес TUN-интерфейса, и утечкой как таковой это не является.

Добавьте расширение в браузер: WebRTC Control - Интернет-магазин Chrome (google.com) и утечка реального ip прекратится.

Ещё 5 коп.
При использовании dns cloudflare (1.1.1.1) в тестах а-ля "DNS Leak Test", помимо прочих, нерусских, лезут российские ip-шники DNS серверов cloudflare.

Мне помогло просто использование VPN (TUN) режима вместо system proxy в Nekobox :)

Почему то никак не работает маршрутизация для зоны RU в Nekobox. Пытался использовать ваши правила и способ пользователя через regexp - вылетает вот это окно. Почему?

Спасибо в первую очередь за мануал и за развитие темы!

Удалось все сделать, но есть маленький нюанс, простой SS имеет очень длительный handshake 4200 мс и не открывается ни один сайт, с Vless+reality все четко handshake 400 мс и все открывается, как запустить работу простого SS или тупо забить.

приложение android vrayng последняя версия.

простой SS имеет очень длительный handshake 4200 мс и не открывается ни один сайт

Это очень странно. В плане времени хендшейка никаких особых различий между VLESS и SS быть не должно.

Попробуйте перевесить SS на другой порт (если бы на низком типа 23, то на высокий типа 34567, и наоборот).

@MiraclePtrПри попытке запуска докера выдает ошибку, не пойму в чем дело.

root@ubuntu-8gb-hel1-2:~/3x-ui# docker-compose up -d

ERROR: Version in "./docker-compose.yml" is unsupported. You might be seeing this error because you're using the wrong Compose file version. Either specify a supported version (e.g "2.2" or "3.3") and place your service definitions under the `services` key, or omit the `version` key and place your service definitions at the root of the file to use version 1.

For more on the Compose file format versions, see https://docs.docker.com/compose/compose-file/

пысы. Ubuntu 20.4

Ну ошибка там прямым текстом указана - слишком старая версия докера.

Варианты:

  • обновиться с ubuntu 20.04 на 22.04

  • попробовать поставить docker не из репов дистрибутива, а подключив докеровские репы, там должна быть версия свежее

  • попробовать подкрутить версию в docker-compose.yml, может быть сработает

Обновился до 22.04 - все запустилось, благодарю! Подскажи еще, сколько максимально узеров можно добавить?

Фиг знает, теоретически сколько угодно, главное чтоб серве не лопнул :)

Я наверное совсем нубай тугой. Вопрос такой, я изменил корневой каталог и порт на веб морде, но теперь никак не могу зайти на нее :DD
Как верно прописать то в адресной строке теперь?

http://ip_address:port/path/panel обычно как-то так

Благодарю дружище! Ты проделал такую огромную работу, просто чтобы у людей была возможность пользоваться тем чем хочется, а не тем, что тискает РКН. Дай вселенная тебе и твоей семье всех благ и здоровья!)

@MiraclePtr Обнаружил такой момент, при попытке что-либо найти через поисковик, выдает вот это:

03. That’s an error.

Your client does not have permission to get URL /search?q=%D1%87%D1%82%D0%BE+%D0%BF%D1%80%D0%B8%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%B8%D1%82%D1%8C+%D0%BD%D0%B0+%D0%BE%D0%B1%D0%B5%D0%B4&rlz=1CDGOYI_enRU758RU758&oq=&aqs=chrome.3.69i58j69i177j69i64j0i66i67i308i362i524i650l8j35i39i362i524l5j46i39i175i199i362i524j35i39i362i524j46i39i175i199i362i524j35i39i362i524.197954j0j9&hl=ru&sourceid=chrome-mobile&ie=UTF-8 from this server. That’s all we know

Что можно прикрутить по другому в настройках? Потому что клиентам все с гуси вода, нет поиска и "нафик нужОн тогда ваш впн дерьмовый"(с) любой юзер.

Похоже, вас забанили в Гугле, пря как в анекдоте.

Я не представляю, что нужно сделать, чтобы такое случилось. Прокси никак не влияет на передаваемые данные и не добавляет никаких маркеров, он тупо пересылает трафик с вашей машины на удаленный хост и обратно.

Возможные варианты: если сервер новый, недавно созданный - возможно предыдущий владелец IP-адреса творил дичь и попал в спам-листы. Если сервер не новый и раньше все работало - то возможно раньше у вас оно работало попробовать отключить в клиенте IPv6, многим помогает (на такую ошибку в интернете жалуются очень многие, даже те, кто никаких VPN'ов и прокси не используют, похоже на какой-то баг Гугла, либо же проблема та же что и в прошлом пункте).

Насчет бана исключено, потому что другу скинул, у него на ios через Foxray все работает. Еще одно наблюдение - именно на SS, на Re нифига. А у меня ни там, ни там. Еще момент такой, на версии для Mac Nekoray не пойму как добавить подключение по Subscribe, как там это сделать?)) Вижу только, что вручную можно настройки ввести, но это жуть.

А у меня ни там, ни там.

Попробуйте 1) отключить IPv6 в клиенте и на сервере (прокси) 2) использовать system proxy mode вместо TUN или наоборот.

Похоже на то, что вы ходите до Гугла по IPv6, а у вашего друга с маком только IPv4.

@MiraclePtr Не в курсе случайно, возможно ли как-то ограничивать подключения с одного конфига(в т.ч. ссылки url)? Чтобы например если одному юзеру дали ссылку, а он ее не раздал нахаляву всему городу. Тоесть 1 устройство = 1 конфиг. Видел там ограничение по ip адресу, он пишет что якобы если более 1, то сбросит соединение. Но на деле я закинул ссылку на два устройства, на одном вф, на другом лте - оба подключились без проблем и гоняли трафик. Это просто никуда не годится для массовости. Неужели не продумали разрабы до конца такой тонкий момент(

Проблема в том что Trojan дырявый и детектируется парой десяткой строков кода.

Так что остается только писать feature request'ы авторам XRay и Sing-box.

Прикольно, надо будет попробовать. Здесь речь про TLS in TLS, но Trojan-Go настроен ходить по вебсокетам через CDN. Такое тоже ломается?

Ну, до CDN эти вебсокеты бегают по TLS, и внутри у них бегает тоже TLS. Так что весьма вероятно тоже ломается (разве что конкретные эвристики чуть-чуть подкрутить придется).

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

На самом деле даже интересно, как реализовать такую штуку.

Потому что сама суть всех этих прокси-протоколов, что на каждое подключение куда-либо создается новое подключение к прокси (если не используется мульиплексирование, но оно не совместимо с XTLS и XUDP, поэтому его сейчас мало где используют).
Учитывая, что трафик от клиентов идет не потоком, и подключения висят тоже не постоянно, ограничение на количество активных пользователей на 1 IP может работать с забавными эффектами (они будут по-очередно выкидывать друг друга и не давать подключиться), а в ряде случаев вообще не работать, например если юзеры подключаются в разное время, или подключаются через одного и того же провайдера с NAT и им достался один и тот же внешний адрес.

  1. В интерфейсе можно найти эти настройки?

  2. Выше же писали, что 3x-ui не будет дальше обновляться, планы изменились? Стоит переходить на форк?

  3. Не очень понял ключевую разницу в фичах между 3x-ui и x-ui. Верно ли я понял, что x-ui будет получать обновы из 3x-ui или они развиваются независимо?

А вот такой вопрос: настроил сервак с vless+reality на 443 порту с мимикрией под майкрософт, но при попытке курлануть их сайт или сходить на него браузером (с правкой hosts файла) получаю ворнинги о невалидном сертификате. И только после подключения к тоннелю мой сервак начинает правильно редиректить на майкрософт. Что не так, куда копать?

Сложно сказать, не видя конфигов сервера и выхлоп курла (какой именно домен фигурирует в неправильном сертификате?)

Пока коммент модерировали, разобрался, всё ок. В конфиге был прописан microsoft.com как SNI, а в курле и в хостах я пробовал www.microsoft.com.

Развивая тему, не попадался ли вам вариант поднятия x-ui сервера внутри openwrt? И ещё интересно, есть ли виндовые клиенты с killswitch?

PS: спасибо за статьи!

Подскажите пожалуйста. Устанавливаю по инструкции с гитхаба 3x-ui (x-ui тоже пробовал)
По логам установка проходит успешно и через докер и через скрипт, но подключиться к серваку не получается, порт недоступен.
посмотрел netstat -tulpn |grep x-ui , а там прослушивание нужного порта только на ipv6.

Как сделать что бы этот 3x-ui начал слушать ipv4?

а там прослушивание нужного порта только на ipv6.

Уверены? Как точно выглядит строка?

В линуксе "tcp6 :::2323" обычно означает что сокет доступен и по IPv6, и по IPv4.

И 3X-UI (как и X-UI) по умолчанию слушает и на IPv4, и на IPv6. Может у вас какие-то правила фаервола мешают?

Линукс меня не перестает удивлять.. Я перед тем как писать коммент специально проверил - не блочит ли файрволл этот порт. Отключил его на всякий случай, на запрос "ufw status" он сообщал что статус - inactive.

Сейчас просто для теста ещё раз его отключил и страница авторизации открылась..

А вот по поводу того что "tcp6 :::" означает что прослушивается и ipv6 и ipv4 - не знал, спасибо)

Пытаюсь подключиться к Tor через прокси на порту 2080, который открывает NekoBox (принимает HTTP и SOCKS). Через HTTP Tor подключается, а через SOCKS - нет, ругаясь на TLS:


Jun 06 13:59:16 debianvm tor[7402]: Jun 06 13:59:16.000 [warn] Problem bootstrapping. Stuck at 10% (conn_done): Connected to a relay. (TLS_ERROR; TLS_ERROR; count 33; recommendation >
Jun 06 13:59:16 debianvm tor[7402]: Jun 06 13:59:16.000 [warn] 33 connections have failed:
Jun 06 13:59:16 debianvm tor[7402]: Jun 06 13:59:16.000 [warn] 33 connections died in state handshaking (TLS) with SSL state SSLv3/TLS write client.

При этом команда curl --socks5-hostname 127.0.0.1:2080 ipinfo.ioработает как положено, выдавая IP VPS, где крутится XTLS-Reality.

Под Win7 аналогично.

В чем может быть дело?

Из лога Tor'а непонятно, что конкретно ему не нравится, поэтому не знаю.

Я в свое время делал проще - раз уж есть VPS, то Tor-клиент ставил прямо на этом VPS, а в Xray-core на том же сервере в качестве outbound прописывал на freedom, а этот самый локальный Tor в качестве вышестоящего socks-прокси. И все работало, хотя параноикам, наверное, такой вариант может и не подойти.

Спасибо огромное за статью, всё встало, как надо.

Единственное, подскажите, как прописать пути к сертификатам?
у меня постоянно вылезает ошибка:
Modify Settings Fail: cert file </root/certs/cert.pem> or key file </root/certs/privkey.pem> invalid: open /root/certs/cert.pem: no such file or directory

где я ошибся?
где я ошибся?
Вся цепочка сертификатов на месте.
Вся цепочка сертификатов на месте.

Разобрался, я неверный файл указывал изначально. Вот правильный вариант.

Правильный вариант
Правильный вариант

Выше это был 3x-ui и там все получилось.

Решил я x-ui попробовать, сделал всё также, но опять ошибка вернулась.

Вы зачем делаете симлинк на симлинк можно спросить?)

Имею крайне мало опыта в работе с Линуксом, поэтому могу допускать ошибки.

Видимо это одна из них.

И всё таки, что я делаю не так? Почему x-ui не принимает мои пути до сертификатов?

таким образом попробовал - все работает. alireza x-ui 1.5.0

вы указываете /root/cert, а сертификаты в /root/certs?

пропишите напрямую в /etc/letsencrypt/live/domain/

Сертификаты в /root/cert и пути такие же. Там выше просто экспериментировал.

Напрямую тоже прописывал и та же ошибка.

В общем не могу понять, что не так.

Вы в Докере запускаете?

Нужно во-первых проверить Dockerfile или docker-compose (смотря что именно используете чтобы развернуть образ), правильные ли пути те, что в файле указаны, и куда вы кладете сертификаты и какие указаны в панели, и во-вторых, иметь в виду, что симлинки внутрь докера не работают, нужно именно копировать файлы в нужную диру.

У меня с докер композом единственное откуда x-ui принял файлы – это /root/cert

Ни из letsencrypt с симлинками, ни из собственной папки cert без симлинков, ни даже из /tmp. На chmod издевался вплоть до 777. Магия (что неприятно).

Стало чуть понятней. При указании /root/cert/fullchain.pem и /root/cert/privkey.pem он берёт файлы из своей $PWD/cert/, а в /root/* даже не заглядывает.

пропишите напрямую в /etc/letsencrypt/live/domain/

при запуске в докере не сработает

Можно указать сертификаты в xray, сделать fallback на nginx, в nginx проксировать на x-ui.

Не надо никакие http/s порты выставлять наружу дополнительно.

Hidden text
{
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "email": "1111",
            "flow": "xtls-rprx-vision",
            "id": "222"
          }
        ]
      "decryption": "none",
        "fallbacks": [
          {
            "dest": "8001",
            "xver": 1
          },
          {
            "alpn": "h2",
            "dest": "8002",
            "xver": 1
          }
        ]
      },
  "streamSettings": {
        "network": "tcp",
        "security": "tls",
        "tlsSettings": {
          "minVersion": "1.3",
          "rejectUnknownSni": false,
          "certificates": [
            {
              "certificateFile": "/etc/letsencrypt/live/domain/fullchain.pem",
              "keyFile": "/etc/letsencrypt/live/domain/privkey.pem"
            }
          ],
          "settings": {
            "allowInsecure": false,
            "fingerprint": "random"
          }
        }
    }
}

Hidden text
location /xui {
    auth_basic "Administrator Area";
    auth_basic_user_file /etc/nginx/.pwd;
    proxy_set_header    Host $host;
    proxy_set_header    X-Real-IP $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto $scheme;
    proxy_read_timeout  600;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:2053;
    }

Hidden text

Можно указать сертификаты в xray, сделать fallback на nginx, в nginx проксировать на x-ui.

Не надо никакие http/s порты выставлять наружу дополнительно.

Это не сработает с Reality, в случае с Reality фолбэк может быть только один, и он должен быть на какой-то другой популярный сервер, иначе теряется весь смысл.

не спорю, я про vision, которого пока хватает)

@MiraclePtrСтранная ситуация. FoXray не читает QR код, пишет не корректные настройки. В то время этот же QR залетает в V2Box на ура. В чем может быть затык, что я упустил?

Неужели только у меня такая проблема?

в foxray перестал видеть shadowsocks, не знаю как пофиксить

Включение подписки ломает Foxray. Если отключить нормально считывается.

Только что проверил с последним FoxRay, SS-2022 подключение отсканировалось без проблем, что из v2rayNG, что из Nekobox.
Если пытаетесь сканировать QR из X-UI панели - можно попробовать сначала добавить подключение оттуда по ссылке в локальный Nekoray, а уже оттуда пошарить QR. Ну и проверить, что в названии конфига и параметрах нет никаких лишних символов (кириллицы, амперсандов, вопросов, точек, лишних слешей, и т.д.)

Спасибо огромное за статью!
Ну, раз вчера грянул гром, решил перекреститься и воспользоваться этим гайдом. В процессе у меня возник вопрос. Как я понимаю тут поднимается два inbound: shadowsocks и vless — это для того, чтобы быстро переключаться с одного на другой, или так строится из них цепочка? Просто я сначала создал shadowsocks попробовал сделать подключение через qr-код — импортировалось, вроде все правильно, но тесты подключения не проходят в итоге. Добавил подключение vless — все работает. И вот непонятно, мне надо пытаться с shadowsocks разбираться, почему там тест не проходит, или забить.

Чтобы переключаться (два альтернативных варианта). Можно забить.

Меня просто смущает, что в одной из статей рассказывалось, что vless не предусматривает шифрование (мол этим должен как раз нижележащий транспорт потипу shadowsocks заниматься). Вот и подумал, что тут как раз цепочка строилась.

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

VLESS не предусматривает шифрование, потому что трафик уже шифруется посредством TLS между прокси-клиентом и прокси-сервером.

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

Как сделать так, чтоб трафик шел только в локальную сеть сервера, но при этом все внешние ресурсы не заворачивались в VPN?

Попробовал на замену скрипта от ФранцаКафки ( в последней версии какой-то баг после апдейтов- не добавить инбаунд).

Все понравилось, кроме одного.. не работает соединение через Shadowsocks-2022. Все делал по гайду вашему. Порты открыты.

Reality же работает прекрасно.

В качестве клиента использую Некорэй

Есть какие-нибудь идеи? У вас SS2022 работал с Некорэем?

Да, у меня с некорэем SS работал.

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

и указать путь к ключам в панели в виде /root/cert/privkey.pem и /root/cert/public.crt

Как только не подсовывал, и файлами и симлинками, не видит докер этих файлов

в компоузе замените строку подключения вольюма с сертами на такую(domain.name замените на ваш домен соответственно):/etc/letsencrypt/archive/domain.name/:/root/cert/:rw

# docker exec -it 96467d9ddafc ls /root/cert
README cert.pem chain.pem fullchain.pem privkey.pem

Внутри докера файлы вижу, а вот содержимое не читает

# docker exec -it 96467d9ddafc cat /root/cert/cert.pem
cat: can't open '/root/cert/cert.pem': No such file or directory

в папке /etc/letsencrypt/archive/domain.name/ серты лежат с именами cert1.pem, privkey1.pem, в папке /etc/letsencrypt/live/domain.name/ лежат симлинки на серты в архиве, их докер видит но не понимает

У меня там лежат cert1,pem, cert2.pem и остальные с такой же нумерацией.

Я беспокоюсь, вдруг они при следующем обновлении опять имена файлов поменяют, поэтому я и натравливал на live папку

Я проверял, при перевыпусках нумерация будет продолжаться, и нужно будет настройки сервера менять регулярно, в теории можно попробовать пробрасывать весь  /etc/letsencrypt/ в /etc/letsencrypt/ контейнера, может и симлинк будет работать тогда, нужно проверять

Удалось скормить серфтификаты
Но сообщение вверху панели так и осталось

Security Alert
This connection is not secure; Please refrain from entering sensitive information until TLS is activated for data protection

Извиняюсь, надо было перезагрузить панель

проверил, - /etc/letsencrypt/:/etc/letsencrypt/:rw так все работает нормально

Да, действительно, так с симлинками все заработало как надо

А можете подсказать, что и как конкретно ввести надо в командную строку VPS сервера? Я просто нуб нубом. И какой путь потом прописать в веб интерфейсе?

А можете подсказать, что и как конкретно ввести надо в командную строку VPS сервера? Я просто нуб нубом. И какой путь потом прописать в веб интерфейсе?

А кто-нибудь может подсказать как обновить версию внутри докера? (https://github.com/alireza0/x-ui). Чтобы настройки не слетели никакие. Спасибо. У меня 1.5.2, а в гитхабе пишет уже 1.5.3. вышел релиз. @MiraclePtr

Отвечу сам, вдруг что кому надо тоже. Зайти в папку cd x-ui

Потом остановить контейнер docker-compose down

Обновить, docker-compose pull xui

И запустить обратно docker-compose up -d

Готово. При этом тут в докер файле настройки и так хранятся в отдельном volume, поэтому ничего не сотрется

Спасибо за статьи. Дико интересно и полезно разобраться, что в этом мире есть помимо обычных ovpn и l2tp.

Установил как указано в статье, но возникли некоторые проблемы с настройкой SSL сертификатов. Но больше всего мучает другой вопрос. Вы не тестили работает ли Foxray с подписками из (3)X-UI? На Android подписки заработали с v2rayNG, а с iOS не взлетело. Сами конфиги не по подпискам работают без нареканий, но хотелось бы настроить всё-так Subscriptions.

Okay, отвечу сам себе. Без SSL-сертфиката и https-ссылки на подписку ничего не будет работать на iOS.

Подскажите, как запустить телеграм бота?

Вроде всё делаю по инструкции, но когда пишу боту - он на меня никак не реагирует. Как можно проверить статус бота? Как понять, может надо какие-то дополнительные порты ему открыть? Использую хостинг digitalocean/ubuntu22+docker. Сам впн работает и нужные порты открывает, когда создаю новые подключения.

Update: я вместо id передавал имя пользовалетя, мой косяк. Всё заработало.

Подскажите, а как обновить версию 3x-ui чтобы ни настройки, ни клиенты не слетели? Изначально устанавливал НЕ через докер

скомпилить или залить готовый бинарник. все сохранится. если не трогать пути к конфигам.

У меня 3x-ui прижился за Traefik. Vless-Reality на :443 в TCP роутере, Shadowsocks на :80 тоже в TCP роутере. Панель и подписки за HTTP роутерами. Никто никому не мешает, HTTP роутеры обычных сервисов не пострадали.

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

А не можете ли поделиться конфигом? Потому что я как не пытаюсь ничего не выходит, работает только вариант с отдельными портами + указание ip напрямую, но совершенно не работает fallback сайт, не понимаю что не так

А не нужен IP контейнера, Docker его предоставляет бесплатно. Лишь бы у Traefik был доступ в его сеть или наоборот, контейнера в сеть Traefik, как у меня. И fallback не нужен. Если в SNI залетел microsoft.com, сразу ясно, чей пациент. В x-ui для inbound с Reality включен только этот Reality. По поводу путей панели и подписок у меня договорённость между x-ui и Traefik. Для HOSTNAME перед запуском был выполнен экспорт из bash: export HOSTNAME. Энтрипоинт на :54321 был добавлен для удобства с панелью. Сейчас у меня x-ui, а у 3x-ui другой дефолтный порт. Да и вообще обратите внимание на имена энтрипоинтов, вдруг не совпадают.

version: '3.9'
services:
  xui:  
    image: alireza7/x-ui:1.5.5
    container_name: x-ui
    hostname: ${HOSTNAME}
    volumes:
      - "./db/:/etc/x-ui/"
      - "./cert/:/cert/"
    environment:
      - XRAY_VMESS_AEAD_FORCED=false
      - XUI_LOG_LEVEL=warn
    restart: unless-stopped
#    network_mode: host
    labels:
      - "traefik.enable=true"
      # Web panel
      - "traefik.http.routers.xui-panel-r.entrypoints=websecure"
      - "traefik.http.routers.xui-panel-r.rule=HostRegexp(`{host:.+}`) && PathPrefix(`/xuipanel`)"
      - "traefik.http.routers.xui-panel-r.tls=true"
      - "traefik.http.routers.xui-panel-r.service=xui-panel-s"
      - "traefik.http.services.xui-panel-s.loadbalancer.server.port=54321"
      # Web panel fix port
      - "traefik.http.routers.xui-panel-rr.entrypoints=p54321"
      - "traefik.http.routers.xui-panel-rr.rule=HostRegexp(`{host:.+}`)"
      - "traefik.http.routers.xui-panel-rr.tls=true"
      - "traefik.http.routers.xui-panel-rr.middlewares=xui-redirect"
      - "traefik.http.middlewares.xui-redirect.redirectscheme.scheme=https"
      - "traefik.http.middlewares.xui-redirect.redirectscheme.port=443"
      - "traefik.http.routers.xui-panel-rr.service=noop@internal"
      # Subscriptions
      - "traefik.http.routers.xui-sub-r.entrypoints=websecure"
      - "traefik.http.routers.xui-sub-r.rule=HostRegexp(`{host:.+}`) && PathPrefix(`/xuisub`)"
      - "traefik.http.routers.xui-sub-r.tls=true"
      - "traefik.http.routers.xui-sub-r.service=xui-sub-s"
      - "traefik.http.services.xui-sub-s.loadbalancer.server.port=4430"
      # Shadowsocks
      - "traefik.tcp.routers.xui-shadowsocks-r.rule=ClientIP(`0.0.0.0/0`)"
      - "traefik.tcp.routers.xui-shadowsocks-r.service=xui-shadowsocks-s"
      - "traefik.tcp.routers.xui-shadowsocks-r.entrypoints=p8080"
      - "traefik.tcp.services.xui-shadowsocks-s.loadbalancer.server.port=8080"
      # Vless/Reality
      - "traefik.tcp.routers.xui-reality-r.rule=HostSNI(`microsoft.com`)"
      - "traefik.tcp.routers.xui-reality-r.tls.passthrough=true"
      - "traefik.tcp.routers.xui-reality-r.service=xui-reality-s"
      - "traefik.tcp.routers.xui-reality-r.entrypoints=websecure"
      - "traefik.tcp.services.xui-reality-s.loadbalancer.server.port=443"
    networks:
      traefik:
#      xui-bridge:
networks:
  traefik:
    external: true
#  xui-bridge:
#    name: xui

Пытаюсь настроить по инструкции, когда пытаюсь подключиться через Nekobox и сделать URL test, получаю ошибку

INFO[0000] outbound/http[proxy]: outbound connection to cp.cloudflare.com:80

[[HTTP] ххх.ххх.ххх.ххх:443] ошибка теста: Get "http://cp.cloudflare.com/": unexpected EOF

Что может быть не так в настройках? Нагуглить не удалось так сходу.

Что может быть не так в настройках?

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

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

А можно ли на эту панель настроить связку с cdn? в одном из комментариев вы писали, что лучше не надо. Но она такая удобная в плане пользования, мне не нужно запускать putty или juicessh, чтобы перезапустить xray, я могу создать отдельный конфиг для друга или родственника за пару минут, мне не нужно будет заходить с телефона и на маленькой клавиатуре вводить команды в консоль. Или все-таки советуете сделать это вручную? Тогда нужно отказаться от панели?

Как раз недавно написал статью: https://habr.com/ru/articles/761798/

С панелью оно тоже должно работать.

Небольшая ремарка - у меня sing-box в Nekobox жаловался на длину пароля, хотел 16 вместо 32 (3X-UI генерирует пароли длиной 32 по умолчанию). Пришлось командой openssl rand -base64 16 перегенерировать пароли с меньшей длиной для inbound и пользователя. После этого заработало.

Ядро Xray работало без таких изменений.

Может быть, это особенность Shadowsocks - пока настраивал только его - не знаю.

Панель x-ui ругается, если её открывать через http. И правильно делает: при желании http трафик легко перехватывается.

Автор x-ui предлагает установить сертификат от let's encrypt.. но во-первых его перевыпускать каждые три месяца, во-вторых ... у меня не завелось.

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

1) Создаю публичный и приватный сертификат
openssl req -x509 -nodes -days 999 -newkey rsa:2048 -keyout selfsigned.key -out selfsigned.crt
Скрипт задаст 6 вопросов, можно отвечать что угодно кроме пятого: тут надо указать ip-адрес

2) Копирую ключи внутрь работающего докера где крутится панель
docker cp selfsigned.key x-ui:selfsigned.key
docker cp selfsigned.crt x-ui:selfsigned.crt

3) Прописываю ключи в веб-панели x-ui (Panel Settings)
- Panel Certificate Public Key File Path : /selfsigned.crt
- Panel Certificate Private Key File Path : /selfsigned.key
(Save, Restart panel)

Всё, теперь вебморда открывается через https://ip-adress:port/
Браузер будет возмущаться на "недействительный сертификат", но это не мешает работе.

при желании http трафик легко перехватывается.

https с самоподписанным сертификатом тоже. если сертификат самоподписанный, то вы не проверите, сгенерен ли он вами или каким-то жуликом, который устроил вам MitM. браузер ещё раз ругнется, да, но наврядли вы будете в этом случае сравнивать сертификаты побайтово

но во-первых его перевыпускать каждые три месяца

А в чем проблема? Засунуть команду в крон и все дела. Certbot в некоторых дистрах даже сам умеет туда автоматически прописываться. И добавить post-renew hook, чтобы зависящие сервисы автоматически перезапускались после выпуска нового сертификата.

если сертификат самоподписанный, то вы не проверите, сгенерен ли он вами или каким-то жуликом, который устроил вам MitM

Первый раз создавал сертификаты, про MitM не подумал, благодарю;)

Можете этот сертификат добавить в доверенные у себя на клиентском компьютере. Тогда MitM исключается, если сам сертификат как-то не утечет.

Огромное спасибо! По инструкции все завелось. Единственная (пока) проблема: не работает видео в ВК (mycdn.me отдает 400), куда копать - совсем не понятно :(

Интер сно было бы увидеть, с каким именно сообщением прилетает 400 код.

А маршрутизацию на сервер или клиенте не настраивали случайно? Если да, то как вариант, то веб-морды и до CDN-сервера получились разные маршруты, соответственно не совпадают IP клиента и это ломает что-то в механизме сессий.

Что можно попробовать: если есть маршрутизация, то временно отключить; если включен IPv6 в клиенте, то временно выключить, и наоборот; если используете TUN-режим, то попробовать временно без него с простым прокси, и наоборот.

Маршрутизацию и TUN режим не включал (если это где-то надо принудительно сделать)

Интересно было бы увидеть, с каким именно сообщением прилетает 400 код.

Hidden text
curl -lv 'https://vkvd203.mycdn.me/?srcIp=35.234.66.59&pr=40&expires=1696645092640&srcAg=CHROME_MAC&fromCache=1&ms=45.136.21.202&type=1&sig=jQ-QvPctxmk&ct=6&urls=185.226.52.200&clientType=13&appId=512000384397&id=5227185703644&offset_p=0' \
  -H 'Accept: */*' \
  -H 'Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,ka;q=0.6' \
  -H 'Cache-Control: no-cache' \
  -H 'Connection: keep-alive' \
  -H 'Origin: https://vk.com' \
  -H 'Pragma: no-cache' \
  -H 'Referer: https://vk.com/' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Site: cross-site' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' \
  -H 'sec-ch-ua: "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "macOS"' \
  --compressed
*   Trying 45.136.21.202:443...
* Connected to vkvd203.mycdn.me (45.136.21.202) port 443 (#0)
* ALPN: offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
* (304) (IN), TLS handshake, Server hello (2):
* (304) (IN), TLS handshake, Unknown (8):
* (304) (IN), TLS handshake, Certificate (11):
* (304) (IN), TLS handshake, CERT verify (15):
* (304) (IN), TLS handshake, Finished (20):
* (304) (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / AEAD-AES256-GCM-SHA384
* ALPN: server accepted http/1.1
* Server certificate:
*  subject: C=RU; ST=Moscow; L=Moscow; O=VK LLC; CN=*.mycdn.me
*  start date: Mar 29 13:11:03 2023 GMT
*  expire date: Apr 29 13:11:02 2024 GMT
*  subjectAltName: host "vkvd203.mycdn.me" matched cert's "*.mycdn.me"
*  issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign ECC OV SSL CA 2018
*  SSL certificate verify ok.
* using HTTP/1.1
> GET /?srcIp=35.234.66.59&pr=40&expires=1696645092640&srcAg=CHROME_MAC&fromCache=1&ms=45.136.21.202&type=1&sig=jQ-QvPctxmk&ct=6&urls=185.226.52.200&clientType=13&appId=512000384397&id=5227185703644&offset_p=0 HTTP/1.1
> Host: vkvd203.mycdn.me
> Accept-Encoding: deflate, gzip
> Accept: */*
> Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,ka;q=0.6
> Cache-Control: no-cache
> Connection: keep-alive
> Origin: https://vk.com
> Pragma: no-cache
> Referer: https://vk.com/
> Sec-Fetch-Dest: empty
> Sec-Fetch-Mode: cors
> Sec-Fetch-Site: cross-site
> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36
> sec-ch-ua: "Chromium";v="118", "Google Chrome";v="118", "Not=A?Brand";v="99"
> sec-ch-ua-mobile: ?0
> sec-ch-ua-platform: "macOS"
>
< HTTP/1.1 400 Bad Request
< Content-Length: 1
< Connection: close
< X-Delivery-Type: http1
< X-Reused: 0
< Access-Control-Expose-Headers: X-Delivery-Type, X-Reused
<
* Closing connection 0
8

Интересно, что без VPN генерируется немного другой URL для видео. Попробую поменять ip адрес сервера.

Update: смена ip адреса не помогла

Попробуйте в Tun-режиме, интересно, будет ли разница

Спасибо, всё получилось. Не поднял пары вещей.

  1. Когда роняешь впн нет инета пока не снимешь галку "режим TUN" на windows 11. Это ок?

  2. Есть ли где-то дока почитать как использовать подписку? Очень интересно посмотреть её в деле. Не до конца понял её предназначения.

  1. Да, нормально. Я так понимаю, в Nekobox заворачивала на прокси и сам прокси-клиент - два независимых компонента, поэтому получается так несинхронно.

  2. Про подписки я немного разбирал вот тут: https://habr.com/ru/articles/728696/

Кстати nekobox не смог отсканировать qr из nekoray, но vray2ng смог. Тогда я эскпортировал в буфер обмена из vray2ng и импортировал из буфера в nekobox ...

Весь день пытаюсь разобраться - возможно ли как-то роутить ТОЛЬКО приватный трафик для локальных ресурсов в определенной подсети при этом весь внешний трафик игнорировать и не пропускать через сервер? Типа как корпоративный впн. В данный момент удалось настроить только редирект всего трафика через впн-сервер и всё вроде работает, но трафик жалко)

Да, это фича называется Routing.
Можно отправлять трафик по разным маршрутам (на один прокси, на другой, или напрямую) в зависимости от доменов или IP-адресов (по GeoIP или маске, это видимо то что вам надо).
Оно есть во многих клиентах, посмотрите комментарии к моим статьям, там были примеры настроек роутинга для Nekobox и v2rayNG, плюс описание возможностей и правил есть в документации самого XRay.

То есть я правильно понимаю, что помимо Routing в моем случае можно ничего более не настраивать(inbounds/outbounds/etc)? Если речь идет про x-ui, то это можно задать через Panel Setting > Xray Configurations > Advanced (или Complete) Template?

Не, не так. В любом случае надо настроить inbound в 3X-UI и outbound в клиенте, чтобы клиент мог подключиться к серверу.

А уже потом на клиенте настроивать routing - это именно клиент будет решать, какой трафик передавать на прокси, а какой слать прямо.

На сервере же можно только запретить прохождение трафика на какие-то адреса (он просто будет отправлять его в block).

Ага, то есть в "outboundTag": "blocked" , уже понятней! Спасибо!

Кстати, пользуясь случаем упомяну неплохой бесплатный клиент для MacOS который дает редактировать JSON для конфига - Streisand. В треде о нем вроде не упоминали.

В NekoBox 3.18 на Macos режиме sing-box не активируется Tun Mode, чтобы завернуть весь трафик на PC и использовать VLESS Reality.
У кого-то есть подобная проблема или это только у меня?

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

Публикации

Читают сейчас

Истории

Идём на «Импульс Т1» по дороге из жёлтого кирпича
Как стать супергероем
Рейтинг IT-брендов работодателей 2023
Активность найма в 3 квартале 2023
Топ-7 годных статей из блогов компаний
Сколько тратят в IT: сеньор бэкендер
Перевернуть календарь и добавить событие

Работа