Postfix – automatically drop outbound mail

I have development server with postfix – I wanted to allow outbound traffic to one domain but cut off all the rest. I definitely do not want that test mail or any debug info goes to service users.

I have to add something like that to /etc/postfix/transport:

allowed.domain.com :
* discard:

Then run:

postmap /etc/postfix/transport

At end, add these to /etc/postfix/main.cf:

transport_maps = hash:/etc/postfix/transport

Reload postfix:

postfix reload

Test if it works:

echo test | mail -s test whatever@whatever.com

You should see in logs that message was dropped:

Mar 18 21:14:28 devmx1 postfix/cleanup[29968]: 1E77654391: message-id=20140318211428.1E77280521@domain.com>
Mar 18 21:14:28 devmx1 postfix/qmgr[28282]: 1E77654391: from=<root@domain.com>, size=431, nrcpt=1 (queue active)
Mar 18 21:14:28 devmx1 postfix/discard[29970]: 1E77654391: to=<whatever@whatever.com>, relay=none, delay=0.1, delays=0.09/0.01/0/0, dsn=2.0.0, status=sent (whatever.com)
Mar 18 21:14:28 devmx1 postfix/qmgr[28282]: 1E77654391: removed

Postfix: ciekawy problem z smtpd_delay_reject i permit_sasl_authenticated

Trafił mi się ostatnio ciekawy problem – otóż standardowo przed końcem roku poprawiałem filtry antyspamowe i optymalizowałem konfigurację Postfix’a. Chciałem zmienić domyślną wartość smtpd_delay_reject=yes na smtpd_delay_reject=no by odrzucać spamerów najwcześniej jak to możliwe. I ciekawe kuku, które sobie zrobiłem polegało na tym że sam nie mogłem wysyłać poczty po logowaniu SSL’em…

Dostawałem przy tym bardzo wymowną odpowiedź:

Oct  8 16:30:39 tyr postfix/smtpd[21039]: NOQUEUE: reject: CONNECT from unknown[67.x.x.x]: 554 5.7.1 : Client host rejected: Access denied; proto=SMTP

Więc wrzuciłem debug_peer_list = 67.x.x.x do main.cf by zobaczyć dokładniej o co biega:

Oct  8 16:47:49 tyr postfix/smtpd[23899]: >>> START Client host RESTRICTIONS < <<
Oct  8 16:47:49 tyr postfix/smtpd[23899]: generic_checks: name=permit_sasl_authenticated
Oct  8 16:47:49 tyr postfix/smtpd[23899]: generic_checks: name=permit_sasl_authenticated status=0
Oct  8 16:47:49 tyr postfix/smtpd[23899]: generic_checks: name=reject
Oct  8 16:47:49 tyr postfix/smtpd[23899]: NOQUEUE: reject: CONNECT from unknown[67.x.x.x]: 554 5.7.1 : Client host rejected: Access denied; proto=SMTP
Oct  8 16:47:49 tyr postfix/smtpd[23899]: generic_checks: name=reject status=2
Oct  8 16:47:49 tyr postfix/smtpd[23899]: > unknown[67.x.x.x]: 554 5.7.1 : Client host rejected: Access denied
Oct  8 16:47:49 tyr postfix/smtpd[23899]: watchdog_pat: 0xb82c67f8
Oct  8 16:47:53 tyr postfix/smtpd[23899]: < unknown[67.x.x.x]: QUIT
Oct  8 16:47:53 tyr postfix/smtpd[23899]: > unknown[67.x.x.x]: 221 2.0.0 Bye

generic_checks: name=permit_sasl_authenticated status=0 sugeruje że autoryzacja jest ok, a chwile później reject. Sprawdziłem konfigurację SASL’a (z dovecot’a) i zaczynałem bezskutecznie komentować kolejne linie w main.cf. Jaja polegały na tym że po ustawieniu smtpd_delay_reject=yes wszystko wracało do normy… Ale nie chciałem tego tak zostawić.
Olśniło mnie dopiero po chwili – przecież połączenia SSL SMTP odbywają się na inny port – zdefiniowany w master.cf – może coś tam bruździ. A tutaj od razu rzuciła mi się w oczy różnica w konfiguracji dla usługi submission i ssmtp:

submission inet n       -       -       -       -       smtpd
  ...
  -o smtpd_sender_restrictions=reject_sender_login_mismatch,permit_sasl_authenticated,reject
  ...

smtps     inet  n       -       -       -       -       smtpd
  ...
    -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  ...

Submission ustawiałem niedawno i widocznie trafiłem na lepszego FAQ’a 🙂 Wygląda na to że sprawdzanie autoryzacji SASL w smtpd_client_restrictions odbywało się w tym przypadku zanim klient się autoryzował (albo było jakieś lekkie opóźnienie). Zamiana smtpd_client_restrictions na smtpd_sender_restrictions załatwiło sprawę. Przy okazji zauważyłem że po SSL’u można było spooflować innych użytkowników co również postanowiłem szybko naprawić. A wszystko dlatego że zachciało mi się “wczesnych optymalizacji” i chciałem w tych usługach pominąć część checków, które mam w main.cf.

W minimalnej wersji konfiguracja w master.cf powinna wyglądać tak:

submission inet n       -       -       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_auth_only = yes
  -o smtpd_sasl_auth_enable=yes
smtps     inet  n       -       -       -       -       smtpd
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes

P.S. Znalazłem potencjalnego winnego – w dokumentacji dovecot’a wykorzystano smtpd_client_restrictions: http://wiki2.dovecot.org/HowTo/PostfixAndDovecotSASL

pflogsumm – statystyki poczty dla postfix’a

Jeżeli administrujesz nawet niedużym serwerem pocztowym na pewno masz świadomość, że nie jesteś w stanie monitorować logów na bieżąco. Ciężko jest wyłapać np. problem w komunikacji z pewną domeną. Ciężko też oszacować skalę ruchu na serwerze zarówno pod kątem ilości jak i wolumenu maili. Trudno wybrać domeny, dla których warto by zrezygnować z greylistingu, itd, itp…

Na szczęście dostępne jest narzędzie pflogsumm, które wygeneruje nam dość wyczerpujące statystyki z logów postfix’a. Bardzo przydatne przy codziennym przeglądzie “stanu zdrowia” serwera pocztowego.

Przykładowy wycinek statystyk z pewnego małego serwerka prezentuje się tak:

Postfix log summaries for Jul  4

Grand Totals
------------
messages

   1158   received
   1261   delivered
      0   forwarded
      5   deferred  (50  deferrals)
      2   bounced
    392   rejected (23%)
      0   reject warnings
      0   held
      0   discarded (0%)

 164898k  bytes received
 242985k  bytes delivered
    201   senders
     77   sending hosts/domains
    354   recipients
     51   recipient hosts/domains

Per-Hour Traffic Summary
    time          received  delivered   deferred    bounced     rejected
    --------------------------------------------------------------------
    0000-0100          26         28          2          0          7
    0100-0200          14         18          3          0         10
    0200-0300           4          4          1          0          8
    0300-0400           6          6          1          0          8
    0400-0500           4          4          0          0          8
    0500-0600           2          2          1          0          9
    0600-0700           8          8          1          0          9
    0700-0800          16         18          1          0         10
    0800-0900          58         60          1          0          8
    0900-1000         104        110          5          0         17
    1000-1100         132        152          2          0         18
    1100-1200         106        106          1          0         31
    1200-1300          64         70          2          0          9
    1300-1400         112        132          2          0         14
    1400-1500          98        106          1          0         78
    1500-1600          86         88          2          0         32
    1600-1700          56         56          3          0         23
    1700-1800          58         77          5          2         19
    1800-1900          36         36          3          0         16
    1900-2000          26         26          2          0         24
    2000-2100          48         50          3          0          9
    2100-2200          32         42          2          0         10
    2200-2300          34         34          3          0         10
    2300-2400          28         28          3          0          5
...

Host/Domain Summary: Message Delivery
 sent cnt  bytes   defers   avg dly max dly host/domain
 -------- -------  -------  ------- ------- -----------
    132     5688k       0     1.7 s   11.0 s  gmail.com
    104     2633k       0     4.6 s    2.8 m  wp.pl
     68     1525k       0     1.3 s    9.4 s  interia.pl
     42      744k      21     1.1 s   83.6 h  o2.pl
     30    89891        0     0.7 s    2.6 s  op.pl
     29     6677k       1    16.1 s    7.4 m  poczta.onet.pl
     26      540k       0     1.9 s    6.7 s  poczta.fm
...

Host/Domain Summary: Messages Received
 msg cnt   bytes   host/domain
 -------- -------  -----------
     50     4142k  gmail.com
     46   491259   facebookmail.com
     38     1446k  wp.pl
     22    13520k  interia.pl
     14      675k  o2.pl
     10   105377   poczta.fm
     10    57713   hotmail.com
... i dużo więcej...

Instalacja na Debianie:

apt-get install pflogsumm

Testowo polecenie można uruchomić w następujący sposób:

sudo pflogsumm -i -d yesterday /var/log/mail.log /var/log/mail.log.1

W moim przypadku, logi przewijam codziennie ok 2:00 w nocy, dlatego podaję dwie ścieżki do plików log (bieżącego i wczorajszego) by mi te dwie godzinki nie umknęły 😉

Powyższe polecenie wypisze na standardowe wyjście statystyki w postaci ładnie sformatowanych tekstowych tabel. Warto przyjrzeć się innym parametrom polecenia – można dzięki nim zrezygnować ze statystyk, które nas nie interesują, bądź zmienić domyślną kolejność.

Teraz warto uruchomić okresowe raportowanie. Edytujemy crona:

sudo crontab -e

Na generowanie statystyk warto wybrać godzinę mniejszego obciążenia serwera (@daily oznacza północ), bo proces ich przygotowania dość mocno obciąży CPU. Wpisujemy polecenie wraz z interesującymi nas parametrami:

@daily /usr/sbin/pflogsumm -i --problems_first --no_bounce_detail \
         --no_deferral_detail -d yesterday \
         /var/log/mail.log /var/log/mail.log.1 | \
         mail -e -s "Statystyki poczty na `uname -n`" postmaster

Kolejnego dnia powinniśmy otrzymać nasze statystyki.