Skip to content
Эта страница переведена с помощью ИИ и может содержать неточности. Помогите улучшить перевод на GitHub.

Защита от вторжений ​

Защита от вторжений в духе 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:

yaml
    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 определяется как не имеющий прав и переходит на порты-ловушки в пространстве пользователя.

Распространяется по лицензии Apache-2.0.