14 Commits
Author SHA1 Message Date
root 64fe40fcd9 feat v0.1.26: refactor script 2026-07-13 21:27:12 +04:00
root 520eca9548 fix: output rules 2026-04-15 00:27:26 +04:00
root b0c53fb678 fix: output rules 2026-04-15 00:17:45 +04:00
root b78e53ee23 fix: output routing 2026-04-15 00:11:52 +04:00
root 0553dc8d70 fix: tabulation 2026-04-15 00:10:24 +04:00
root 819111f953 fix: type filter for output 2026-04-14 17:28:58 +04:00
pyrschtjag b8ac297adb Merge pull request 'refactor-fix' (#7) from refactor-fix into main
Reviewed-on: #7
2026-04-13 13:52:28 +04:00
root e0f3b4ab8b fix: minor bugs
feat: debug logs
2026-04-13 13:50:57 +04:00
root 3462c3a9ad refactor-fix 2026-04-12 20:00:19 +04:00
root e80f3f0171 refactor 2026-04-12 19:35:40 +04:00
pyrschtjag 1a631140a7 Merge pull request 'feat: added proxy for router' (#6) from enhanced-routing into main
Reviewed-on: #6
2026-04-11 18:05:56 +04:00
pyrschtjag eb9621cec6 feat: added proxy for router
feat: added full proxy for client

docs: updated readme
2026-04-11 18:05:21 +04:00
pyrschtjag f9c51d0199 Merge pull request 'fix: fixed init and domain parser in script' (#5) from fix-init-and-parser into main
Reviewed-on: #5
2026-04-05 14:25:16 +04:00
pyrschtjag 430d1c8276 fix: fixed init and domain parser in script 2026-04-05 14:24:00 +04:00
4 changed files with 792 additions and 275 deletions
+42 -8
View File
@@ -10,8 +10,11 @@
* **Поддержка `auto-merge`**: Автоматическое решение конфликтов пересекающихся подсетей на уровне ядра (nftables), что предотвращает ошибки при загрузке больших списков.
* **Умное обновление DNS**: Сервис `dnsmasq` перезапускается только при реальном изменении списков доменов, минимизируя разрывы соединений.
* **Проверка изменений (Hashing)**: Скрипт отслеживает изменения в конфигурации URL и уведомляет о необходимости запуска обновления при использовании `reload`.
* **Гибкая маршрутизация**: Поддержка фильтрации по источнику (`src`) и назначению (`dst`), а также корректная обработка локального трафика роутера (`route_local`).
* **Гибкая маршрутизация**: Поддержка фильтрации по источнику (`src`) и назначению (`dst`).
* **Автоматическая очистка**: Удаление устаревших кэш-файлов и правил при изменении структуры конфигурации.
* **Персональные цепочки**: Возможность завернуть абсолютно весь трафик конкретного устройства в прокси с созданием изолированной цепочки правил.
* **Изолированные исключения**: Поддержка параметра parent, который позволяет назначать списки исключений только для конкретных групп или устройств, не влияя на общую маршрутизацию.
* **Защита от петель**: Автоматическое исключение IP-адресов самих прокси-серверов из обработки, что гарантирует стабильность соединения.
## Установка
@@ -44,8 +47,6 @@ git clone https://gitea.oyacoi.ru/pyrschtjag/xray-manager.git /opt/.xray-manager
cp /opt/.xray-manager/config/xray-manager.example /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
```
## Команды управления
@@ -54,7 +55,7 @@ ln -s /opt/.xray-manager/xray-manager.sh /usr/sbin/xray-manager
* **/etc/init.d/xray-manager start** — **Холодный запуск** <br> Полная инициализация системы: создание таблиц nftables, цепочек и правил. При первом запуске скрипт автоматически скачает все списки из URL. Если списки уже есть в кэше — применит их.
* **/etc/init.dИ отредактируйте/xray-manager reload** — **Локальное обновление** <br> Применяет изменения, внесенные в конфигурационный файл /etc/config/xray-manager (например, изменение портов или добавление новых секций), но не обращается к сети. Если вы изменили URL в конфиге, скрипт выдаст предупреждение о необходимости запуска update.
* **/etc/init.d/xray-manager reload** — **Локальное обновление** <br> Применяет изменения, внесенные в конфигурационный файл /etc/config/xray-manager (например, изменение портов или добавление новых секций), но не обращается к сети. Если вы изменили URL в конфиге, скрипт выдаст предупреждение о необходимости запуска update.
* **/etc/init.d/xray-manager update** — **Умная синхронизация** <br> Скрипт опрашивает все внешние URL. Благодаря системе хеширования (Hashing), загрузка и пересборка правил произойдет только для тех списков, которые реально изменились на удаленном сервере. Это экономит трафик и минимизирует нагрузку на процессор роутера.
@@ -77,7 +78,7 @@ ln -s /opt/.xray-manager/xray-manager.sh /usr/sbin/xray-manager
| **dnsmasq_dir** | `string` | `/tmp/dnsmasq.d` | Директория для `.conf` файлов dnsmasq (автоматически добавляется в `confdir` по пути `/etc/config/dhcp`). |
| **cache_dir** | `string` | `/tmp/.xray-manager/cache` | Место хранения хэш-файлов для отслеживания изменений в списках. |
| **active_list** | `string` | `/tmp/.xray-manager/active_files` | Файл-индекс для автоматической очистки «осиротевших» (удаленных) списков. |
| **route_local** | `bool` | `0` | `1` — перехватывать и проксировать трафик самого роутера; <br> `0` — только трафик клиентов. |
| **proxy_ip** | `list` | | Список IP прокси-серверов. Они будут автоматически добавлены в исключения, чтобы роутер не пытался проксировать соединение к самому прокси. |
Пример:
@@ -87,7 +88,6 @@ config xray-manager 'main'
option tproxy_port '61219'
option tproxy_mark '10'
option timeout '1h'
option route_local '1'
option ipnet_dir '/tmp/ipnet'
option dnsmasq_dir '/tmp/dnsmasq.d'
option cache_dir '/tmp/.xray-manager/cache'
@@ -121,8 +121,9 @@ config xray-list 'lnet'
| Параметр | Значение | Описание |
| :--- | :--- | :--- |
| **name** | `string` | Уникальное имя. Используется для названия сета в `nftables` (например, `@v2ray_udom`) и имени файла в `/tmp`. |
| **direction** | `dst` или `src` | **Направление фильтрации**: <br> `dst`: проверка IP назначения (куда идём). <br> `src`: проверка IP отправителя (кто идёт). |
| **exclude** | `0` или `1` | **Тип правила**: <br> `0`: Направлять трафик в прокси. <br> `1`: Пропускать трафик напрямую (исключение). |
| **direction** | `dst`, `src`, `out`, `force_src` | **Направление фильтрации**: <br> `dst`: проверка IP назначения. <br> `src`: проверка IP отправителя. <br> `out`: трафик самого роутера (Self-traffic). <br> `force_src`: принудительный прокси для устройства (весь трафик). |
| **exclude** | `bool` | **Тип правила**: <br> `0`: Направлять трафик в прокси. <br> `1`: Пропускать трафик напрямую (исключение). |
| **parent** | `string` | Имя родительской секции (`force_src`). Если указан, то данное исключение (`exclude 1`) будет работать только для этого родителя. |
Внутри каждой секции можно комбинировать разные типы данных:
@@ -133,6 +134,39 @@ config xray-list 'lnet'
| **list url_ip** | `http(s)://...` | Ссылка на сырой текстовый файл с IP. Скрипт скачает и объединит данные. |
| **list url_domain** | `http(s)://...` | Ссылка на сырой текстовый файл с доменами. Готовит данные для dnsmasq. |
### Прокси для самого роутера
В этом примере завернём запросы до DNS-серверов Cloudflare в прокси:
```bash
config xray-list
option name 'router_self'
option direction 'out' # Трафик роутера
option exclude '0'
list ip '1.1.1.1'
list ip '1.0.0.1'
```
### Проксировать весь трафик от клиента с поддержкой исключений
Завернём в прокси весь трафик от клиента, исключив 2ip.ru:
```bash
# Проксировать весь трафик от клиента 10.2.0.4
config xray-list
option name 'my_pc'
option direction 'force_src'
list ip '10.2.0.4'
# Исключение для my_pc
config xray-list
option name 'my_pc_exc'
option direction 'dst'
option exclude '1'
option parent 'my_pc' # Привязка к родителю
list domain '2ip.ru'
```
### Практический пример по выборочной маршрутизации
**Задача**: Направить трафик конкретного устройства (10.1.0.2) через прокси только при обращении к ресурсам Spotify, не затрагивая остальных клиентов сети.
+16 -22
View File
@@ -5,36 +5,30 @@ config xray-manager 'main'
option tproxy_mark '10'
option client_mark '103'
option timeout '1h'
option route_local '1'
option ipnet_dir '/tmp/.xray-manager/ipnet'
option dnsmasq_dir '/tmp/.xray-manager/dnsmasq.d'
option cache_dir '/tmp/.xray-manager/cache'
option active_list '/tmp/.xray-manager/active_files'
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'
list ip '192.0.0.0/24'
list ip '192.0.2.0/24'
list ip '198.18.0.0/15'
list ip '198.51.100.0/24'
list ip '203.0.113.0/24'
list proxy_ip 'x.x.x.x'
config xray-list
option name 'proxyserver'
option name 'router'
option direction 'out'
option exclude '0'
list ip '1.1.1.1'
list ip '1.0.0.1'
config xray-list
option name 'pc'
option direction 'force_src'
list ip '192.168.2.10'
config xray-list
option name 'pc_exclude'
option direction 'dst'
option exclude '1'
list ip ''
option parent 'pc'
list domain 'ifconfig.io'
config xray-list
option name 'local'
+17 -7
View File
@@ -1,26 +1,36 @@
#!/bin/sh /etc/rc.common
START=95
START=99
USE_PROCD=1
XRAYMANAGER_BIN="/opt/.xray-manager/xray-manager.sh"
extra_command "update" "Download and refresh remote lists"
start_service() {
xray-manager start
procd_open_instance
procd_set_param command tail -f /dev/null
"$XRAYMANAGER_BIN" start
procd_open_instance "main"
procd_set_param command /bin/sh -c "while true; do sleep 3600; done"
procd_set_param respawn
procd_close_instance
}
stop_service() {
xray-manager stop
"$XRAYMANAGER_BIN" stop
}
reload_service() {
xray-manager reload
if procd_running "xray-manager" "main"; then
"$XRAYMANAGER_BIN" reload
else
echo "xray-manager is not running"
fi
}
update() {
xray-manager update
if procd_running "xray-manager" "main"; then
"$XRAYMANAGER_BIN" update
else
echo "xray-manager is not running"
fi
}
+712 -233
View File
File diff suppressed because it is too large Load Diff