161 lines
9.9 KiB
Markdown
161 lines
9.9 KiB
Markdown
# 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` | **Направление фильтрации**. <br> `dst`: проверка IP назначения (куда идем). <br> `src`: проверка IP отправителя (кто идет). |
|
|
| **exclude** | `0` или `1` | **Тип правила**. <br> `0`: Направлять трафик в прокси. <br> `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
|