Обновить

Установка и настройка XRay на OpenWRT (для Shadowsocks, XTLS-Reality и всего-всего-всего)

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

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

По многочисленным просьбам, настало время статьи про настройку XRay на OpenWRT.
Про XRay я рассказывал в статьях Современные технологии обхода блокировок: V2Ray, XRay, XTLS, Hysteria, Cloak и все-все-все, Bleeding-edge обход блокировок с полной маскировкой: настраиваем сервер и клиент XRay с XTLS-Reality быстро и просто и других из той же серии.

Про настройку этого дела под OpenWRT уже недавно рассказывал @Andrevich в своей отличной статье Обход блокировок на OpenWRT с помощью Passwall (v2ray, xray, trojan) и tun2socks. Там описывалась настройка на базе Passwall, приведены подробные инструкции по сборке прошивки (если не хватит памяти в ФС роутера) и настройки до мельчайших деталей. Я рекомендую ознакомиться сначала с той статьей, и вообще попробовать настраивать именно по ней, потому что там описывается стандартное и надежное решение.

Также есть инструкция по настройке для роутеров Keenetic: Xray на Keenetic / Xkeen

Ну а мы здесь сегодня поговорим об альтернативном варианте для OpenWRT - просто, чтобы было.

Мы будем устанавливать на роутер классический XRay и набор скриптов с вебмордой для них под названием Luci-app-xray.

Нейрокартинка для отвлечения внимания
Нейрокартинка для отвлечения внимания

Поехали.

Дано: у вас есть роутер, и на нем есть свободное место в файловой системе. У меня установка (без учета geoip.dat и geosites.dat) заняла 23 мегабайта.

Если у вас места меньше - можете воспользоваться советами по пересборке прошивки из уже упомянутой статьи.

Проверить свободное место можно в интерфейсе OpenWRT на вкладке Software:

Там же можно нажать "Update lists" чтобы обновить списки пакетов для пакетного менеджера - операция должна завершиться без ошибок. Либо, если вам больше по душе консоль (а дальнейшие операции мы будем делать именно в консоли), подключиться к роутеру по ssh с именем пользователя root и выполнив команду

opkg update

Все готово, начинаем.

Идем на https://github.com/yichya/luci-app-xray/releases и скачиваем последний релиз Luci-app-xray, а именно два файла:

wget https://github.com/yichya/luci-app-xray/releases/download/v2.1.2/luci-app-xray-fw4_2.1.2-1_all.ipk -O luci-app-xray-fw4_2.1.2-1_all.ipk
wget https://github.com/yichya/luci-app-xray/releases/download/v2.1.2/luci-app-xray-shared_2.1.2-1_all.ipk -O luci-app-xray-shared_2.1.2-1_all.ipk

Если качать wget'ом с Github'а, то нередко файлы сохраняются с каким-то неприличным именем, поэтому я использовал опцию -O чтобы явно указать, под каким именем нужно их сохранять.

Один файл содержит непосредственно скрипты и интерфейс Luci-app-xray, а второй не содержит почти ничего, кроме указанной зависимости от пакета xray-core.

Устанавливаем сначала shared-файл, потом устанавливаем второй файл.

opkg install ./luci-app-xray-shared_2.1.2-1_all.ipk
opkg install ./luci-app-xray-fw4_2.1.2-1_all.ipk

Иногда opkg может ругнуться на нехватку каких-либо еще зависимостей (то ли авторы забыли добавить их в список, то ли это зависит от дефолтной сборки прошивки конкретного роутера), доустанавливаем их вручную. В моем случае это был kmod-nft-tproxy:

opkg install kmod-nft-tproxy

Удаляем скачанные файлы, чтобы они не занимали драгоценное место на флешке, оно нам еще пригодится:

rm ./luci-app-xray-shared_2.1.2-1_all.ipk
rm ./luci-app-xray-fw4_2.1.2-1_all.ipk

Перезапускаем роутер, и в веб-интерфейсе видим, что у нас появилась новая вкладка с настройками и состоянием XRay:

Xray is running - уже хорошо, но сразу же рядом мы видем предупреждение, что отсутствуют файлы geoip.dat и geosite.dat (список IP-адресов по странам и список адресов сайтов по группам для настроек правил маршрутизации), и без них XRay может работать некорректно.

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

Итак, где же взять эти недостающие файлы?

Вариант раз, "всё как у людей".

Идем на https://github.com/XTLS/Xray-core/releases, скачиваем свежий XRay для десктопа (например версию linux-64, на самом деле не важно), достаем из архива geoip.dat и geosite.dat, и закидываем на роутер по SCP в нужное место:

scp ./geoip.dat root@192.168.1.1:/usr/share/xray
scp ./geosite.dat root@192.168.1.1:/usr/share/xray

Такая связка займет 10+1.5 мегабайт.
Upd: в комментах посоветовали просто устанвить v2ray-geoip + v2ray-geosite через opkg.

Альтернатива, примерно с тем же содержимым:

GeoIP устанавливаем из репозитория OpenWRT, получая сразу самую новую версию, а Geosite - из репозитория https://github.com/v2fly/domain-list-community. Скачанный dlc.dat-файл нужно переименовать в geosite.dat и положить в роутер в /usr/share/geosite.dat:

opkg install xray-geodata
wget https://github.com/v2fly/domain-list-community/releases/download/20230825070717/dlc.dat -O /usr/share/geosite.dat

Вариант два, экономный.

Для тех, кто не может себе позволить занять десяток мегабайт флеша, тоже не все потеряно. Идем на https://github.com/v2fly/geoip и качаем оттуда private.dat, который занимает всего 248 байт, и по факту не содержит никаких GeoIP-записей кроме "локальные адреса" (естественно, GeoIP-маршрутизации у вас тогда уже не будет). Кладем в /usr/share/ под именем geoip.dat

С Geosite сложнее, но в уже упомянутой репе https://github.com/v2fly/domain-list-community есть инструкция по сборке geosite.dat самостоятельно - можно удалить из папки "data" все содержимое кроме чего-то одного, например, "category-gov-ru" или "category-gov-ru" c "category-ads", и собрать себе крохотный geosite.dat-файл. Если кому-то не лень, сделайте плиз и загрузите куда-нибудь, люди вам спасибо скажут.

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

Скроллим вниз, и нажимаем Add в разделе "Xray Servers":

По сравнению с десктопными клиентами, настройка производится немножко "наоборот": сначала вы задаете имя сервера, адрес сервера, порт и данные пользователя, например ключ для Shadowsocks, UUID для VMess/VLESS, и т.д.:

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

Для VLESS с включенным XTLS-Reality так:

Если вы не используете Reality, то лишние поля скроются.

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

Заполняем все поля (пример настроек "в общем и целом" я уже описывал в предыдущих статьях), нажимаем Save.

После этого, на главной странице настроек XRay, выбираем в поле TCP Server ваш новый сервер, в поле UDP Server его же - и сохраняем настройки. Готово.

В теории, на этом всё. Как только вы указали TCP Server и UDP Server и сохранили настройки, весь трафик от устройств вашей сети должен будет пойти в интернет через выбранный прокси-сервер.

Возможно с этого момента всё заработает сразу, ну или нужно будет немножко еще покопаться по параметрам.

На третьей вкладке настраиваются DNS-сервера и настройки маршрутов:

По умолчанию там в первом поле, отвечающем за DNS для запросов, которые не будут идти на прокси, а будут пропускаться сразу в интернет напрямую, прописан китайский сервер 114.114.114.114 - советую заменить его на какой-нибудь российский близкий к вам DNS (например, провайдерский), или хотя бы на обычные 8.8.8.8 или 1.1.1.1. Secure DNS и Default DNS - это уже сервера, используемые для походов через прокси, с ними по умолчанию все нормально.

Обратите внимание на поля "Bypassed domain rules" и "Forwarded domain rules". По умолчанию там прописаны условия для Китая (домен ".cn") - удалите их. Дальше, может быть я криворукий и что-то не учел или куда-то не туда ткнул, но у меня сложилось впечатление, что если оставть первое поле пустым или указать там что-то отсутствующее в ваших geoip/geosite базах, то XRay может заглючить и начать пускать весь трафик напрямую вместо прокси. Попробуйте, и если у вас это действительно так, заполните его как-нибудь правдоподобно - например, geoip:private или domain:gosuslugi.ru.

Возможно для forwarded актуально то же самое, у меня в пустым полем работало нормально.

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

И наконец, если что-то не работает как надо и не понятно почему, на вкладке XRay можно увеличить уровень логгирования, и включить дополнительные логи. Смотреть логи можно в интерфейсе OpenWrt в "System Log", либо же командой logread. Когда все работает, лучше поставить уровень warning и отключить доп.логи чтобы экономить ресурсы.

На этом всё.

Удачи, и да прибудет с вами сила.

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

Теги:
Хабы:
Всего голосов 22: ↑22 и ↓0 +22
Комментарии 42
+42
Закрыть

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

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

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

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

Способ без костылей: На вкладке Transparent Proxy Rules в GeoIP Direct Code List ствим ru, в Routing Domain Strategy выбираем IPOnDemand.

Edit: На странице DNS settings можно также выставить в Bypassed Domain Rules значение domain:ru тогда напрямую пойдут все домены .ru. Здесь рабоают только фильтры по доменному имени. Фильтры по IP нужно ставить в Transparent Proxy Rules.

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

А сервер тоже свой надо иметь?

Да, как его настроить есть ссылки в начале.

Интересно как "перевернуть" установку, чтобы OpenWRT выступал как сервер, чтобы выставить его в интернет для подключений извне.

Ясно. Вот именно поэтому до сих пор использую Tor

до сих пор использую Tor

Чистый Tor РКН уже давно умеет банить, бриджи пока держутся. Но если Tor устраивает (недостатки у него довольно серьезные), то пока пользоваться можно, почему бы и нет.

Интересно как "перевернуть" установку, чтобы OpenWRT выступал как сервер, чтобы выставить его в интернет для подключений извне.

Вариант раз - установить голый xray-core из реп, настроить ему init-скрипт, чтобы запускался автоматически, а дальше настраивать сервер конфигом точно так же, как и на VPS. Ну, еще может порт на фаерволе открыть придется.

Вариант два - Passwal, описанный в другой статье, имеет режим server-side, судя по всему именно для этого. Я не тестировал.

Отличная статья, спасибо!

Для разнообразия пойдет. А так в passwal есть от shadowsocks до reality.

Passwall больше не установить. Пакет sing-box из всех репо openwrt исчез

Неужели дождались?

Очень круто. Спасибо.

Какой рутер посоветуете для этого дела? Redmi AX6S (RB03)?

Сам же и порекомендую Redmi AX6000 (не путать с Xiaomi AX6000)

Большое спасибо за статьи! Раскрыли тему очень доходчиво и интересно!

Вопрос про Reality и маскировку

Если проверять маскировку через curl, то должен вернуться код http 200 ok, верно? Пробовал с разными сайтами, но удачно только с Майками

И вот тоже вопрос, если на сайте что-то поменяется, маскировка спадет - как об этом узнать? Да и вообще нужно ли за этим следить? (Если маскировки нет, в чем отличие от SS2022?)

Здравствуйте! К сожалению не могу оставлять комментарии под старыми постами, по этому пришел сюда. Вопрос про Reality и маскировку - настроил все по вашей статье от 25 апреля. И сам впн (пересылка трафика работает), но вот curl выдает что-то не то -

"schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - Функция отзыва не смогла произвести проверку отзыва для сертификата.

Closing connection 0

schannel: shutting down SSL/TLS connection with www.microsoft.com port 443 curl: (35) schannel: next InitializeSecurityContext failed: Unknown error (0x80092012) - Функция отзыва не смогла произвести проверку отзыва для сертификата."

Хотелось бы понять, что я не так делаю.

Отвечу сам себе. Решение проблемы нашел. Оказалось, что это на стороне клиента касперский рубил проверку. При его отключении на время - все заработало как надо (HTTP 200)

@MiraclePtr Спасибо за статью. Получилось настроить. Всё кроме пропуска мимо VPN трафика на RU ресурсы.
Указывал в Bypassed domain rules geoip:ru - не помогает, весь трафик идёт через VPN.
Вы не нашли способ как запустить весь ru трафик напрямую?

Удалось настроить маршрутизацию следующим костылем:

  • Нашел текущие настройки /var/etc/xray/config.json

  • Скопировал секцию "routing", в ней заменил "domainStrategy": "AsIs" на "IPOnDemand"

  • Нашел то место, куда конфигуратор вставил "geoip:ru", переименовал свойство "domain" на "ip"

  • Исправленный объект "routing" вставил в последнюю вкладку Custom Options: { "routing": <исправленный вариант> }

  • Save & Apply

Способ без костылей: На вкладке Transparent Proxy Rules в GeoIP Direct Code List ствим ru, в Routing Domain Strategy выбираем IPOnDemand.

Edit: На странице DNS settings можно также выставить в Bypassed Domain Rules значение domain:ru тогда напрямую пойдут все домены .ru. Здесь рабоают только фильтры по доменному имени. Фильтры по IP нужно ставить в Transparent Proxy Rules.

Спасибо вам за советы - работает!

достаем из архива geoip.dat и geosite.dat, и закидываем на роутер по SCP в нужное место

Только не в /usr/share/, а в /usr/share/xray/

Завелось на китайском GL-MT300N-V2 (16Мб флешь) + lte L860-GL + самосборная openwrt. В моем случае пришлось указать bypassed domain rules, иначе трафик шел на прямую.
Вопрос дилетантский возможно. На маршрутизаторе поднята выше описанная схема (shadowsocks). Если я на рабочем компьютере который соединен с этим роутером соединяюсь предположим с рабочим openVpn правильно понимаю что openVpn трафик от компьютера получается завернут shadowsocks?

правильно понимаю что openVpn трафик от компьютера получается завернут shadowsocks?

Да, должно сработать так

Поставил VLESS с включенным XTLS-Reality на два клиента, но как понимаю опции как общение между клиентами по внутренней сети как в openvpn нету? Есть ли альтернативы поверх запускать openvpn для создания сети между клиентами?

опции как общение между клиентами по внутренней сети как в openvpn нету

Увы, нету. Это не VPN, а прокси, оно такое не умеет.

Чем искать геофайлы по разным гитхабам (а потом обновлять), проще поставить v2ray-geoip + v2ray-geosite через opkg.

Они там слишком жирные, у многих роутеров просто для них просто не хватит памяти.

Надо стратегически выбирать роутер, с запасом :)

Спасибо, удалось поднять на MikroTik hAP ac2 с OpenWRT 22.03.5 и смонтированной usb флешкой! Были проблемы с доступом к gmail, опытным путем смены настроек вроде удалось победить, но вот с iMessage не понятно: на iPhone работает, на Mac нет, в одной сети, DNS в настройках вай фай указан как адрес роутера. Не знаете с чем может быть проблема?

Нет, честно говоря, не знаю в чем может быть дело с iMessage.

Настроил на windows машине nekobox, расшарил nekobox-tun для доступа другими машинами. При перезагрузке доступ с других машин пропадает, лечится снятием/установкой галки на совместный в свойствах tun адаптера и новым прописыванием статического адреса для второго адаптера.

Еще заметил, что когда работает совместный доступ, если nekobox закрыть, совместный доступ на обрубается, как казалось должно быть с исчезновением расширенного сетевого адаптера, а продолжает работать, но уже без всякого X-ray сервера, напрямую через Ethernet адаптер.

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

Спасибо за статьи! Очень полезно, настроил себе XTLS-Reality по вашему гайду. Под той статьей не могу оставить комментарий, спрошу здесь. В настройках клиента Nekobox есть галочка FakeDns, опытным путем установил, что с установленной галкой обход зоны ru в правилах маршрутизации не работает, все идет через VPN (режим TUN). Когда выключаю эту галку, работает как надо: через VPN идет все, кроме зоны ru. Все работает и на компе, и в клиенте на Андроид. Но. Скинул конфигурацию родителям. У них такая штука: с включенной галкой FakeDNS не работает совсем (не пропускает вообще никаких подключений, интернета тупо нет вообще), с выключенной - идет соединение, при этом обход ru (geoip ru) в правилах маршрутизации - "запирает" российские сайты, то есть работает как блокировка, остальные сайты открываются через VPN. Подскажите, в чем может быть проблема (я так понимаю, какие-то настройки на самом компе, так как сервер один и тот же и клиенты у нас настроены одинаково), где копать? Ошибка, которую пишет Nekoray, выглядит так:

Благодарю заранее!

Поправка, опечатался: с ВЫключенной галкой FakeDNS не работает вообще, с включенной - работает, но маршрутизации на зону ru нет, вообще на них не пускает (хотя настроено в обход прокси).

А покажите, что у вас в окне Routing (Настройки маршрутизации)

Вот:

И вот:

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

Как вариант попробовать - поменять remote DNS на просто 8.8.8.8 или 1.1.1.1 (без https). Если не поможет, то ещё поиграться с разными "стратегиями".

FakeDNS использовать не советую - у него слишком много побочных эффектов.

Именно так - система древняя семерка без обновлений... И так как комп этот у моих родных, а я географически далеко, то я не могу там ничего переустановить и остается только тихо ругаться на расстоянии на то, что не работает оно как надо... Попробую разные варианты еще, спасибо. А может, это вообще на стороне сервера. Я панель 3x-ui настроил по следующему вашему руководству, так перед этим два дня возился, не мог понять - хоть лопни, не ставился докер... Весь гугл перерыл, "ошибка демона" и все тут. Потом попробовал на другой сервер у другого хостера поставить, а там все взлетело на ура. В общем, оказалось, пара галок на сервере типа "режим TUN/TAP" и PPP были отключены, включил и докер заработал. Нетипичная какая-то фигня. За статьи огромное спасибо, продолжаю эксперименты.

3 ноября автор luci-app-xray удалил свой репо из github.

На что будем переходить? Passwall, sing-box или что-то ещё?

Код вернулся обратно в репу, releases еще нет.

проверить бы его на соответствие на всякий пожарный ...

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

Публикации

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

Истории

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

Работа