Короткий ответ

Лучшая защита от brute — не слушать SSH/RDP/WinBox на WAN 203.0.113.10. Вторая — VPN с ключом/MFA, админка из 10.0.99.0/24. Третья — ограничение попыток: nft limit/meter, RouterOS connection-limit/limit, sshd MaxAuthTries, fail2ban по логам. Не PermitRootLogin yes «пока», не disable firewall, не только GeoIP.

Если 3389 проброшен — сначала снимите DNAT, jail на хосте не спасёт периметр.

Симптомы и как отличить

auth.log: тысячи Failed password с публичных. RouterOS log: login failure. Windows 4625 с WAN. Каналы VPN UDP забиты IKE-flood — это ближе к rate limit, но парольный brute на HTTPS-портале тоже сюда.

СервисГде смотретьНорма
sshdauth.log / journalнет попыток с WAN
RDPSecurity 4625только LAN/VPN
WinBox/logтолько mgmt
VPN user/passлог концентратораlockout/MFA

Возможные причины

  1. 22/3389/8291 на WAN.
  2. Парольная аутентификация, слабые учётки admin.
  3. Нет fail2ban/limit.
  4. fail2ban в detect-only / неверный backend nft.
  5. IPv6 не в jail.
  6. Brute идёт на VPN-портал, а jail только sshd.

Диагностика

Свой скан WAN (не чужой):

nmap -Pn -p 22,3389,8291 203.0.113.10

На Ubuntu-бастионе:

sudo journalctl -u ssh -n 50 --no-pager
sudo grep -c 'Failed password' /var/log/auth.log
sudo fail2ban-client status 2>/dev/null || true
sudo sshd -T | grep -Ei 'maxauthtries|permitrootlogin|passwordauthentication|maxstartups'

RouterOS:

/user print
/ip service print
/log print where message~"login"
/ip firewall filter print where dst-port=22 or dst-port=8291

Windows: 4625, NLA включён ли (NLA не замена закрытому WAN).

Не пытайтесь «подобрать пароль чтобы проверить политику» — смотрите счётчики и логи.

Решение

Сценарий A. Закрыть поверхность

SSH/WinBox/RDP не на WAN. VPN UDP в матрице. См. админка FW и админ-интерфейсы. Это снимает 99% brute.

Сценарий B. nft limit на 22 с mgmt (глубина)

Даже на 10.0.99.0/24 полезно:

sudo cp /etc/nftables.conf /root/nftables.conf.bak.brute

Идея: iifname mgmt tcp dport 22 ct state new limit rate 8/minute accept иначе drop с log prefix SSH-RATE.

sudo nft -c -f /etc/nftables.conf
sudo systemctl reload nftables

Не rate 1/hour — заблокируете себя с кривым ключом. Имейте консоль.

Сценарий C. fail2ban

Jail sshd backend nftables/netfilter на Ubuntu 22.04/24.04. ignoreip = 10.0.99.0/24 + VPN. maxretry/bantime по политике. Проверка:

sudo fail2ban-client status sshd

Не banaction = iptables если у вас чистый nft без compat — сверьте jail.conf этой ОС.

Сценарий D. RouterOS

/ip firewall filter add chain=input protocol=tcp dst-port=22,8291 connection-state=new \
  src-address=10.0.99.0/24 action=accept
/ip firewall filter add chain=input protocol=tcp dst-port=22,8291 connection-state=new \
  limit=10,5:packet action=drop log=yes log-prefix="BRUTE"
/ip firewall filter add chain=input protocol=tcp dst-port=22,8291 action=drop

Параметры limit сверьте с help вашей 7.x (/ip firewall filter add limit=). Не отключайте всю цепь input.

Дополнительно: сильные пароли, ограничение user group, только ключ SSH если используете.

Сценарий E. VPN парольный

Lockout на RADIUS/NPS, MFA, rate на HTTPS-портале (nginx limit_req — см. rate limiting). IKEv2 сертификат лучше user/pass. Не публикуйте L2TP/IPsec с PSKи слабым логином на any.

Windows RDP: если всё же внутренний — NLA, lockout AD, не WAN.

Откат: консоль, не stop fail2ban+nft вместе.

Слои: закрыть, затем rate, затем jail, не наоборот

Порядок внедрения: (1) 22/3389/8291 нет на WAN — проверяется LTE nmap своего IP; (2) админка только 10.0.99.0/24 и VPN; (3) на оставшемся listener — MaxAuthTries, nft limit new, fail2ban с ignoreip mgmt; (4) MFA на VPN. Если начать с fail2ban при открытом 22/Any, вы лечите симптом и ловите lockout себя.

Тест jail только со стенда в разрешённой сети, несколько неверных паролей своей тестовой учётки, не чужой прод-учётки директора. Консоль/KVM заранее. IPv6 jail обязателен, если sshd слушает ::. Логи failures на 10.0.99.20, иначе после ребута FW нет доказательств. RouterOS: limit на input 22/8291 не должен стоять выше allow из mgmt так, чтобы админ с 10.0.99.10 ловил drop — смотрите order.

Как проверить, что проблема устранена

  1. С LTE порты 22/3389/8291 на 203.0.113.10 не open.
  2. С mgmt SSH работает.
  3. Неудачные попытки с тестового хоста в разрешённой сети (свой стенд) ловят limit/jail, консоль жива.
  4. Не тестируйте brute против чужих серверов.
  5. Логи на syslog-узле содержат prefix BRUTE/SSH-RATE.
  6. Пользователи VPN с MFA входят.

Не устраивайте 10k попыток на прод — хватит нескольких со своего стенда.

Не используйте общий пароль admin/Password1 на VPN, WinBox и sshd: один слив = brute по всем сервисам сразу. Разные секреты, ключи SSH, MFA на VPN. Мониторинг: алерт если за 5 минут >20 Failed password или RouterOS login failure не из 10.0.99.0/24. После увольнения сразу disable учётки и peer VPN — jail не спасёт валидный пароль уволенного. На Windows не публикуйте 3389 даже «с NLA»: NLA не rate-limit.

Если не помогло

  • Brute на 443 веб-приложения — WAF/rate, не ssh jail.
  • Учётки в AD без lockout.
  • Ключ украден — это не brute, отзыв ключей.
  • IPv6.
  • fail2ban читает не тот лог после journald.

Профилактика

  • Нет парольного SSH с мира.
  • MFA VPN.
  • Алерт: >N failures / 5 мин.
  • Offboarding.
  • IDS на повторные SYSLOG auth — с suppress своего сканера.

FAQ

Сменить порт SSH на 2222?

Снижает шум сканеров, не парольный подбор целенаправленный. Всё равно не WAN+пароль.

CAPTCHA на RDP?

Нет. Уберите RDP с WAN.

fail2ban vs nft meter

Можно оба: nft — грубый rate на SYN, fail2ban — по Failed password. Не замена закрытому порту.

Lockout AD и DoS учёток

Да, риск. Поэтому не публикуйте 3389, lockout умеренный, alerting. Не отключайте lockout «чтобы не дурили».

RouterOS blacklist в интернете

Опционально. Свой limit + закрытый WAN важнее чужих списков без подписи.