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. Зависимости
Убедитесь, что установлены необходимые пакеты:
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:
git clone gitea@gitea.lan:pyrschtjag/xray-manager.git /opt/.xray-manager
или
git clone https://gitea.oyacoi.ru/pyrschtjag/xray-manager.git /opt/.xray-manager
3. Создание симлинков
Для интеграции скрипта в систему выполните следующие команды:
# Конфигурационный файл
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' (обязательна):
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 при резолвинге:
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: Направление доменов в прокси (назначение):
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: Направление целой подсети локальных клиентов в прокси (источник):
config xray-list
option name 'local_network'
option direction 'src'
option exclude '0'
list ip '10.1.0.0/24'
Пример 3: Исключение конкретного устройства из проксирования:
config xray-list
option name 'my_pc_bypass'
option direction 'src'
option exclude '1'
list ip '10.1.0.6'
Логика работы (Flow)
- Цепочка Prerouting: Весь входящий трафик от клиентов попадает в таблицу
nftables. - Исключения (Exclude 1): Сначала проверяются списки с
exclude '1'. Если совпадение найдено, пакет помечаетсяacceptи уходит по обычному маршруту. - Маркировка (Direction src): Если IP клиента найден в списке с
direction 'src', пакет помечается меткой0x66. - Перехват (Direction dst): Для пакетов с меткой
0x66проверяются списки назначений (dst). Если финальный IP найден в сете — пакет перенаправляется на локальный порт TProxy. - DNS-фильтрация: При запросе домена из списка
domain/url_domain,dnsmasqсохраняет полученный IP в сетnftablesна время, указанное вoption timeout.