Когда сервер RDP находится за NAT, стандартная защита становится менее прозрачной: попытки атак проходят через внешний интерфейс, а дальше тихо проксируются внутрь. Чтобы Fail2ban мог корректно обнаруживать злоумышленников, нужно подготовить iptables так, чтобы он логировал нужные события, а Fail2ban — на них реагировал. Ниже — полностью рабочая схема.
1. Базовый DNAT для RDP
Начинаем с определения целевого сервиса — пусть это будет терминальный сервер RDP на стандартном порту 3389.
Обычно проброс выглядит так:
код
-A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.1.209:3389
Это минимальный набор для перенаправления трафика с внешнего интерфейса eth1 во внутреннюю сеть.
2. Добавляем правила маркировки и логирования
Чтобы Fail2ban мог реагировать на подозрительные подключения, iptables должен фиксировать попытки доступа. Для этого к стандартному правилу добавляем hashlimit-ограничения и логи.
Ниже пример рабочих правил, которые позволяют выявлять всплески попыток соединений:
код
-A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -m state --state NEW -m hashlimit --hashlimit 1/hour --hashlimit-burst 5 --hashlimit-mode srcip --hashlimit-name RDP --hashlimit-htable-expire 31000 -j LOG --log-prefix "Iptables: RDP 3389 detected: " -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j LOG --log-prefix "Iptables: hashlimit: " -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.1.209:3389
Первая строка — ключевая: здесь включён hashlimit, ограничивающий количество соединений от одного IP. Логи с префиксом hashlimit: будут использоваться Fail2ban. Подробно механизм описан в полезной статье на Хабре (ссылка в конце).
3. Настройка Fail2ban
Дальше создаём jail, который будет отслеживать строки из iptables.log.
Файл /etc/fail2ban/jail.local:
код
[rdp-bruteforce] enabled = true filter = rdp-bruteforce action = iptables-nat[name=rdp-bruteforce, protocol=tcp] logpath = /var/log/iptables.log maxretry = 3 bantime = 86400 findtime = 60
Тут всё по классике: три срабатывания за минуту — бан на сутки.
4. Фильтр для Fail2ban
Создаём /etc/fail2ban/filter.d/rdp-bruteforce.conf:
код
# Fail2Ban configuration file # # Author: AwS59 # [Definition] failregex = hashlimit: .* SRC=<HOST> ignoreregex =
Фильтр ловит любые строки с ключом hashlimit:, где указан источник IP.
5. Действия iptables с поддержкой NAT
Fail2ban по умолчанию не умеет управлять NAT-правилами, поэтому добавляем собственный action-файл.
/etc/fail2ban/action.d/iptables-nat.conf:
код
[INCLUDES]
before = iptables-common.conf
[Definition]
actionstart = <iptables> -t nat -N f2b-<name>
<iptables> -t nat -A f2b-<name> -j <returntype>
<iptables> -t nat -I PREROUTING -p <protocol> -j f2b-<name>
actionstop = <iptables> -t nat -D PREROUTING -p <protocol> -j f2b-<name>
<iptables> -t nat -F f2b-<name>
<iptables> -t nat -X f2b-<name>
actioncheck = <iptables> -n -L PREROUTING -t nat | grep -q 'f2b-<name>[ \t]'
actionban = <iptables> -t nat -I f2b-<name> 1 -s <ip> -j DNAT --to <ip>
<iptables> -I FORWARD -s <ip> -d <ip> -j ACCEPT
actionunban = <iptables> -t nat -D f2b-<name> -s <ip> -j DNAT --to <ip>
<iptables> -D FORWARD -s <ip> -d <ip> -j ACCEPT
[Init]
Этот action формирует собственную цепочку в NAT-таблице и добавляет туда IP-адреса злоумышленников.
6. Завершаем настройку
Перезапускаем службы:
- iptables (или сохраняем правила через iptables-persistent)
- fail2ban
Теперь можно открыть /var/log/iptables.log и убедиться, что строки hashlimit: появляются, а Fail2ban на них реагирует — блокирует IP в течение суток.
FAQ
Почему нельзя использовать стандартный action iptables?
Потому что RDP за NAT требует работы именно с nat-таблицей, а стандартные действия Fail2ban работают только в filter-таблице.
Можно ли защитить не только 3389, но и нестандартный порт?
Да, просто заменяешь порт и корректируешь фильтр, если меняется лог-префикс.
Если есть UFW — схема изменится?
Да, UFW поверх iptables может перехватывать правила. Лучше отключить его или заранее перевести схему в нативные iptables.
А если RDP опубликован через VPN?
Тогда Fail2ban для RDP часто становится избыточен — сам VPN уже является фильтром. Но NAT-вариант по-прежнему рабочий.
Советы
- Используй нестандартный внешний порт для RDP — это снижает шум в логах.
- Не ставь слишком маленький hashlimit-burst — иначе легальные пользователи могут отлетать в бан.
- Перенаправляй логи iptables в отдельный файл — так Fail2ban работает стабильнее.
- Раз в месяц проверяй цепочку
f2b-*— иногда в ней остаются старые IP.
💡 Советы и Best Practices
1. Не держите RDP на 3389, даже если есть Fail2ban
Перенос порта не спасает от сканирования, но снижает объём «мусорного» трафика. Fail2ban будет работать эффективнее и реже писать в лог.
2. Используйте VPN как основной рубеж защиты
WireGuard или L2TP/IPsec — сильно надёжнее, чем открытый RDP даже с Fail2ban.
Fail2ban в этом случае становится второй линией обороны.
3. Уменьшайте findtime и увеличивайте bantime на продуктивных серверах
Например:
findtime = 30bantime = 7d
Так ты режешь роботов моментально и надолго.
4. Включите локальное логирование hashlimit только при необходимости
Логи растут довольно быстро. Если сервер в продакшене и трафика много — используй logrotate с агрессивными настройками.
5. Не забывайте мониторить Fail2ban через systemd или Telegram-бота
Так ты сразу увидишь, если фильтр перестал работать или iptables поменялся после обновлений.
6. Проверяйте работу jail вручную
Команда:
fail2ban-regex /var/log/iptables.log /etc/fail2ban/filter.d/rdp-bruteforce.conf
Покажет, цепляет ли фильтр нужные строки.
7. Для nftables всё делается иначе
Если в системе уже nftables — переписывать фильтры придётся под синтаксис nft.
Fail2ban это поддерживает, но конфиги другие.
8. Защитите не только входящие попытки, но и исходящие
Если злоумышленник всё-таки подобрал пароль, Fail2ban не спасёт от злоупотреблений.
Рекомендуется включить аудит входов (auditd / journald / sysmon for linux).
Полезные ссылки
- Механика hashlimit-ограничений: https://habrahabr.ru/post/88461/
- Документация Fail2ban: https://www.fail2ban.org/
- Руководство по iptables: https://wiki.archlinux.org/title/iptables
- Пример расширенной защиты SSH через Fail2ban: https://wiki.debian.org/Fail2ban
основная статья: https://adminotes.ru/fail2ban-kak-zashhitit-server-ot-perebora-parolej/ про fail2ban и основные варианты применения


