Облачное хранилище
Fail2ban защита RDP за NAT — схема фильтрации трафика и безопасности
Fail2ban для RDP за NAT: как работает защита и фильтрация подключений

Когда сервер 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 = 30
  • bantime = 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).


Полезные ссылки

основная статья: https://adminotes.ru/fail2ban-kak-zashhitit-server-ot-perebora-parolej/ про fail2ban и основные варианты применения