**xray-manager** — это легковесный Shell-скрипт (Ash) для OpenWrt, предназначенный для автоматического управления списками маршрутизации (IP-адреса и домены) через `nftables` и `tproxy`.
Скрипт позволяет гибко распределять трафик: направлять нужные ресурсы через Xray, создавать исключения и автоматически поддерживать списки в актуальном состоянии.
## Основные функции
* **Мульти-ссылочные секции**: Возможность указать несколько URL в одной категории — скрипт сам скачает их, объединит и удалит дубликаты.
* **Поддержка `auto-merge`**: Автоматическое решение конфликтов пересекающихся подсетей на уровне ядра (nftables), что предотвращает ошибки при загрузке больших списков.
* **Умное обновление DNS**: Сервис `dnsmasq` перезапускается только при реальном изменении списков доменов, минимизируя разрывы соединений.
* **Проверка изменений (Hashing)**: Скрипт отслеживает изменения в конфигурации URL и уведомляет о необходимости запуска обновления при использовании `reload`.
* **Гибкая маршрутизация**: Поддержка фильтрации по источнику (`src`) и назначению (`dst`), а также корректная обработка локального трафика роутера (`route_local`).
* **Автоматическая очистка**: Удаление устаревших кэш-файлов и правил при изменении структуры конфигурации.
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` | **Направление фильтрации**. <br> `dst`: проверка IP назначения (куда идем). <br> `src`: проверка IP отправителя (кто идет). |
Внутри каждой секции можно комбинировать разные типы данных:
* **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`.