Всем спасибо за помощь.
Решил простеньким скриптом на Perl (честно взятым на просторах Интернет
и переделанным под мои потребности), который запускается по расписанию и
добавляет в таблицу pf провинившиеся IP.
Может кому будет полезно ...
#!/usr/local/bin/perl
use strict;
use warnings;
# Options to set up here.
#
# $conf is where to store the current state file.
# $maillog is the latest Exim main log.
my $conf = "/var/spool/exim/mainlog-state";
my $mainlog = "/var/log/exim/mainlog";
my $seek = 0;
my $inode = inode_number($mainlog);
my $cantseek = 0;
if (-r $conf) {
open CONF, "< $conf";
while (<CONF>) {
chomp;
s/^\s*//;
s/\s*$//;
next if /^$/;
if (/^inode=(\d+)$/) {
$inode = $1;
}
if (/^seek=(.*)$/) {
$seek = $1;
}
}
close CONF;
}
my @ips = ();
# see if we can seek to current position in the mainlog. If not, then
# it has most likely been rotated
open LOG, "< $mainlog" or die "cannot open exim log file $mainlog!";
if (!seek(LOG, $seek, 0)) {
$cantseek = 1;
}
close LOG;
if ($inode != inode_number($mainlog) or $cantseek) {
$inode = inode_number($mainlog);
$seek = 0;
}
$seek = read_log($mainlog, $seek, \@ips);
# output
if (@ips) {
@ips = uniq(@ips);
foreach my $ip (@ips) {
`/sbin/pfctl -t blocksmtp -T add $ip > /dev/null 2>&1`;
}
}
# create config file
open CONF, "> $conf";
print CONF "inode=$inode\n";
print CONF "seek=$seek\n";
close CONF;
exit;
sub inode_number
{
my $file = shift;
my ($dummy, $inode) = stat($file);
return $inode;
}
sub read_log
{
my ($file, $seek, $stats) = @_;
my $prevline = undef;
my $line;
my ($prevpos, $pos);
local *LOG;
open LOG, "< $file" or die "cannot open exim log file $file!";
if (!seek(LOG, $seek, 0)) {
close LOG;
return $seek;
}
while ($line = <LOG>) {
if (defined $prevline) {
if ($line =~ m/\[(.*)\] AUTH command used when not advertised/) {
push @ips, $1;
}
}
$prevline = $line;
$prevpos = $pos;
$pos = tell LOG;
}
close LOG;
$prevpos = $seek unless defined $prevpos;
return $prevpos;
}
sub uniq {
my %seen;
grep !$seen{$_}++, @_;
}
25.09.2018 11:21, Vladimir Sharun пишет:
Привет,
Это syntax error - я не думаю, что оно будет отсвечивать где-то в ACL.
Как вместо RCPT написать RPCT.
/25 вересня 2018, 11:19:55, від "Mikhail Golub" <[email protected]
<mailto:[email protected]>>:/
Спасибо.
Я как-то раньше задавался этим вопросом, но ответа не нашел.
Искал в англоязычной рассылке - там тоже предлагали парсить логи,
использовать fail2ban ...
Хотелось попроще.
Описанный вариант (run shell) работает уже для некоторых правил.
Вариант с SQL - вариант. Но ...
"Лучше уж сделать кондишн с sql запросом, который положит нужный
ip/дату_время в базу" - вопрос тот же - где этот конфишн (в каком acl)
разместить?
25.09.2018 11:00, Vladimir Sharun пишет:
> Привет,
>
> tail на логи и ловить/парсить нужную строку.
>
> Ты не попадёшь ни в один из ACL'ей, потому что это кейс - syntax error:
>
https://www.exim.org/exim-html-current/doc/html/spec_html/ch-smtp_authentication.html
> *If the connection is not using extended SMTP (that is, HELO was used
> rather than EHLO), the use of AUTH= is a syntax error.*
>
> И да, вариант с run shell - это перебор. Лучше уж сделать кондишн с sql
> запросом, который положит нужный ip/дату_время в базу, а внешний скрипт
> раз в секунду поллит изменения в таблице - забирает оттуда новеньких и
> пушит в файрвольную таблицу новый айтем. Держать в базе также полезно,
> потому что у тебя всегда есть доказательства, когда какой хост накосячил.
>
> У нас таких странных на 12 часов в бан, потом бан снимается до след.
> инцидента.
>
> /25 вересня 2018, 09:11:52, від "Mikhail Golub" <[email protected] <mailto:[email protected]>
> <mailto:[email protected]>>:/
>
> Доброго времени суток.
>
> Подскажите, пожалуйста, где (в каких acl) отловить события чтобы их
> заблокировать (событие указано ниже)?
>
> Exim собран без авторизации:
> Exim version 4.91 #3 (FreeBSD 11.2) built 27-Aug-2018 11:58:37
> Copyright (c) University of Cambridge,1995 - 2018
> (c) The Exim Maintainers and contributors in ACKNOWLEDGMENTS file,2007
> -2018
> Probably Berkeley DB version 1.8x (native mode)
> Support for: iconv() use_setclassresources Expand_dlfunc OpenSSL PRDR
> Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm
> dbmjz dbmnz dnsdb dsearch passwd
> Authenticators:
> Routers: accept dnslookup ipliteral manualroute queryprogram redirect
> Transports: appendfile/mbx autoreply pipe smtp
> Fixed never_users: 0
> Configure owner: 0:0
> Size of off_t: 8
> Configuration file is /usr/local/etc/exim/configure
>
>
> Подобные коннекты напрягают (не мешают, но лог забивают):
> 2018-09-25 05:04:18 SMTP connection from [182.38.95.137] (TCP/IP
> connection count = 1)
> 2018-09-25 05:04:19 SMTP protocol error in "AUTH LOGIN"
> H=(vcuawmzrqq.com) [182.38.95.137] AUTH command used when not
advertised
> 2018-09-25 05:04:20 SMTP connection from (vcuawmzrqq.com)
> [182.38.95.137] lost D=1s
>
>
> Хочу через такое правило добавлять хост в таблицу firewall-а:
> continue = ${run{SHELL -c "/usr/local/bin/sudo -u root /sbin/pfctl -t
> blocksmtp -T add $sender_host_address"}}
>
> Но в какой ACL его добавить ..?
>
>
>
> _______________________________________________
> Exim-users mailing list
> [email protected] <mailto:[email protected]>
<mailto:[email protected]>
> http://mailground.net/mailman/listinfo/exim-users
>
>
>
> _______________________________________________
> Exim-users mailing list
> [email protected] <mailto:[email protected]>
> http://mailground.net/mailman/listinfo/exim-users
>
_______________________________________________
Exim-users mailing list
[email protected] <mailto:[email protected]>
http://mailground.net/mailman/listinfo/exim-users
_______________________________________________
Exim-users mailing list
[email protected]
http://mailground.net/mailman/listinfo/exim-users
_______________________________________________
Exim-users mailing list
[email protected]
http://mailground.net/mailman/listinfo/exim-users