Короткий ответ
Лучшая защита от 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-портале тоже сюда.
| Сервис | Где смотреть | Норма |
|---|---|---|
| sshd | auth.log / journal | нет попыток с WAN |
| RDP | Security 4625 | только LAN/VPN |
| WinBox | /log | только mgmt |
| VPN user/pass | лог концентратора | lockout/MFA |
Возможные причины
- 22/3389/8291 на WAN.
- Парольная аутентификация, слабые учётки
admin. - Нет fail2ban/limit.
- fail2ban в detect-only / неверный backend nft.
- IPv6 не в jail.
- 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=8291Windows: 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.
Как проверить, что проблема устранена
- С LTE порты 22/3389/8291 на
203.0.113.10не open. - С mgmt SSH работает.
- Неудачные попытки с тестового хоста в разрешённой сети (свой стенд) ловят limit/jail, консоль жива.
- Не тестируйте brute против чужих серверов.
- Логи на syslog-узле содержат prefix BRUTE/SSH-RATE.
- Пользователи 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 важнее чужих списков без подписи.