Инструменти за анализ и статистика на Postfix мейл сървъра в bash среда
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 може да се направи само на определени сайтове чрез менюто:
Здравейте, много ми хареса скриптът на Mail-logcolor как мога да го направя, за да покажа целия syslog?