Статья опубликована под лицензией 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 и выполнив команду Все готово, начинаем. Идем на https://github.com/yichya/luci-app-xray/releases и скачиваем последний релиз Luci-app-xray, а именно два файла: Если качать wget'ом с Github'а, то нередко файлы сохраняются с каким-то неприличным именем, поэтому я использовал опцию -O чтобы явно указать, под каким именем нужно их сохранять. Один файл содержит непосредственно скрипты и интерфейс Luci-app-xray, а второй не содержит почти ничего, кроме указанной зависимости от пакета xray-core. Устанавливаем сначала shared-файл, потом устанавливаем второй файл. Иногда opkg может ругнуться на нехватку каких-либо еще зависимостей (то ли авторы забыли добавить их в список, то ли это зависит от дефолтной сборки прошивки конкретного роутера), доустанавливаем их вручную. В моем случае это был kmod-nft-tproxy: Удаляем скачанные файлы, чтобы они не занимали драгоценное место на флешке, оно нам еще пригодится: Перезапускаем роутер, и в веб-интерфейсе видим, что у нас появилась новая вкладка с настройками и состоянием 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 в нужное место: Такая связка займет 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: Вариант два, экономный. Для тех, кто не может себе позволить занять десяток мегабайт флеша, тоже не все потеряно. Идем на 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 и отключить доп.логи чтобы экономить ресурсы. На этом всё. Удачи, и да прибудет с вами сила. Attention: Пользователь "MiraclePtr" в Telegram — мошенник, не имеющий никакого отношения к автору статьи. Ломаю, не строю