# xray-manager
<<<<<<< HEAD
**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`.
=======
>>>>>>> 5af9a1d40c89802ad9ed557b8cf57267d28fc1ee