mogilevich/mikrotik-rule-toggle

GitHub: mogilevich/mikrotik-rule-toggle

基于 Go 与 RouterOS 7 的远程规则切换工具,解决家长控制与临时网络隔离的便捷管理问题。

Stars: 0 | Forks: 0

# MikroTik 规则切换 Удалённое управление правилами MikroTik через веб-панель. Включайте и выключайте firewall-правила и kid-control с телефона. ## 屏幕截图

Основной экран

Основной экран — переключатели правил, таймер с обратным отсчётом, кнопки продления, статус роутера.

Статистика

Аналитика — графики использования таймеров за 1/7/30 дней. ## 工作原理 1. **Веб-панель** (Go, Docker) — toggle-переключатели, таймеры временной разблокировки, аудит-лог 2. **Скрипт RouterOS 7** — по таймеру читает состояние с сервера и включает/выключает правила по тегам `hook:` ``` [Web UI / PWA] → [Go Backend + Bearer Auth] ← [MikroTik скрипт по таймеру] ↕ state.json + audit.json ``` ## 功能 - **Toggle** — включение/выключение firewall-правил и kid-control - **Таймеры** — временная разблокировка на 5м, 15м, 30м, 1ч, 3ч, 6ч, 24ч с обратным отсчётом - **Продление таймеров** — кнопки +5м/+15м/+30м/+1ч/+3ч для активного таймера - **Pending-таймеры** — отсчёт начинается только когда роутер забирает настройки - **Kid-control** — инвертированная логика (включён = ребёнок ограничен) - **Conntrack clearing** — при включении блокировки сбрасываются существующие соединения по src/dst-address-list - **Temp-block** — временная полная блокировка устройства (30 сек) при включении правила, убивает game sessions даже если game server IP не в address-list - **Автообновление скрипта** — роутер автоматически обновляет скрипт при появлении новой версии на сервере - **Аудит-лог** — история всех действий (toggle, таймеры, expired), до 2000 записей - **Аналитика** — графики использования таймеров за 1/7/30 дней с разбивкой по суткам - **Статус роутера** — heartbeat (онлайн/офлайн) с точным временем последнего обращения - **Версионирование скрипта** — предупреждение в UI если скрипт на роутере устарел - **PWA** — устанавливается на телефон как приложение - **Pull-to-refresh** — свайп вниз для обновления - **CI/CD** — GitHub Actions собирает Docker-образ и пушит в ghcr.io ## 启动服务器 ``` # 最简单的方法 — 拉取准备好的镜像并运行 make up # 带显式指定的 IP 和令牌 HOST_IP=10.0.0.5 AUTH_TOKEN=secret docker compose up -d # 通过 .env 文件 echo "HOST_IP=10.0.0.5" > .env echo "AUTH_TOKEN=secret" >> .env docker compose up -d # 本地构建(无 CI) make build-local # 无 Docker go build -o hook-server ./server/ AUTH_TOKEN=secret ./hook-server ``` `HOST_IP` автоматически подставляется в скрипт `remote-hook.rsc` при старте контейнера — MikroTik скачает скрипт с уже правильным адресом сервера. Веб-панель доступна на `http://:8080`. ### Make 命令 | Команда | Описание | |---------|----------| | `make up` | Запуск (образ из ghcr.io, IP определяется автоматически) | | `make down` | Остановка | | `make logs` | Просмотр логов | | `make pull` | Подтянуть новый образ из ghcr.io | | `make restart` | Pull + пересоздание контейнера (обновление на сервере) | | `make build-local` | Локальная сборка и запуск | ### 服务器更新 После пуша в master GitHub Actions автоматически соберёт образ. На сервере: ``` make restart ``` ### 环境变量 | Переменная | Default | Описание | |-------------|-----------|-------------------------------------| | `LISTEN_ADDR` | `:8080` | Адрес и порт для прослушивания | | `DATA_DIR` | `./data` | Директория для хранения состояния | | `AUTH_TOKEN` | — | Bearer token для защиты API | ## MikroTik 配置 ### 1. 标记规则 Для **firewall** — в поле `comment`, для **kid-control** — в поле `name`: ``` /ip/firewall/filter add chain=forward action=drop dst-address-list=roblox comment="hook:roblox-drop" disabled=yes /ip/kid-control add name="hook:Eva-Laptop" fri=6h-20h mon=6h-19h ... ``` ### 2. 下载并安装脚本 Скрипт доступен для скачивания прямо с сервера (авторизация не требуется): ``` # 从服务器下载脚本到路由器 /tool/fetch url="http://your-server:8080/mikrotik/remote-hook.rsc" dst-path=remote-hook.rsc # 编辑脚本开头的 URL 和令牌,然后创建脚本 /system/script add name=remote-hook source=[/file/get remote-hook.rsc contents] # 创建调度(每分钟一次) /system/scheduler add name=remote-hook interval=1m on-event="/system/script/run remote-hook" ``` ### 3. 路由器上的脚本更新 Скрипт обновляется автоматически — при обнаружении новой версии на сервере роутер скачивает и применяет обновлённый скрипт при следующем poll. При необходимости обновить вручную: ``` /tool/fetch url="http://your-server:8080/mikrotik/remote-hook.rsc" dst-path=remote-hook.rsc /system/script set remote-hook source=[/file/get remote-hook.rsc contents] ``` ### 阻塞机制的工作原理(连接跟踪清除 + 临时阻塞) При включении blocking-правила скрипт: 1. **Собирает src IP** устройств из `src-address-list` / `src-address` правила, или сканирует conntrack по `dst-address-list` 2. **Включает правило** — новые соединения блокируются 3. **Temp-block** — добавляет src IP в `_temp-block` address-list на 30 сек (полный бан устройства, убивает game sessions) 4. **Очищает conntrack** — удаляет все существующие соединения от заблокированных устройств 5. Через 30 сек temp-block истекает, интернет возвращается, но DNS/TLS блокировка не даёт переподключиться Drop-правило `_temp-block` автоматически создаётся и позиционируется перед `accept established,related`. ### 支持的部分 | Раздел | Тег в поле | Логика | |--------|-----------|--------| | `/ip/firewall/filter` | `comment` | Прямая (enabled = правило активно) | | `/ip/firewall/nat` | `comment` | Прямая | | `/ip/firewall/mangle` | `comment` | Прямая | | `/ip/kid-control` | `name` | Инвертированная (enabled = ограничения сняты) | Для добавления новых разделов — отредактируйте массив `sections` в скрипте. Для инвертированной логики — также `invertedSections`. ### 故障行为 | Ситуация | Поведение | |---|---| | Сервер недоступен | Скрипт прерывается, правила не трогаются | | Пустой/невалидный ответ | Скрипт прерывается, правила не трогаются | | Параметр есть на роутере, нет на сервере | Правило не трогается | | Параметр есть на сервере, нет на роутере | Игнорируется | | Таймаут | 10 секунд, затем прерывание | ## API Запросы к `/api/*` требуют заголовок `Authorization: Bearer ` (если `AUTH_TOKEN` задан). Остальные URL доступны без авторизации. | Метод | URL | Auth | Описание |----------|-----------------|------|------------------------------| | `GET` | `/api/state` | да | Состояние параметров | | `POST` | `/api/state` | да | Изменить параметр (`{name, enabled}`) | | `POST` | `/api/timer` | да | Таймер разблокировки (`{name, minutes}`) | | `POST` | `/api/params` | да | Добавить параметр (`{name, description, inverted}`) | | `DELETE` | `/api/params?name=xxx` | да | Удалить параметр | | `GET` | `/api/log` | да | Последние 50 событий аудит-лога | | `GET` | `/api/stats` | да | Статистика по параметрам | | `GET` | `/api/stats?days=N` | да | Аналитика таймеров за N дней (1–90) с разбивкой по суткам | | `GET` | `/api/heartbeat`| да | Статус подключения роутера + версия скрипта | | `GET` | `/mikrotik/remote-hook.rsc` | нет | Скачать скрипт | | `GET` | `/` | нет | Веб-панель (PWA) |
标签:Bearer认证, Docker, Go, JSON存储, MacOS取证, MikroTik, PWA, RouterOS, Ruby工具, Web面板, 倒计时, 反向代理, 后台管理, 后端开发, 孩子控制, 安全防御评估, 定时器, 审计日志, 家长控制, 日志审计, 时间锁定, 流量控制, 状态存储, 状态监控, 移动端, 网络安全, 网络控制, 规则切换, 设备管理, 请求拦截, 远程管理, 防火墙规则, 隐私保护