Защита проброшенного RDP порта.
Для начала заставим IPTABLES писать логи в свой отдельный файл, а не в syslog.
nano /etc/rsyslog.d/10-iptables.conf
& ~
Теперь перейдем к настройке fail2ban
[rdp-bruteforce3388]
enabled = true
filter = rdp-bruteforce3388
action = iptables-nat[name=rdp-bruteforce3388, protocol=tcp]
logpath = /var/log/iptables.log
maxretry = 17
bantime = 600
findtime = 600
[rdp-bruteforce4875]
enabled = true
filter = rdp-bruteforce4875
action = iptables-nat[name=rdp-bruteforce4875, protocol=tcp]
logpath = /var/log/iptables.log
maxretry = 17
bantime = 600
findtime = 600
[rdp-forever]
enabled = true
filter = rdp-num-ban
action = rdp-ban[name=rdp-forever, protocol=tcp]
logpath = /var/log/fail2ban.log
maxretry = 3
bantime = -1 ; Бан вечно
findtime = 604800
[rdp-brut-ban-day]
enabled = true
filter = rdp-bruteforce
action = iptables-nat[name=rdp-bruteforce, protocol=tcp]
logpath = /var/log/iptables.log
maxretry = 96
bantime = 86400
findtime = 86400
Поясним:
filter = rdp-bruteforce - это словосочетание по которому будем искать событие в логе
action = rdp-ban[name=rdp-bruteforce, protocol=tcp] - событие которое бедет запущено для создания правила в Iptables для блокировки нашего обнаглевшего бота.
maxretry = 17 - это количество совпадений в логе
bantime = - время на которое будет забанен
findtime = - время на протяжении которого должны быть записаны 17 совпадений
Первые две секции одинаковы, они мониторят два разных порта и банят на 10 минут если в течении 10 минут было 17 событий, в четвертой - ищю особо осторожных ботов и одновременно на двух портах, она банит на сутки если было 96 событий на протяжении суток . В третьей - особо осторожных и умных кидаю в бан на вечно, срабатывает если трижды ip был забанен на сутки.
Теперь настроим фильтры:
[Definition]
failregex = hashlimit.* SRC=<HOST>
ignoreregex =
[Definition]
failregex = hashlimit3388: .* SRC=<HOST>
ignoreregex =
[Definition]
failregex = hashlimit4875: .* SRC=<HOST>
ignoreregex =
[Definition]
failregex = .*rdp-brut-ban-day.* Unban <HOST>
ignoreregex =
nano /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]
nano /etc/fail2ban/action.d/rdp-ban.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]
Добавим правила в iptables которые будут писать лог
iptables -t nat -A PREROUTING -p tcp --tcp-flags SYN,RST,ACK SYN -m tcp --dport 3388 -d 188.190.223.336 -j LOG --log-prefix "Iptables: hashlimit3388: "
iptables -t nat -A PREROUTING -p tcp --tcp-flags SYN,RST,ACK SYN -m tcp --dport 4875 -d 188.190.223.336 -j LOG --log-prefix "Iptables: hashlimit4875: "
Если есть скрипт с правилами для iptables, в конец добавим строку
для восстановления правил fail2ban после очистки цепочек.