2026-02-21 23:04:38 +04:00
2026-02-21 23:04:38 +04:00
2026-02-21 23:04:38 +04:00
2026-02-21 23:04:38 +04:00

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'

Как это работает (Логика связки):

  1. Пакет приходит на роутер с IP 10.1.0.2.
  2. Скрипт видит совпадение в секции src и ставит пакету внутреннюю метку (mark).
  3. Далее роутер проверяет адрес назначения этого помеченного пакета.
  4. Если домен соответствует списку spotify, пакет перенаправляется в TProxy.
    Если домен не в списке — пакет уходит через провайдера.
S
Description
No description provided
Readme
198 KiB
Languages
Shell 100%