mogilevich/mikrotik-rule-toggle
GitHub: mogilevich/mikrotik-rule-toggle
基于 Go 与 RouterOS 7 的远程规则切换工具,解决家长控制与临时网络隔离的便捷管理问题。
Stars: 0 | Forks: 0
# MikroTik 规则切换
Удалённое управление правилами MikroTik через веб-панель. Включайте и выключайте firewall-правила и kid-control с телефона.
## 屏幕截图
`
```
[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面板, 倒计时, 反向代理, 后台管理, 后端开发, 孩子控制, 安全防御评估, 定时器, 审计日志, 家长控制, 日志审计, 时间锁定, 流量控制, 状态存储, 状态监控, 移动端, 网络安全, 网络控制, 规则切换, 设备管理, 请求拦截, 远程管理, 防火墙规则, 隐私保护