Ограничение количества одновременных IP-адресов для Remnanwave
Скрипт мониторит логи Remnawave и автоматически блокирует IP-адреса при превышении лимита одновременных подключений с одного ключа на определённой ноде. Особенно полезно, если вы замечаете, что ваши пользователи делятся VLESS ключами с другими людьми несмотря на ограничение HWID.
- Возможности
- Как это работает
- Требования
- Установка
- Конфигурация
- Использование CLI
- Webhook уведомления
- Whitelist email
- Troubleshooting
- FAQ
- ✅ Fail2ban интеграция - проверенная система банов с автоматическим разбаном
- ✅ Толерантность к переключению сети - не банит при смене LTE↔Wi-Fi или переключении вышек
- ✅ CLI управление - удобные команды для мониторинга и управления
- ✅ Webhook переменные и headers - возможность настроить payload и заголовки для авторизации
- ✅ Whitelist email - исключение определённых пользователей из проверки лимитов
- Мониторинг логов - читает access лог Remnawave каждые 5 секунд
- Сбор уникальных IP - для каждого email собирает список уникальных IP-адресов
- Проверка одновременности - IP считается активным если был < 60 секунд назад
- Детекция нарушений - если одновременно активных IP > лимита → логирует нарушение
- Fail2ban обработка - После 3 нарушений в течение 5 минут → блокировка IP
- Дедупликация - одно нарушение не логируется чаще раза в минуту
- Fail2ban tolerance - нужно 3 нарушения за минуты для бана
- Grace period - 60 секунд на завершение переключения сети
- Timestamp-based detection - проверка реальной активности, а не просто наличия в логе
- ОС: Ubuntu 20.04+, Debian 10+, CentOS 7+, Fedora, Arch, Alpine
- Go: 1.21+ (устанавливается автоматически)
- Fail2ban: устанавливается автоматически
- Remnanode: нода с включенным access логом
- Root доступ: для установки systemd сервисов
git clone https://github.com/syvlech/remnawave-limiter.git && cd remnawave-limiter && sudo bash install.shУстановщик запросит следующие параметры:
| Параметр | По умолчанию | Описание |
|---|---|---|
| Путь к логу Remnanode | /var/log/remnanode/access.log |
Access лог Remnanode |
| Максимум IP на ключ | 1 |
Лимит одновременных IP |
| Время бана (минуты) | 10 |
Длительность блокировки |
| Интервал проверки (сек) | 5 |
Частота мониторинга логов |
| Интервал очистки лога (сек) | 3600 |
Частота truncate лога |
| Webhook URL | none |
URL для уведомлений (опционально) |
| Webhook Template | пусто | Шаблон тела запроса (обязателен если указан URL) |
| Webhook Headers | пусто | Заголовки HTTP (опционально) |
| Whitelist emails | none |
Email для исключения из проверки |
systemctl status remnawave-limiter
systemctl status fail2ban
limiter-cli statusФайл: /opt/remnawave-limiter/.env
# Путь к логу Remnawave
REMNAWAVE_LOG_PATH=/var/log/remnanode/access.log
# Путь к логу нарушений (для fail2ban)
VIOLATION_LOG_PATH=/var/log/remnawave-limiter/access-limiter.log
# Максимальное количество IP-адресов на один ключ
MAX_IPS_PER_KEY=1
# Интервал проверки лога в секундах
CHECK_INTERVAL=5
# Интервал очистки лога в секундах
LOG_CLEAR_INTERVAL=3600
# Webhook уведомления (template обязателен если указан URL)
WEBHOOK_URL=https://your-domain.com/api/webhook
WEBHOOK_TEMPLATE={"username":"%email","ip":"%ip","server":"%server","action":"%action","duration":%duration,"timestamp":"%timestamp"}
WEBHOOK_HEADERS=Authorization:Bearer your-token,Content-Type:application/json
BAN_DURATION_MINUTES=10
# Whitelist email (через запятую)
WHITELIST_EMAILS=root,admin,vomao039fa3sudo systemctl restart remnawave-limiter limiter-cli status # Показать статус системы
limiter-cli violations # Последние 20 нарушений
limiter-cli violations -n 50 # Последние 50 нарушений
limiter-cli banned # Список забаненных IP
limiter-cli unban 1.2.3.4 # Разбанить IP
limiter-cli unban-all # Разбанить все IP
limiter-cli active # Активные подключения
limiter-cli logs # Последние 50 строк логов
limiter-cli logs -f # Следить за логами (Ctrl+C для выхода)
limiter-cli clear # Очистить все логиWebhook требует обязательной настройки шаблона. Доступны следующие переменные:
| Переменная | Описание | Пример |
|---|---|---|
%email |
Subscription ID (идентификатор подписки) | vim6g9a50a |
%ip |
IP адрес | 1.2.3.4 |
%server |
Hostname сервера | vpn-node-01 |
%action |
Действие (ban/unban) | ban |
%duration |
Длительность бана (минуты) | 30 |
%timestamp |
ISO 8601 timestamp | 2025-11-29T12:00:00Z |
WEBHOOK_URL=https://discord.com/api/webhooks/xxx
WEBHOOK_TEMPLATE={"content":"🚫 Ban: %email from %ip on %server for %duration min"}
WEBHOOK_HEADERS=Content-Type:application/jsonWEBHOOK_URL=https://api.example.com/notifications
WEBHOOK_TEMPLATE={"user":"%email","ip":"%ip","action":"%action","timestamp":"%timestamp"}
WEBHOOK_HEADERS=Authorization:Bearer token123,Content-Type:application/json,X-Server-Name:VPN-01Whitelist позволяет исключить определённые подписки из проверки лимитов IP.
# В .env файле
WHITELIST_EMAILS=root,admin,vomao039fa3
# Перезапустите сервис
sudo systemctl restart remnawave-limiter- подписки из whitelist полностью игнорируются при проверке лимитов
- можно указать неограниченное количество подписок
- разделитель - запятая
- подписки чувствительны к регистру
- изменения применяются после перезапуска сервиса
systemctl status remnawave-limiter
journalctl -u remnawave-limiter -n 50 --no-pager
cat /opt/remnawave-limiter/.envsystemctl status fail2ban
fail2ban-client status remnawave-limiter
fail2ban-regex /var/log/remnawave-limiter/access-limiter.log \
/etc/fail2ban/filter.d/remnawave-limiter.conf
tail -100 /var/log/fail2ban.log | grep remnawavels -la /var/log/remnanode/access.log
tail -5 /var/log/remnanode/access.log
journalctl -u remnawave-limiter -f
tail -20 /var/log/remnawave-limiter/access-limiter.logjournalctl -u remnawave-limiter | grep -i webhook
cat /opt/remnawave-limiter/.env | grep WEBHOOK
# Тестовая отправка
curl -X POST https://your-domain.com/api/webhook \
-H 'Content-Type: application/json' \
-d '{"test":"message"}'sudo nano /opt/remnawave-limiter/.env
# Измените MAX_IPS_PER_KEY=1 на нужное значение
sudo systemctl restart remnawave-limitersudo nano /etc/fail2ban/jail.d/remnawave-limiter.conf
# Измените bantime = 30m на нужное (m=минуты, h=часы, d=дни)
sudo systemctl restart fail2bansudo nano /opt/remnawave-limiter/.env
# Измените WHITELIST_EMAILS=email1,email2,email3
sudo systemctl restart remnawave-limitersudo systemctl stop remnawave-limiter
sudo systemctl disable remnawave-limiter
sudo rm -rf /opt/remnawave-limiter
sudo rm /etc/systemd/system/remnawave-limiter.service
sudo rm /etc/fail2ban/jail.d/remnawave-limiter.conf
sudo rm /etc/fail2ban/filter.d/remnawave-limiter.conf
sudo rm /etc/fail2ban/action.d/remnawave-limiter.conf
sudo rm /usr/local/bin/limiter-cli
sudo systemctl daemon-reload
sudo systemctl restart fail2ban
# Удалить логи (опционально)
sudo rm -rf /var/log/remnawave-limiter- Issues: GitHub Issues
MIT License - см. LICENSE