Fail2ban работа с NAT RDP

Стырено с Хабра — Спасибо.
Fail2ban работа с NAT

Большинство используют Fail2ban для защиты различных программ на сервере. Но как быть, если надо защитить сервис, находящийся внутри локальной сети? Тут нам понадобится связка из iptables для маркировки трафика и Fail2ban для принятия решения по блокировке.

Всё будем делать на Centos 6.

Заставим iptables писать свой лог в отдельный файл, как тут — https://habrahabr.ru/post/259169/.

Определяемся, какой сервис будем защищать — пускай это будет сервер терминалов RDP на порту 3389.

Стандартное правило обычно выглядит вот так:

-A PREROUTING -i eth1 -p tcp -m tcp —dport 3389 -j DNAT —to-destination 192.168.1.209:3389

Теперь нам надо добавить к стандартному правилу проброса порта во внутреннюю сеть. Вида (eth1 — внешний интерфейс, порт 3389 (сервер терминалов) и внутренний адрес сервера 192.168.1.209):

Правила маркировки пакетов с помощью iptables, чтобы получить вот такие строчки в iptables:

-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

Почитать, что делает первая строчка и как она работает, можно вот тут https://habrahabr.ru/post/88461/.

Теперь пишем обработку файла iptables.log в Fail2ban.

Пишем в /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 ; Бан на 1 сутки
findtime = 60 ; Время за которое должно повториться событие 1 минута

Пишем в /etc/fail2ban/filter.d/rdp-bruteforce.conf:

# Fail2Ban configuration file
#
# Author: AwS59
#
[Definition]
# Option: failregex
# Notes.: regex to match the password failures messages in the logfile. The
# host must be matched by a group named «host». The tag «» can
# be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P[\w\-.^_]+)
# Values: TEXT
#
# Sample log: Feb 29 11:16:55 mars kernel: Iptables: hashlimit: IN=XXX OUT= MAC=XX:XX:XX:XX:XX: SRC=X.X.X.X DST=X.X.X.X LEN=X
# TOS=0x00 PREC=0x00 TTL=X ID=X DF PROTO=TCP SPT=X DPT=X WINDOW=X RES=0x00 SYN URGP=0
#
failregex = hashlimit: .* SRC=
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

Пишем в /etc/fail2ban/action.d/iptables-nat.conf:

[INCLUDES]
before = iptables-common.conf
[Definition]
# Option: actionstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = -t nat -N f2b-
-t nat -A f2b- -j
-t nat -I PREROUTING -p -j f2b-
# Option: actionstop
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = -t nat -D PREROUTING -p -j f2b-
-t nat -F f2b-
-t nat -X f2b-

# Option: actioncheck
# Notes.: command executed once before each actionban command
# Values: CMD
#
actioncheck = -n -L PREROUTING -t nat | grep -q ‘f2b-[ \t]’
# Option: actionban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionban = -t nat -I f2b- 1 -s -j DNAT —to
-I FORWARD -s -d -j ACCEPT
# Option: actionunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: See jail.conf(5) man page
# Values: CMD
#
actionunban = -t nat -D f2b- -s -j DNAT —to
-D FORWARD -s -d -j ACCEPT
[Init]

Осталось перезапустить службы iptables и Fail2ban и начинаем следить за iptables.log и появлением там строк с hashlimit и реакцией в Fail2ban на эти строчки.

  1. Пока комментариев нет.

  1. Пока что обратных ссылок нет.