# 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. Зависимости Убедитесь, что установлены необходимые пакеты: ```bash opkg update && opkg install kmod-nf-tproxy kmod-nft-tproxy git git-http curl ``` Для полноценной работы со списками доменов необходима полная версия dnsmasq: ```bash opkg remove dnsmasq echo "nameserver 1.1.1.1" > /etc/resolv.conf opkg install dnsmasq-full ``` ### 2. Клонирование репозитория Рекомендуется устанавливать в папку /opt: ```bash git clone gitea@gitea.lan:pyrschtjag/xray-manager.git /opt/.xray-manager ``` или ```bash git clone https://gitea.oyacoi.ru/pyrschtjag/xray-manager.git /opt/.xray-manager ``` ### 3. Создание симлинков Для интеграции скрипта в систему выполните следующие команды: ```Bash # Конфигурационный файл 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: * **xray-manager start** — Инициализация таблиц и применение текущих списков из кэша. * **xray-manager reload** — Применение изменений из конфига без скачивания URL. Если ссылки изменились, скрипт выведет предупреждение. * **xray-manager update** — Скачивание всех внешних списков, дедупликация и обновление правил. * **xray-manager stop** — Полная очистка таблиц nftables и удаление временных файлов. * **xray-manager restart** — Остановка и повторный запуск. ## Конфигурация ### Глобальные параметры Секция config xray-manager 'main' (обязательна): ```bash config xray-manager 'main' option table_name 'xray' # Имя таблицы в nftables option tproxy_port '61219' # Порт Xray (TProxy) option tproxy_mark '10' # fwmark для трафика option timeout '1h' # Время жизни (для nftables set) option ipnet_dir '/tmp/ipnet' # Путь к спискам IP option dnsmasq_dir '/tmp/dnsmasq.d' # Путь к конфигам dnsmasq option cache_dir '/tmp/.xray-manager/cache' option active_list '/tmp/.xray-manager/active_files' option route_local '1' # Проксировать трафик самого роутера ``` ### Исключения (Whitelist) Секция lnet для защиты локальных адресов. Требуется для подстраховки, так как некоторые ресурсы могут подменять реальный IP на localhost при резолвинге: ```bash 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' ``` ### Списки маршрутов Каждая секция `config xray-list` определяет, какой именно трафик будет перехвачен или пропущен. | Параметр | Значение | Описание | | :--- | :--- | :--- | | **name** | `string` | Уникальное имя. Используется для названия сета в `nftables` (например, `@v2ray_udom`) и имени файла в `/tmp`. | | **direction** | `dst` или `src` | **Направление фильтрации**.
`dst`: проверка IP назначения (куда идем).
`src`: проверка IP отправителя (кто идет). | | **exclude** | `0` или `1` | **Тип правила**.
`0`: Направлять трафик в прокси.
`1`: Пропускать трафик напрямую (исключение). | ### Типы списков (list) Внутри каждой секции можно комбинировать разные типы данных: * **list ip**: Одиночный IP-адрес или подсеть в формате CIDR (например, `1.1.1.1` или `192.168.1.0/24`). Заносится напрямую в `nftables`. * **list domain**: Одиночный домен. Скрипт создаст файл конфигурации для `dnsmasq`, который будет перехватывать IP-адреса этого домена при резолвинге и динамически добавлять их в соответствующий сет `nftables`. * **list url_ip**: Ссылка на внешний текстовый файл со списком IP/подсетей. Скрипт скачает, очистит от комментариев и объединит данные. * **list url_domain**: Ссылка на список доменов. Аналогично `url_ip`, но данные готовятся для обработки через `dnsmasq`. #### Пример 1: Направление доменов в прокси (назначение): ```bash config xray-list option name 'v2ray' option direction 'dst' option exclude '0' list url_domain '[https://raw.githubusercontent.com/.../spotify](https://raw.githubusercontent.com/.../spotify)' list url_domain '[https://raw.githubusercontent.com/.../openai](https://raw.githubusercontent.com/.../openai)' list domain 'private.example.com' ``` #### Пример 2: Направление целой подсети локальных клиентов в прокси (источник): ```bash config xray-list option name 'local_network' option direction 'src' option exclude '0' list ip '10.1.0.0/24' ``` #### Пример 3: Исключение конкретного устройства из проксирования: ```bash config xray-list option name 'my_pc_bypass' option direction 'src' option exclude '1' list ip '10.1.0.6' ``` ## Логика работы (Flow) 1. **Цепочка Prerouting**: Весь входящий трафик от клиентов попадает в таблицу `nftables`. 2. **Исключения (Exclude 1)**: Сначала проверяются списки с `exclude '1'`. Если совпадение найдено, пакет помечается `accept` и уходит по обычному маршруту. 3. **Маркировка (Direction src)**: Если IP клиента найден в списке с `direction 'src'`, пакет помечается меткой `0x66`. 4. **Перехват (Direction dst)**: Для пакетов с меткой `0x66` проверяются списки назначений (`dst`). Если финальный IP найден в сете — пакет перенаправляется на локальный порт TProxy. 5. **DNS-фильтрация**: При запросе домена из списка `domain`/`url_domain`, `dnsmasq` сохраняет полученный IP в сет `nftables` на время, указанное в `option timeout`.