Max Kostikov

Возможно, да и наверняка, кому-то будет полезный мой опыт настройки защиты против всевозможных bruteforce'ров и spam'еров посредством использования популярного fail2ban отличным от использования firewall путём - через TCP wrappers.

Подробнее о TCP wrappers я писать не буду, ибо желающие могут прочитать о них, например, в FreeBSD handbook. Хочу лишь сказать о причинах, побудивших меня использовать именно этот механизм ограничения доступа к интернет-сервисам.

Не секрет, что во многих случаях серверы обслуживающие те или иные службы интернет находятся за роутерами с поднятыми на последних firewall'ами и даже NAT. При таком раскладе часто нет нужды в использовании firewall непосредственно на самом сервере. Кроме того, использование firewall непосредственно на обслуживающем интернет-сервисы сервере может быть сопряжено с дополнительным, иногда довольно существенным, использование ресурсов под обслуживание межсетевого экрана, что может негативно сказаться на производительности систем, непосредственно для функционирования которых данный сервер и предназначается.

Однако, отказ от использования firewall на самом сервере ставит вопрос о способе ограничения доступа к сервисам в случае борьбы с попытками взлома. В частности, этот вопрос возник у меня при настройке многим хорошо знакомого fail2ban. И тут я как нельзя кастати оказываются уже упомянутые выше TCP wrappers. Имеющийся там механизм ограничения доступа поддерживается всеми используемыми мною интернет-сервисами и может быть вполне успешно использован в искомых целях.

Итак, на сервере FreBSD имеются и доступны их внешнего мира FTP (стандартный ftpd), SSH (стандартный sshd), SMTP (exim) и POP3/IMAP4 (dovecot), которые регулярно испытывают всевозможные виды bruteforce - атак.

Для борьбы с ними используется fail2ban.

Останавливаться на его установке я не буду, равно как и не буду подробно расписывать все детали начальной настройки. Приведу лишь работающие (и отлично работающие) конфигурационные файлы, на отладку и правку которых я потратил некоторое время.

Важное замечание. Для использования TCP wrappers совместно с Exim и Dovecot они должны быть откомпилированы с одноимённой опцией.

1. Базовая настройка fail2ban

Ввиду малой нагрузки sshd и ftpd у меня запускаются через inetd, а Exim и Dovecot независимо от него через собственные службы.

Итак, во-первых, все модификации штатных конфигов fail2ban делались, как это и рекомендуется в мануале по нему, в их копиях с расширениями .local. Вот их список:

root@beta:/ # cd /usr/local/etc/fail2ban/
root@beta:/usr/local/etc/fail2ban # ll *.local
-rw-r--r--  1 root  wheel  1525  7 дек 16:11 fail2ban.local
-rw-r--r--  1 root  wheel  1671 11 дек 11:32 jail.local
root@beta:/usr/local/etc/fail2ban # ll action.d/*.local
-rw-r--r--  1 root  wheel  1303  7 дек 20:13 action.d/hostsdeny.local
-rw-r--r--  1 root  wheel  1680 22 окт 13:44 action.d/sendmail-whois-lines.local
-rw-r--r--  1 root  wheel  1488 21 окт 09:37 action.d/sendmail-whois.local
root@beta:/usr/local/etc/fail2ban # ll filter.d/*.local
-rw-r--r--  1 root  wheel  1603  7 дек 16:59 filter.d/bsd-sshd.local
-rw-r--r--  1 root  wheel  1119  7 дек 15:11 filter.d/bsdftp.local
-rw-r--r--  1 root  wheel   583  7 дек 20:03 filter.d/dovecot.local
-rw-r--r--  1 root  wheel   208 11 дек 19:16 filter.d/exim-spam.local
-rw-r--r--  1 root  wheel   638 11 дек 12:29 filter.d/exim.local
-rw-r--r--  1 root  wheel  1546 22 окт 13:43 filter.d/recidive.local

Обратите внимание, что для Exim используется два фильтра - один, собственно, для отлова попыток пробиться через него bruteforce или прочими некорректными способами. Второй - для блокировки особо упрямых спамеров на основе резюме, получаемого от Spamassassin.

Самый главный тут файл hostdeny.local, поэтому с него и начнём.

root@beta:/usr/local/etc/fail2ban # cat action.d/hostsdeny.local | grep -v #
[Definition]
actionstart = 
actionstop = 
actioncheck = 
actionban = IP=<ip> && SRV=<srv> &&
            mv <file> <file>.tmp &&
            printf %%b "$SRV: $IP: deny\n" > <file> && 
            cat <file>.tmp >> <file> &&
       chmod 644 <file>
actionunban = IP=<ip> && SRV=<srv> &&
              sed /$SRV:\ $IP:\ deny/d <file> > <file>.tmp && 
              mv <file>.tmp <file> &&
         chmod 644 <file>
[Init]
file = /etc/hosts.allow

Из jail, условия которой сработали, сюда передаются два параметра - IP хоста, в отношении которого будут применяться ограничительные меры (IP), и тип служб, которые мы будем блокировать (SRV).

Условия будут вставляться в начало файла hosts.allow, который используется в FreeBSD как для разрешения, так и для запрещения доступа. Важно вставлять их именно в начало, поскольку последним условием в данном случае, как правило, идёт разрешающее всем доступ ко всему:

root@beta:/usr/local/etc/fail2ban # cat /etc/hosts.allow
# hosts.allow access control file for "tcp wrapped" applications.
# $FreeBSD: releng/10.3/etc/hosts.allow 161710 2006-08-29 09:20:48Z ru $
#       Place both 'allow' and 'deny' rules in the hosts.allow file.
...
all: all: allow
...

Таким образом, ограничения должны быть описаны до него.

Общие настройки fail2ban - здесь всё стандартно.

root@beta:/usr/local/etc/fail2ban # cat fail2ban.local | grep -v #
[Definition]
loglevel = 3
logtarget = /var/log/fail2ban.log
socket = /var/run/fail2ban/fail2ban.sock
pidfile = /var/run/fail2ban/fail2ban.pid

Описание jail's. Собственно, что и как мы будем отслеживать.

root@beta:/usr/local/etc/fail2ban # cat jail.local | grep -v #
[DEFAULT]
ignoreip = 127.0.0.1/8
backend = auto
usedns = yes

[ssh-tcpwrapper]
enabled     = true
filter      = bsd-sshd
action      = hostsdeny[srv="sshd"]
              sendmail-whois[name=ssh, dest=root@my.server]
ignoreregex = for myuser from
logpath     = /var/log/auth.log
bantime    = 3600    ; 1 hour
findtime = 180    ; 3 min
maxretry = 5

[ftp-tcpwrapper]
enabled     = true
filter      = bsdftp
action      = hostsdeny[srv="ftpd"]
              sendmail-whois[name=ftp, dest=root@my.server]
logpath     = /var/log/auth.log
bantime  = 3600    ; 1 hour
findtime = 180    ; 3 min
maxretry = 5

[dovecot-tcpwrapper]
enabled     = true
filter      = dovecot
action      = hostsdeny[srv="pop3,imap,pop3s,imaps"]
              sendmail-whois[name=dovecot, dest=root@my.server]
logpath     = /var/log/maillog
bantime  = 3600    ; 1 hour
findtime = 180   ; 3 min
maxretry = 5

[exim-tcpwrapper]
enabled     = true
filter      = exim
action      = hostsdeny[srv="exim"]
              sendmail-whois[name=exim, dest=root@my.server]
logpath     = /var/log/maillog
bantime  = 3600  ; 1 hour
findtime = 600   ; 10 min
maxretry = 5

[spam-tcpwrapper]
enabled     = true
filter      = exim-spam
action      = hostsdeny[srv="exim"]
              sendmail-whois[name=spam, dest=root@my.server]
logpath     = /var/log/maillog
bantime  = 10800 ; 3 hours
findtime = 900   ; 15 min
maxretry = 3

[recidive]
enabled       = true
filter      = recidive
logpath     = /var/log/fail2ban.log
action      = hostsdeny[srv="all"]
              sendmail-whois-lines[name=recidive, logpath=/var/log/fail2ban.log]
bantime  = 604800  ; 1 week
findtime = 86400   ; 1 day
maxretry = 3

Обратите внимание на ignoreip. Важно не забанить localhost по ошибке.

Jail recidive использован для явно злонамеренных хостов, которых не вразумили два предыдущих краткосрочных бана. Если нет нужды получать оповещения о банах по e-mail, то из перечисления action можно исключить строки, которые начинаются с sendmail-....

Также в данном случае для нужд предварительно отладки включены рассылки уведомлений на адрес администратора для каждого случая срабатывания. Если вам нет нужды получать такую информацию, вы можете удалить её рассылку удалив строку sendmail-whois в поле action.

Ну и самое интересное - фильтры. Стандартные фильтры fail2ban пришлось местами изрядно, как говорится, обработать напильником.

Конфигурация для SSH.

root@beta:/usr/local/etc/fail2ban # cat filter.d/bsd-sshd.local | grep -v #
[INCLUDES]
before = common.conf
[Definition]
_daemon = sshd
failregex = ^%(__prefix_line)s(?:error: PAM: )?[A|a]uthentication (?:failure|error) for .* from <HOST>\s*$
            ^%(__prefix_line)sDid not receive identification string from <HOST>$
            ^%(__prefix_line)sFailed [-/\w]+ for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
            ^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
            ^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
            ^%(__prefix_line)sUser \S+ from <HOST> not allowed because not listed in AllowUsers$
            ^%(__prefix_line)sauthentication failure; logname=\S* uid=\S* euid=\S* tty=\S* ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
            ^%(__prefix_line)srefused connect from \S+ \(<HOST>\)\s*$
            ^%(__prefix_line)sreverse mapping checking getaddrinfo for .* \[<HOST>\] .* POSSIBLE BREAK-IN ATTEMPT!$
            ^%(__prefix_line)sReceived disconnect from <HOST>: 11: Bye Bye \[preauth\]\s*$
ignoreregex = 

Почти без изменений для FTP.

root@beta:/usr/local/etc/fail2ban # cat filter.d/bsdftp.local | grep -v #
[INCLUDES]
before = common.conf
[Definition]
_daemon = ftpd
failregex = ^%(__prefix_line)sFTP LOGIN (?:FAILED|REFUSED) FROM <HOST>,\s*.*$
ignoreregex = 

Лёгкая правка строки для Dovecot.

root@beta:/usr/local/etc/fail2ban # cat filter.d/dovecot.local | grep -v #
[INCLUDES]
before = common.conf
[Definition]
failregex = (pop3|imap)-login: .*(?:Authentication failure|Aborted login \(auth failed|Aborted login \(tried to use disabled|Disconnected \(auth failed|Aborted login \(\d+ authentication attempts).*rip=(?P<host>\S*),.*
ignoreregex = 

Убрано лишнее, правка регулярного выражения для Exim.

root@beta:/usr/local/etc/fail2ban # cat filter.d/exim.local | grep -v #
[INCLUDES]
[Definition]
failregex =  \[<HOST>\] (I=\[\S+\]:\d+) sender verify fail for <\S+>: all relevant MX records point to non-existent hosts
             \[<HOST>\] (I=\[\S+\]:\d+)( X=\S+ CV=\S+)? F=(<>|[^@]+@\S+) rejected RCPT [^@]+@\S+: (Relay not permitted|Sender verify failed|Unrouteable address|User unknown|User not found|No route to host|Authentication need to relay|Main (hostname|IP) in your HELO/EHLO|HELO/EHLO contains incorrect TLD|HELO/EHLO is not FQDN or IP address|SPF check failed|Invalid return path signature|Unsigned return path in bounce|(abuse|postmaster) must be only recipient|Literal notation for IP as HELO/EHLO required)
             SMTP syntax error in ".+" H=\(\S+\) \[<HOST>\] I=\[\S+\]:\d+
             unqualified sender rejected: <\S+> H=\(?\S+\)? (\(\S+\) )?\[<HOST>\]
             auth_(plain|login) authenticator failed for (\S+)?\s?\(\S+\) \[<HOST>\] (I=\[\S+\]:\d+): 535 Incorrect authentication data
             SMTP connection from( \S+)? \[<HOST>\] (I=\[\S+\]:\d+) lost while reading message data
ignoreregex =

Обращаю внимание,что строки в регулярных выражения для Exim специфичны для моей конфигурации и, отчасти, не являются стандартными. Рекомендую использовать свои собственные строки, которые генерируются именно вашей конфигурацией почтового сервера.

root@beta:/usr/local/etc/fail2ban # cat filter.d/exim-spam.local | grep -v #
[INCLUDES]
[Definition]
failregex =  \[<HOST>\](:\d+)? (I=\[\S+\]:\d+)? F=(<>|[^@]+@\S+) rejected after DATA:
ignoreregex =

Из стандартного фильтра убрано лишнее и поправлена строка регулярного выражения.

root@beta:/usr/local/etc/fail2ban # cat filter.d/recidive.local  | grep -v #
[Definition]
_jailname = recidive
failregex = fail2ban.actions:\s+WARNING\s+\[(?:.*)\]\s+Ban\s+<HOST>
ignoreregex = fail2ban.actions:\s+WARNING\s+\[%(_jailname)s\]\s+Ban\s+<HOST>

Должен работать и стандартный recidive.conf. Ну и actions для отправки почтовых уведомлений. Можно было не стандартные.

root@beta:/usr/local/etc/fail2ban # cat action.d/sendmail-whois.local | grep -v #
[Definition]
actionstart = 
actionstop = 
actioncheck = 
actionban = printf %%b "Subject: [Fail2Ban] <name>: banned <ip>
            Date: `LC_TIME=C date -u +"%%a, %%d %%h %%Y %%T +0000"`
            From: Fail2Ban <<sender>>
            To: <dest>\n
            Hi,\n
            The IP <ip> has just been banned by Fail2Ban after
            <failures> attempts against <name>.\n\n
            Here are more information about <ip>:\n
            `/usr/bin/whois <ip>`\n
            Regards,\n
            Fail2Ban" | /usr/sbin/sendmail -f <sender> <dest>
actionunban = 
[Init]
name = default
dest = root
sender = fail2ban

И второе действие.

root@beta:/usr/local/etc/fail2ban # cat action.d/sendmail-whois-lines.local | grep -v #
[Definition]
actionstart = 
actionstop = 
actioncheck = 
actionban = printf %%b "Subject: [Fail2Ban] <name>: banned <ip>
            Date: `LC_TIME=C date -u +"%%a, %%d %%h %%Y %%T +0000"`
            From: Fail2Ban <<sender>>
            To: <dest>\n
            Hi,\n
            The IP <ip> has just been banned by Fail2Ban after
            <failures> attempts against <name>.\n\n
            Here are more information about <ip>:\n
            `/usr/bin/whois <ip>`\n\n
            Lines containing IP:<ip> in <logpath>\n
            `grep '\<<ip>\>' <logpath>`\n\n
            Regards,\n
            Fail2Ban" | /usr/sbin/sendmail -f <sender> <dest>
actionunban = 
[Init]
name = default
dest = root
sender = fail2ban
logpath = /dev/null

2. Как это работает

Просмотр лог-файлов предельно понятно иллюстрирует механизм работы вышеописанной конфигурации. Например, рассмотрим забаненный jail'ом exim-spam IP-адрес 201.216.207.25.

root@beta:/usr/local/etc/fail2ban # head /etc/hosts.allow
exim: 201.216.207.25: twist /bin/echo "Your host %h was temporarily banned"
exim: 93.168.34.187: twist /bin/echo "Your host %h was temporarily banned"
all: 178.46.186.150: twist /bin/echo "Your host %h was temporarily banned"
all: 119.226.100.222: twist /bin/echo "Your host %h was temporarily banned"
all: 178.152.20.249: twist /bin/echo "Your host %h was temporarily banned"
#
# hosts.allow access control file for "tcp wrapped" applications.
# $FreeBSD: releng/10.3/etc/hosts.allow 161710 2006-08-29 09:20:48Z ru $
#
# NOTE: The hosts.deny file is deprecated.

Вот предшествовашие этому действию данные, которые были обнаружены fail2ban.

root@beta:/usr/local/etc/fail2ban # cat /var/log/fail2ban.log | grep 201.216.207.2
2016-07-28 22:49:18,756 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-28 22:49:18,757 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-28 22:49:30,270 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-28 22:49:35,493 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-29 18:16:04,517 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-29 18:16:05,614 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-29 18:16:05,618 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-29 18:22:08,940 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-29 18:22:14,140 fail2ban.filter         [1212]: INFO    [exim-tcpwrapper] Found 201.216.207.25
2016-07-29 18:22:15,153 fail2ban.actions        [1212]: NOTICE  [exim-tcpwrapper] Ban 201.216.207.25

Лог Exim открывает нам причину срабатывания - это действительно попытка рассылки спама.

root@beta:/usr/local/etc/fail2ban # cat /var/log/maillog | grep 201.216.207.25
Jul 29 18:16:03 beta exim[27912]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<umbilicusesbe02@hotmail.com> temporarily rejected RCPT <adm@my.server>: Processing service message, try again later
Jul 29 18:16:03 beta exim[27912]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<umbilicusesbe02@hotmail.com> temporarily rejected RCPT <admi@my.server>: Processing service message, try again later
Jul 29 18:16:03 beta exim[27912]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<umbilicusesbe02@hotmail.com> temporarily rejected RCPT <admin@my.server>: Processing service message, try again later
Jul 29 18:16:03 beta exim[27912]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<umbilicusesbe02@hotmail.com> temporarily rejected RCPT <alex@my.server>: Processing service message, try again later
Jul 29 18:16:03 beta exim[27912]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<umbilicusesbe02@hotmail.com> temporarily rejected RCPT <alexeev@my.server>: Processing service message, try again later
Jul 29 18:16:03 beta exim[27912]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<umbilicusesbe02@hotmail.com> temporarily rejected RCPT <arina@my.server>: Processing service message, try again later
Jul 29 18:16:03 beta exim[27912]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<umbilicusesbe02@hotmail.com> temporarily rejected RCPT <arkadiy@my.server>: Processing service message, try again later
Jul 29 18:16:03 beta exim[27912]: SMTP connection from (customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 lost while reading message data (header)
Jul 29 18:16:04 beta exim[27913]: Delay 45s for  [201.216.207.25] with HELO=customer-static-201-216-207.25.iplannetworks.net. Mail from totestb751@gmail.com to filarina@my.server has 90 SPAM score - DNSBL(50) host is blacklisted by cbl.abuseat.org list; SPFSOFL(20) SPF record can't absolutely confirm that senders host authorized to send mail from queried domain; HLNOTHST(20) HELO does not point to host address;
Jul 29 18:16:05 beta exim[27913]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 sender verify fail for <totestb751@gmail.com>: response to "RCPT TO:<totestb751@gmail.com>" from gmail-smtp-in.l.google.com [173.194.65.27] was: 550-5.1.1 The email account that you tried to reach does not exist. Please try\n550-5.1.1 double-checking the recipient's email address for typos or\n550-5.1.1 unnecessary spaces. Learn more at\n550 5.1.1  https://support.google.com/mail/answer/6596 204si4117288wmk.76 - gsmtp
Jul 29 18:16:05 beta exim[27913]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<totestb751@gmail.com> rejected RCPT <filarina@my.server>: Sender verify failed
Jul 29 18:16:05 beta exim[27913]: Delay 45s for  [201.216.207.25] with HELO=customer-static-201-216-207.25.iplannetworks.net. Mail from totestb751@gmail.com to info@my.server has 90 SPAM score - DNSBL(50) host is blacklisted by cbl.abuseat.org list; SPFSOFL(20) SPF record can't absolutely confirm that senders host authorized to send mail from queried domain; HLNOTHST(20) HELO does not point to host address;
Jul 29 18:16:05 beta exim[27913]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 sender verify fail for <totestb751@gmail.com>
Jul 29 18:16:05 beta exim[27913]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<totestb751@gmail.com> rejected RCPT <info@my.server>: Sender verify failed
Jul 29 18:16:05 beta exim[27913]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<totestb751@gmail.com> rejected RCPT <mxm@my.server>: Too many unknown recipients found
Jul 29 18:16:05 beta exim[27913]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<totestb751@gmail.com> rejected RCPT <rapeenud@my.server>: Too many unknown recipients found
Jul 29 18:16:05 beta exim[27913]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<totestb751@gmail.com> rejected RCPT <sales@my.server>: Too many unknown recipients found
Jul 29 18:16:05 beta exim[27913]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<totestb751@gmail.com> rejected RCPT <service@my.server>: Too many unknown recipients found
Jul 29 18:16:05 beta exim[27913]: unexpected disconnection while reading SMTP command from (customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25
Jul 29 18:22:08 beta exim[28010]: Delay 35s for  [201.216.207.25] with HELO=customer-static-201-216-207.25.iplannetworks.net. Mail from fleeciestwf@smtp.ru to fax@my.server has 70 SPAM score - DNSBL(50) host is blacklisted by cbl.abuseat.org list; HLNOTHST(20) HELO does not point to host address;
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <adm@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <admi@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <admin@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <alex@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <alexeev@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <arina@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <arkadiy@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <enduser@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<excusingi0@hotmail.com> temporarily rejected RCPT <er@my.server>: Processing service message, try again later
Jul 29 18:22:08 beta exim[28009]: SMTP connection from (customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 lost while reading message data (header)
Jul 29 18:22:13 beta exim[28010]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 sender verify fail for <fleeciestwf@smtp.ru>: response to "RCPT TO:<fleeciestwf@smtp.ru>" from mx.qip.ru [185.79.118.151] was: 550 No such user
Jul 29 18:22:13 beta exim[28010]: H=(customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25 F=<fleeciestwf@smtp.ru> rejected RCPT <fax@my.server>: Sender verify failed
Jul 29 18:22:14 beta exim[28010]: unexpected disconnection while reading SMTP command from (customer-static-201-216-207.25.iplannetworks.net) [201.216.207.25] I=[10.10.10.10]:25
Jul 29 18:28:13 beta exim[28082]: twist 201.216.207.25 to /bin/echo "Your host 201.216.207.25 was temporarily banned"

Последняя строка листинга показывает строку, котороую получил злоумышленник при попытке подключиться к SMTP-серверу после бана.

Всё работает, враги ловятся. И никаких firewall'ов!

3. Ротация логов

Полезно также будет добавить ротацию лог-файлов самого fail2ban. Ввиду его особенностей для этого следует использовать специальную управляющую утилиту fail2ban-client вызываемую из shell-файла.

root@beta:/usr/local/etc/fail2ban # ll f2b-newlog.sh
-rwxr-xr-x  1 root  wheel  89  1 дек  2014 f2b-newlog.sh*
root@beta:/usr/local/etc/fail2ban # cat f2b-newlog.sh
#!/bin/sh
/usr/local/bin/fail2ban-client set logtarget /var/log/fail2ban.log >/dev/null
root@beta:/usr/local/etc/fail2ban # cat /usr/local/etc/newsyslog.conf.d/my.server | grep f2b
/var/log/fail2ban.log                           640     4       *       $W1D0   JR /usr/local/etc/fail2ban/f2b-newlog.sh

4. PROFIT!

Статья была полезной? Тогда прошу не стесняться и деньгами или биткоинами.


Buy Bitcoin at CEX.IO