Postfix mail tools in bash

Инструменти за анализ и статистика на Postfix мейл сървъра в bash среда

Postfix е вече може би най изпозлвания пощенски сървър в Интернет. Създаден да бъде алтернатива на Sendmail той отнавна мина опонента си. За Postfix има всякаква документация от рода на как да го инсталираме (ако вече не е инсталиран), как да го конфигурираме ако това също не е направено. Но търсенето на проблеми и въобще наблюдението на сървъра на по ниско ниво е слабо документирано. С времето събрах набор от команди, трикчета и скриптове които да улесняват процеса по търсене на определен проблем в пощенския сървър и по специално в ISPconfig платформата.

Send message

Изпращане на мейл директно от терминал

echo "Message Body" | mail -s "Message Subject" support@itservice-bg.net

Mail log

Следене на лога в реално време

sudo tail -f /var/log/mail.log

Mail log color

Преглеждайки в реално време логовете на мейл сървъра postfix редовете вървят много бързо и често са еднообразни, а малко да са ми уморени очите и не мога да проследя информацията която ме интересува. Затова сглобих малко скриптче което оцветява най важните параметри които ми подзказват къде да гледам с което става доста по интуитуитивен самият процес.

#!/bin/bash
 
shopt -s expand_aliases
alias grey-grep="GREP_COLOR='1;30' grep -E --color=always --line-buffered"
alias red-grep="GREP_COLOR='1;31' grep -E --color=always --line-buffered"
alias green-grep="GREP_COLOR='1;32' grep -E --color=always --line-buffered"
alias yellow-grep="GREP_COLOR='1;33' grep -E --color=always --line-buffered"
alias cyan-grep="GREP_COLOR='1;36' grep -E --color=always --line-buffered"
 
tail -f -n 100 /var/log/mail.log | \
grey-grep -w "postfix|dovecot|$" | \
red-grep -w "unknown|lost|Aborted|disconnect|Disconnected|reject|denied|rejected|timeout|NOQUEUE|discarded|spam|failed|error|RCPT|$" | \
green-grep -w "done|Ok|sent|relay|delay|queued|queue|active|delays|dsn|$" | \
yellow-grep -w "Login:|connect|user|from|to|$" | \
cyan-grep -w "imap-login|pop3-login|smtpd|smtp|qmgr|cleanup$"

Оцветяването на ключови думи в един цвят обаче може да се осъществи и с командата egrep.

egrep '(reject|warning|error|fatal|panic):' /var/log/mail.log

Mail queue

Показва опашката с неизпратени писма

sudo mailq

На горната картинка подчертаното с червено е уникален идентификатор на писмото. С програмата postcat може да се прегледа съдържанието на писмото. В много случаи да не кажа в повечето съдържанието е криптирано но за един системен администратор часта “header” е по важна от часта “body”. В “хедъра” се съдържа информация от кой, за кой е писмото, сървъра от който пристига и много други неща.

postcat -vq 336B22E045C6

Изтрива опашката с неизпратени писма

sudo postsuper -d ALL

Mail statistic

Показва всички пощенски кутии от които са пристигнали писма и броя им

sudo grep 'from=<' /var/log/mail.log | grep 'qmgr' | awk '{print $7}' | sed -r 's/^.*=<(.*?)>.*$/\1/' | sort | uniq -c | sort -n

Показва всички изпращачи от лога и броя писма

grep "status=sent" /var/log/mail.log |cut -d "=" -f 2 |cut -d ">" -f 1 |cut -d "<" -f 2 | sort | uniq -c | sort -n

Показва дните в лога

sudo cat /var/log/mail.log | awk '{print $1,$2}' | uniq

Този адрес изпращал ли е писмо

sudo grep 'from=<support@itservice-bg.net>' /var/log/mail.log

Този адрес изпращал ли е писмо на другия адрес

sudo grep 'from=<support@itservice-bg.net>' /var/log/mail.log | grep 'to=<office@itservice-bg.net>' /var/log/mail.log

pflogsumm

pflogsumm е написан, за да предостави анализ на пощенския сървър postfix, с подробната си статистика той показва пълна картина на системния администратор за мейл трафика в съвръра. pflogsumm е един от инструментите които показват зараждането на потенциални проблеми.

Инсталиране на pflogsumm

sudo apt-get install pflogsumm

Детайлна статистика с програмата pflogsumm на postfix сървъра

sudo pflogsumm /var/log/mail.log

Подробна статистика за изпращачи и получатели на писма

sudo pflogsumm -e /var/log/mail.log

Изпраща статистиска чрез cron на всеки 24 часа от мейл сървъра
Отваряме конфигурациония файл sudo nano /etc/crontab и добавяме в него:

59 23  * * *   root pflogsumm -d today /var/log/mail.log | mail -s "pflogsumm itservice" robot@telehost.bg

След което рестартираме cron демона

sudo systemctl restart cron.service

delete Trash, Junk, Spam, Low

Малък скрипт за изтриване принудително на съдържанието в директориите Trash, Junk, Spam и Low на всички потребители в postfix сървъра.

#!/bin/bash
 
MAILDIRS=$(find /var/vmail/*/*/Maildir/ -maxdepth 0 -type d)
for basedir in $MAILDIRS; do
  for dir in .Trash .Junk .Spam .Low\ Priority; do
    for dir2 in cur new; do
      [ -e "$basedir/$dir/$dir2" ] && (
        echo "Processing $basedir/$dir/$dir2..."
        find "$basedir/$dir/$dir2/" -type f -mtime +30 -delete
      )
    done
  done
done
}

pflogrep — Postfix log grep complete activity

Когато за определена пощенска кутия ми трябва подробен анализ и статистика, използвам един малък скрипт на Пърл с име pflogrep

#!/usr/bin/perl
 
use Getopt::Long;
 
($me = $0) =~ s%.*/%%;
 
$Usage = "
$me [-i] [-s] [-v] PATTERN [FILE]....
  -i  -- ignore case distinctions when matching
  -s  -- add separator between messages
  -v  -- selected lines are those not matching
Examples:
  $me info\@example.com mail.log | pflogsumm
  $me example.com mail.log | grep -e from= -e to= | grep --color -P \\<.*\\>\\|status
";
 
die $Usage unless &GetOptions( 'i', 's', 'v' ) && (@ARGV >= 1 );
 
my $ptn = shift;
my $regex = ( $opt_i ) ?  qr/$ptn/io : qr/$ptn/o;
my %P;
my $found = 0;
 
$exstat = 1;
$|++;
 
sub checkMatch() {
    my $q = shift;
    my $matches = $P{$q} =~ $regex;
    if ( ($matches && !$opt_v) || (!$matches && $opt_v)) {
        print $P{$q};
        print '-' x 50, "\n" if $opt_s;
        $found++;
    }
    undef $P{$q};
}
 
sub handleStream() {
    my $fh = shift;
 
    while (<$fh>) {
        next unless /: (([0-9A-Zb-z]{10,15})|NOQUEUE)/;
        $q = $1;
        $P{$q} .= $_;
        if (/: (removed$|milter-reject:)/ || $q eq 'NOQUEUE') {
            &checkMatch($q);
        }
    }
    foreach my $q (keys %P) {
        &checkMatch($q);
    }
    return $found;
}
 
if (@ARGV==0) {
    $exstat = 0 if &handleStream(\*STDIN);
    exit( $exstat );
}
 
for $f ( @ARGV ) {
    unless ( open( INP, '<', $f )) {
        warn "Unable to open input file $f: $!\n";
        next;
    }
    $exstat = 0 if &handleStream(\*INP);
    close INP;
}
exit( $exstat );

Филтрира определена пощенска кутия и в комбинация с pflogsumm прави анализ и статистика само за нея

sudo ./pflogrep.pl support@itservice-bg.net /var/log/mail.log | pflogsumm

Оцветява определени низове в случая “from=”, “to=” и “status”

sudo ./pflogrep.pl support@itservice-bg.net /var/log/mail.log | grep -e from= -e to= | grep --color -P \<.*\>\|status

Maillog perl script

Също много добър помощник ми е друг скрипт на perl:
https://github.com/SokoloffA/maillog/blob/master/maillog.pl

sudo chmod 755 maillog.pl

Получени писма от този ден към тази пощенска кутия

sudo ./maillog.pl -d 08/10/2017 -t support@itservice-bg.net

Изпратени писма от този ден от тази пощенска кутия

sudo ./maillog.pl -d 09/10/2017 -f support@itservice-bg.net

Read mailbox with Mutt

Четене на пощенска кутия с mutt

sudo apt-get install mutt

Създаваме конфигурационен файл с nano .muttrc

set mbox_type=Maildir
set folder="/var/vmail/itservice-bg.net/support/Maildir"
set mask="!^\\.[^.]"
set mbox="/var/vmail/itservice-bg.net/support/Maildir"
set record="+.Sent"
set postponed="+.Drafts"
set spoolfile="//var/vmail/itservice-bg.net/support/Maildir"

Стартираме mutt

Sudo mutt

Roundcube

Неуспешни опити за логване

sudo cat /var/log/roundcube/errors | grep failed | awk '{print $1,$2,$6,$7,$9,$11}'

Изпратени през Roundcube

cat /var/log/roundcube/sendmail | awk '{print $1,$2,$5,$6,$7,$8,$9}'

Регистрирани посещения на браузъри през лога на Apache

cat /var/log/apache2/other_vhosts_access.log | grep roundcube

Спам чрез crontab от web

Не е лошо от време на време да се преглежда auth.log за да се види какви команди се изпълняват в сървъра. От няколкостотин редове попадам на този:

sudo tail -f /var/log/auth.log
Mar 11 14:30:01 host CRON[10977]: pam_unix(cron:session): session opened for user web119

Чудно потребителя web119 каква заявка е пуснал в крон-а (проверявам със следната команда)

sudo crontab -u web149 -e

О, ужас, някой си е вкарал компилиран изпълним файл на perl в /var/tmp и си го стартира на всеки 10 минути като на практика ръси спам.

След като изтрием реда в crontab и файла в /var/tmp/ трябва да рестартираме и демона cron:

за Ubuntu 14.04 или по малка версия.

sudo service cron restart

За Ubuntu 16.04 версия и нагоре.

sudo systemctl restart cron.service

Спам чрез php.ini от web

Някой сайтове (основно неподържани или създадени от аматьори) бълват невероятно количество спам, чрез функцията mail на езика php. Това разбира се може да се спре със забрана на самата функция от конфигурациония файл php.ini

За версия 5 на PHP

sudo vim /etc/php5/apache2/php.ini

За версия 7 на PHP

sudo vim /etc/php/7.0/apache2/php.ini

Намерете disable_functions = и добавете mail

disable_functions = mail

След което web сървъра трябва да се рестартира.

Ако ползвате ISPconfig може да се направи само на определени сайтове чрез менюто:

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.