xray-manager
xray-manager — это легковесный Shell-скрипт (Ash) для OpenWrt, предназначенный для автоматического управления списками маршрутизации (IP-адреса и домены) через nftables и tproxy.
Скрипт позволяет гибко распределять трафик: направлять нужные ресурсы через Xray, создавать исключения и автоматически поддерживать списки в актуальном состоянии.
Основные функции
- Мульти-ссылочные секции: Возможность указать несколько URL в одной категории — скрипт сам скачает их, объединит и удалит дубликаты.
- Поддержка
auto-merge: Автоматическое решение конфликтов пересекающихся подсетей на уровне ядра (nftables), что предотвращает ошибки при загрузке больших списков. - Умное обновление DNS: Сервис
dnsmasqперезапускается только при реальном изменении списков доменов, минимизируя разрывы соединений. - Проверка изменений (Hashing): Скрипт отслеживает изменения в конфигурации URL и уведомляет о необходимости запуска обновления при использовании
reload. - Гибкая маршрутизация: Поддержка фильтрации по источнику (
src) и назначению (dst). - Автоматическая очистка: Удаление устаревших кэш-файлов и правил при изменении структуры конфигурации.
- Персональные цепочки: Возможность завернуть абсолютно весь трафик конкретного устройства в прокси с созданием изолированной цепочки правил.
- Изолированные исключения: Поддержка параметра parent, который позволяет назначать списки исключений только для конкретных групп или устройств, не влияя на общую маршрутизацию.
- Защита от петель: Автоматическое исключение IP-адресов самих прокси-серверов из обработки, что гарантирует стабильность соединения.
Установка
1. Зависимостиa
Убедитесь, что установлены необходимые пакеты:
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 https://gitea.oyacoi.ru/pyrschtjag/xray-manager.git /opt/.xray-manager
3. Интеграция скрипта
Для интеграции скрипта в систему выполните следующие команды:
# Конфигурационный файл
cp /opt/.xray-manager/config/xray-manager.example /etc/config/xray-manager
# Инит-скрипт для управления сервисом
ln -s /opt/.xray-manager/init.d/xray-manager /etc/init.d/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 |
Файл-индекс для автоматической очистки «осиротевших» (удаленных) списков. |
| proxy_ip | list |
Список IP прокси-серверов. Они будут автоматически добавлены в исключения, чтобы роутер не пытался проксировать соединение к самому прокси. |
Пример:
config xray-manager 'main'
option table_name 'xray'
option tproxy_port '61219'
option tproxy_mark '10'
option timeout '1h'
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'
Списки маршрутов (List)
Каждая секция config xray-list определяет, какой именно трафик будет перехвачен или пропущен.
| Параметр | Значение | Описание |
|---|---|---|
| name | string |
Уникальное имя. Используется для названия сета в nftables (например, @v2ray_udom) и имени файла в /tmp. |
| direction | dst, src, out, force_src |
Направление фильтрации: dst: проверка IP назначения. src: проверка IP отправителя. out: трафик самого роутера (Self-traffic). force_src: принудительный прокси для устройства (весь трафик). |
| exclude | bool |
Тип правила: 0: Направлять трафик в прокси. 1: Пропускать трафик напрямую (исключение). |
| parent | string |
Имя родительской секции (force_src). Если указан, то данное исключение (exclude 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. |
Прокси для самого роутера
В этом примере завернём запросы до DNS-серверов Cloudflare в прокси:
config xray-list
option name 'router_self'
option direction 'out' # Трафик роутера
option exclude '0'
list ip '1.1.1.1'
list ip '1.0.0.1'
Проксировать весь трафик от клиента с поддержкой исключений
Завернём в прокси весь трафик от клиента, исключив 2ip.ru:
# Проксировать весь трафик от клиента 10.2.0.4
config xray-list
option name 'my_pc'
option direction 'force_src'
list ip '10.2.0.4'
# Исключение для my_pc
config xray-list
option name 'my_pc_exc'
option direction 'dst'
option exclude '1'
option parent 'my_pc' # Привязка к родителю
list domain '2ip.ru'
Практический пример по выборочной маршрутизации
Задача: Направить трафик конкретного устройства (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.
Если домен не в списке — пакет уходит через провайдера.