Защита от вторжений
Защита от вторжений в духе fail2ban: Gately находит попытки подбора паролей в журналах, ставит ловушки на неиспользуемые порты, считает сканирования портов, добавляет вредоносные IP в список блокировок и синхронизирует его с системным брандмауэром (nftables), который отбрасывает весь их трафик на уровне ядра.
Возможности
- Правила журналов: читают файлы журналов, журнал systemd, вывод команды (например,
logread -fв OpenWrt) или журналы контейнера Docker, находят неудачные попытки по регулярным выражениям и блокируют IP, набравший заданное число попыток за окно подсчёта. Есть шаблоны для SSH, Dropbear, Nginx, Vaultwarden, Home Assistant, Proxmox VE и других; в редакторе можно вставить примеры строк и проверить фильтры; - События Gately: неудачные входы в панель управления и блокировки WAF тоже могут быть источником правила, без регулярных выражений;
- Порты-ловушки: ловушки на портах, которые этот хост не использует (по умолчанию 23, 135, 1433, 3389, 5900, 6379 и другие). Любой подключившийся источник блокируется;
- Обнаружение сканирования: источник, который подключается к закрытым портам этого хоста чаще порога в минуту, блокируется;
- Единый список блокировок: здесь управляются ручные блокировки (включая CIDR-сети и постоянные блокировки) и автоматические блокировки веб-службы после неудачной аутентификации. Блокировки сохраняются и восстанавливаются после перезапуска;
- Нарастающие блокировки: если адрес снова блокируется в течение 30 дней, длительность удваивается до максимума;
- Белый список: адреса локальной сети, loopback, 100.64.0.0/10 (Tailscale) и сети IPv6 /64 интерфейсов этого хоста по умолчанию игнорируются (блокировка идёт по /64, поэтому устройства с публичным IPv6 из той же локальной сети не попадают под неё вместе с нарушителем); можно добавить свои IP и сети. Один IPv6-адрес в белом списке защищает весь свой /64.
Где действуют блокировки
| Среда | Действие блокировки | Порты-ловушки | Обнаружение сканирования |
|---|---|---|---|
Linux (root или CAP_NET_ADMIN, установлен nftables) | Весь трафик отбрасывается в ядре, включая SSH, другие программы и трафик, перенаправляемый в контейнеры Docker и устройства локальной сети | Обрабатываются ядром, ловят сканирования только SYN-пакетами | Доступно |
Docker (сеть host + cap_add: NET_ADMIN) | То же, правила записываются на хост | То же | Доступно |
| Пакет для fnOS, OpenWrt 22.03 и новее | То же (работает от root, nftables встроен) | То же | Доступно |
| Остальные случаи (Windows, macOS, FreeBSD, Linux без nftables или прав) | Только собственные службы Gately: переадресация портов, веб-служба, STUN, WebDAV, FTP и панель управления | Слушает сам Gately, ловит только соединения с завершённым рукопожатием | Недоступно |
Вверху страницы показано состояние синхронизации с брандмауэром, а если она недоступна — причина и способ исправления.
Правила брандмауэра
При включённой «Синхронизации с брандмауэром» Gately создаёт в nftables собственную таблицу inet gately и не трогает системные правила (fw4, Docker, ufw и т. д.):
- Цепочка
prerouting(приоритет -190, после отслеживания соединений и до DNAT) отбрасывает пакеты от заблокированных адресов — и адресованные этому хосту, и перенаправляемые в контейнеры или устройства локальной сети. Ответы на соединения, которые хост открывает сам (DNS, зеркала пакетов и т. п.), проходят, даже если другая сторона заблокирована. IPv6 блокируется по /64; - Цепочка
inputсмотрит только на новые соединения к этому хосту — для портов-ловушек и обнаружения сканирования. Адреса из белого списка не учитываются; - Вся таблица удаляется при выключении синхронизации или остановке Gately. Если её удалит другая программа, Gately запишет её заново в течение 10 секунд.
Кнопка «Показать правила» на странице выводит все действующие правила.
Docker
Чтобы правила записывались на хост, нужны network_mode: host и право NET_ADMIN:
network_mode: host
cap_add:
- NET_ADMINБез него блокировки всё равно действуют на службы Gately. Чтобы читать журналы хоста, смонтируйте каталог журналов в контейнер, например - /var/log:/var/log/host:ro, и укажите в правиле /var/log/host/auth.log. Источник «журнал systemd» в контейнере недоступен.
Правила журналов
| Источник | Что указать | Примечания |
|---|---|---|
| Файл журнала | Пути к файлам, по одному на строку | Читает новые строки с конца файла и следит за ротацией (переименованием или усечением) |
| Журнал systemd | Юниты служб, например ssh.service | Читается через journalctl -f |
| Вывод команды | Одна команда, например logread -f | Перезапускается после завершения |
| Контейнер Docker | Имя контейнера | Читается через подключение к Docker модуля Docker |
| Событие Gately | Неудачный вход / блокировка WAF | В событиях есть IP источника, фильтр не нужен |
Фильтры — регулярные выражения Go (синтаксис RE2), по одному на строку; <HOST> обозначает адрес источника, например:
Failed password for (?:invalid user )?\S* ?from <HOST>Строки, совпавшие с «Исключениями», не учитываются. Окно подсчёта, число неудач и длительность блокировки задаются для каждого правила; длительность может быть по умолчанию, своей или постоянной.
Компромиссы обнаружения сканирования
Учитываются новые соединения к портам, которые этот хост не слушает. Прослушиваемые TCP-порты обновляются каждые 10 секунд и считаются открытыми; порты, которые перенаправляют другие правила брандмауэра, не проходят через цепочку input и не учитываются. Порог по умолчанию — 12 в минуту. Обычный клиент повторяет попытку к закрытому порту около 5 раз в минуту, поэтому не опускайте порог ниже 10.
Занятые порты-ловушки исключаются автоматически, чтобы не блокировать обычных посетителей.
Связь с веб-службой
Блокировки веб-службы «Блокировать после неудачной аутентификации» попадают в тот же список, поэтому при включённой синхронизации они действуют на весь хост, а не только на сайты. При включённом «Игнорировать адреса локальной сети» такие адреса никогда не блокируются автоматически.
Веб-служба и WAF узнают реальный адрес клиента только через протокол PROXY. Для сайтов за CDN, передающей реальный IP в заголовке, блокировки после неудачной аутентификации и правило «Блокировки WAF» заблокируют узлы CDN, поэтому не включайте их для таких сайтов.
Уведомления
Блокировки порождают событие Защита от вторжений: IP заблокирован, на которое можно подписаться в Центре уведомлений. Адреса, заблокированные портами-ловушками и обнаружением сканирования за одну проверку, объединяются в одно уведомление.
Проверка
Проверено в изолированных сетевых пространствах имён на fnOS (Debian 12, nftables 1.0.6) и iStoreOS 24.10 (nftables 1.1.1): порты-ловушки и обнаружение сканирования (IPv4 и IPv6) блокируют в ядре и попадают в список блокировок; файлы журналов (включая ротацию), журнал systemd, журналы контейнеров Docker и неудачные входы в панель вызывают блокировки; ручные блокировки сетей и постоянные блокировки, разблокировка, нарастающая длительность, восстановление после перезапуска, повторная запись после внешнего удаления таблицы и очистка при остановке работают как ожидается; контейнер Docker без NET_ADMIN определяется как не имеющий прав и переходит на порты-ловушки в пространстве пользователя.