Reviewed-on: https://gitea.oyacoi.ru/pyrschtjag/xray-manager/pulls/2
xray-manager
xray-manager — это легковесный Shell-скрипт (Ash) для OpenWrt, предназначенный для автоматического управления списками маршрутизации (IP-адреса и домены) через nftables и tproxy.
Скрипт позволяет гибко распределять трафик: направлять нужные ресурсы через Xray, создавать исключения и автоматически поддерживать списки в актуальном состоянии.
Основные функции
- Мульти-ссылочные секции: Возможность указать несколько URL в одной категории — скрипт сам скачает их, объединит и удалит дубликаты.
- Поддержка
auto-merge: Автоматическое решение конфликтов пересекающихся подсетей на уровне ядра (nftables), что предотвращает ошибки при загрузке больших списков. - Умное обновление DNS: Сервис
dnsmasqперезапускается только при реальном изменении списков доменов, минимизируя разрывы соединений. - Проверка изменений (Hashing): Скрипт отслеживает изменения в конфигурации URL и уведомляет о необходимости запуска обновления при использовании
reload. - Гибкая маршрутизация: Поддержка фильтрации по источнику (
src) и назначению (dst), а также корректная обработка локального трафика роутера (route_local). - Автоматическая очистка: Удаление устаревших кэш-файлов и правил при изменении структуры конфигурации.
Установка
1. Зависимости
Убедитесь, что установлены необходимые пакеты:
opkg update && opkg install kmod-nf-tproxy kmod-nft-tproxy git git-http curl
Для полноценной работы со списками доменов необходима полная версия dnsmasq:
opkg remove dnsmasq
echo "nameserver 1.1.1.1" > /etc/resolv.conf
opkg install dnsmasq-full
2. Клонирование репозитория
Рекомендуется устанавливать в директорию /opt/.xray-manager:
git clone gitea@gitea.lan:pyrschtjag/xray-manager.git /opt/.xray-manager
или
git clone https://gitea.oyacoi.ru/pyrschtjag/xray-manager.git /opt/.xray-manager
3. Создание симлинков
Для интеграции скрипта в систему выполните следующие команды:
# Конфигурационный файл
ln -s /opt/.xray-manager/config/xray-manager /etc/config/xray-manager
# Инит-скрипт для управления сервисом
ln -s /opt/.xray-manager/init.d/xray-manager /etc/init.d/xray-manager
# Команда в PATH для быстрого доступа из любой папки
ln -s /opt/.xray-manager/xray-manager.sh /usr/sbin/xray-manager
Команды управления
Скрипт интегрирован в систему и поддерживает стандартные методы управления OpenWrt. Основное различие между командами заключается в работе с сетью и кэшем.
-
/etc/init.d/xray-manager start — Холодный запуск
Полная инициализация системы: создание таблиц nftables, цепочек и правил. При первом запуске скрипт автоматически скачает все списки из URL. Если списки уже есть в кэше — применит их. -
/etc/init.d/xray-manager reload — Локальное обновление
Применяет изменения, внесенные в конфигурационный файл /etc/config/xray-manager (например, изменение портов или добавление новых секций), но не обращается к сети. Если вы изменили URL в конфиге, скрипт выдаст предупреждение о необходимости запуска update. -
/etc/init.d/xray-manager update — Умная синхронизация
Скрипт опрашивает все внешние URL. Благодаря системе хеширования (Hashing), загрузка и пересборка правил произойдет только для тех списков, которые реально изменились на удаленном сервере. Это экономит трафик и минимизирует нагрузку на процессор роутера. -
/etc/init.d/xray-manager stop — Полная очистка
Удаляет все таблицы и цепочки из nftables, очищает временные файлы и возвращает маршрутизацию в исходное состояние. Полезно для диагностики или временного отключения проксирования. -
/etc/init.d/xray-manager restart — Перезапуск
Последовательное выполнение команд stop и start.
Конфигурация
Глобальные параметры (section main)
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
| table_name | string |
xray |
Имя основной таблицы в nftables. |
| tproxy_port | int |
61219 |
Порт, на котором Xray/Sing-box слушает TProxy входящие соединения. |
| tproxy_mark | string |
10 |
Метка (fwmark), используемая для маршрутизации пакетов в таблицу 110. |
| client_mark | string |
103 |
Внутренняя метка ct mark для идентификации трафика, подлежащего проксированию. |
| timeout | string |
1h |
Время жизни динамических записей в сетах (для доменов). |
| ipnet_dir | string |
/tmp/ipnet |
Директория для хранения списков IP-адресов в формате .lst. |
| dnsmasq_dir | string |
/tmp/dnsmasq.d |
Директория для .conf файлов dnsmasq (автоматически добавляется в confdir по пути /etc/config/dhcp). |
| cache_dir | string |
/tmp/.xray-manager/cache |
Место хранения хэш-файлов для отслеживания изменений в списках. |
| active_list | string |
/tmp/.xray-manager/active_files |
Файл-индекс для автоматической очистки «осиротевших» (удаленных) списков. |
| route_local | bool |
0 |
1 — перехватывать и проксировать трафик самого роутера; 0 — только трафик клиентов. |
Пример:
config xray-manager 'main'
option table_name 'xray'
option tproxy_port '61219'
option tproxy_mark '10'
option timeout '1h'
option route_local '1'
option ipnet_dir '/tmp/ipnet'
option dnsmasq_dir '/tmp/dnsmasq.d'
option cache_dir '/tmp/.xray-manager/cache'
option active_list '/tmp/.xray-manager/active_files'
Исключения (Whitelist)
Секция lnet для защиты локальных адресов. Требуется для подстраховки, так как некоторые ресурсы могут подменять реальный IP на localhost при резолвинге:
config xray-list 'lnet'
option name 'whitelist'
option direction 'dst'
option exclude '1'
list ip '127.0.0.0/8'
list ip '10.0.0.0/8'
list ip '172.16.0.0/12'
list ip '192.168.0.0/16'
list ip '169.254.0.0/16'
list ip '100.64.0.0/10'
list ip '224.0.0.0/4'
list ip '255.255.255.255/32'
list ip '0.0.0.0/8'
Списки маршрутов (List)
Каждая секция config xray-list определяет, какой именно трафик будет перехвачен или пропущен.
| Параметр | Значение | Описание |
|---|---|---|
| name | string |
Уникальное имя. Используется для названия сета в nftables (например, @v2ray_udom) и имени файла в /tmp. |
| direction | dst или src |
Направление фильтрации: dst: проверка IP назначения (куда идём). src: проверка IP отправителя (кто идёт). |
| exclude | 0 или 1 |
Тип правила: 0: Направлять трафик в прокси. 1: Пропускать трафик напрямую (исключение). |
Внутри каждой секции можно комбинировать разные типы данных:
| Тип записи | Формат | Описание |
|---|---|---|
| list ip | 1.1.1.1 или CIDR |
Статический IP или подсеть. Заносится напрямую в nftables. |
| list domain | example.com |
Домен. Создает правило dnsmasq для динамического добавления IP в сет. |
| list url_ip | http(s)://... |
Ссылка на сырой текстовый файл с IP. Скрипт скачает и объединит данные. |
| list url_domain | http(s)://... |
Ссылка на сырой текстовый файл с доменами. Готовит данные для dnsmasq. |
Практический пример по выборочной маршрутизации
Задача: Направить трафик конкретного устройства (10.1.0.2) через прокси только при обращении к ресурсам Spotify, не затрагивая остальных клиентов сети.
Шаг 1: Определение источника (src)
Сначала мы указываем «доверенную» группу устройств, которым разрешен доступ к проксированию. Для этого создается секция с типом фильтрации по источнику:
config xray-list
option name 'my_pc' # Уникальное имя группы
option direction 'src' # Фильтр отправителя (Source)
option exclude '0' # Направлять в прокси
list ip '10.1.0.2' # IP адрес вашего устройства
Шаг 2: Определение назначения (dst)
Затем мы загружаем список ресурсов, которые должны перехватываться. В данном случае используем домены Spotify из внешнего репозитория:
config xray-list
option name 'spotify'
option direction 'dst' # Фильтр назначения (Destination)
option exclude '0' # Направлять в прокси
list url_domain 'https://raw.githubusercontent.com/v2ray/domain-list-community/master/data/spotify'
Как это работает (Логика связки):
- Пакет приходит на роутер с IP 10.1.0.2.
- Скрипт видит совпадение в секции src и ставит пакету внутреннюю метку (mark).
- Далее роутер проверяет адрес назначения этого помеченного пакета.
- Если домен соответствует списку spotify, пакет перенаправляется в TProxy.
Если домен не в списке — пакет уходит через провайдера.