Configurazione di qmail

23 novembre 2015 Roberto Puzzanghera0 commenti

Creazione dei file alias e control

echo 3 > /var/qmail/control/spfbehavior
echo "| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox" > /var/qmail/control/defaultdelivery
echo 20 > /var/qmail/control/concurrencyincoming
echo postmaster@yourdomain.net > /var/qmail/control/bouncefrom
echo 20000000 > /var/qmail/control/databytes
echo yourdomain.net > /var/qmail/control/doublebouncehost
echo postmaster > /var/qmail/control/doublebounceto
echo 272800 > /var/qmail/control/queuelifetime
echo 30000000 > /var/qmail/control/softlimit
echo 100 > /var/qmail/control/maxrcpt
 
cd /usr/local/src/netqmail-1.06
./config-fast yourdomain.net

L'ultimo comando riempie i file defaultdomain  locals  me  plusdomain  rcpthosts.

  • defaultdomain quando si hanno diversi domini nello stesso server (definiti poi nel file virtualhost) questo è il dominio di default
  • locals i domini le cui spedizioni vengono effettuate nel presente server (qmail-send per mezzo del programma qmail-lspawn). I messaggi per gli altri domini sono gestiti dal programma qmail-rspawn e spediti ad altre MTA.
  • me il nome del server. Questo è il nome a dominio che compare nel campo from quando si ricevono messaggi di sistema, ad esempio.
  • plusdomain qmail-inject aggiunge questo dominio a ogni host name che finisce con un segno "+"
  • rcpthost Domini per i quali accettiamo messaggi. Più tardi vedremo come simscan/chkuser rigetteranno le emails per gli utenti non esistenti.
  • spfbehavior riguarda  la patch spf.
  • softlimit imposta il soft resource limits per qmail-smtpd
  • databytes è il numero massimo di bytes in un messaggio (0=nessun limite).
  • doublebounceto è la casella a cui vengono indirizzati i messaggi che rientrano per la seconda volta (double bounce). Se si sta usando la mia patch combinata è possibile cancellare questi messaggi prima che intasino la coda,  inserendo una riga binaca all'inizio di questo file.

defaultdelivery è il file .qmail di default. Dice a qmail come recapitare il messaggio. Nel caso non si abbia ancora ben chiaro come funziona il delivery, è meglio leggere il capitolo sul relaying di Life with qmail e soprattutto il file README.vdelivermail che si trova nel pacchetto vpopmail, che spiega come sono usati i file .qmail.

E' possibile trovare una presentazione completa di tutti i file di configurazione sul libro Life with qmail qui http://www.lifewithqmail.org/lwq.html#configuration

Ora facciamo il setup dell'indirizzo email di amministrazione del server. Questo indirizzo riceverà le email per root, postmaster, e mailer-daemon.  Sositituire "postmaster@yourdomain.net" con l'indirizzo email dell'amministratore (postmaster):

cd /var/qmail/alias
echo "postmaster@yourdomain.net" > .qmail-postmaster
ln -s .qmail-postmaster .qmail-mailer-daemon
ln -s .qmail-postmaster .qmail-root
chmod 644 .qmail*

Impostazione delle cartelle log

Le cartelle log appartengono all'utente qmaill.nofiles e non dovrebbero essere accessibili a nessun altro.

mkdir -p /var/log/qmail

cd /var/log/qmail
chown -R qmaill.nofiles .
chgrp root .
chmod -R og-wrx .
chmod g+rx .

Creazione degli script supervise

Riferimenti: tcpserver page

Scaricare gli startup scripts da qui e scompattarli

cd /var/qmail 
wget http://notes.sagredo.eu/files/qmail/supervise.tar.gz 
tar xzf supervise.tar.gz
rm supervise.tar.gz

Puoi vedere che ci sono l'eseguibile rc, che lo script di avvio qmail-start, e la cartella supervise:

-supervise
|
|----qmail-smtpd/
|    |
|    |-----run
|    |-----log/
|          |
|          |---run
|
|----qmail-submission/
|    |
|    |-----run
|    |-----log/
|          |
|          |---run
|
|----qmail-send/
|    |
|    |-----run
|    |-----log/
|          |
|          |---run
|
|----vpopmaild/
     |
     |-----run
     |-----log/
           |
           |---run

Quando vengono creati dei link simbolici a una cartella supervise nella directory /service, il comando run ivi presente verrà eseguito all'avvio della macchina, quando il comando /command/svcscanboot viene lanciato

cd /service
ln -s /var/qmail/supervise/qmail-smtpd
ln -s /var/qmail/supervise/qmail-send
ln -s /var/qmail/supervise/vpopmaild

E se si vuole mettere su un open relay si dovrebbe anche predisporre un servizio smtp separato dedicato all'autenticazione e al relay da remoto sulla porta 587:

ln -s /var/qmail/supervise/qmail-submission

File qmail/rc

#!/bin/sh

# Using stdout for logging
# Using control/defaultdelivery from qmail-local to deliver messages by default

# DKIM signign 
#exec env - PATH="/var/qmail/bin:$PATH" \ 
#QMAILREMOTE=/var/qmail/bin/spawn-filter  \ 
#FILTERARGS=/var/qmail/bin/dk-filter \ 
#qmail-start "`cat /var/qmail/control/defaultdelivery`" 

exec env - PATH="/var/qmail/bin:$PATH" \ 
qmail-start "`cat /var/qmail/control/defaultdelivery`"

File qmail/supervise/qmail-smtpd/run

#!/bin/sh
 
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
SOFTLIMIT=`cat /var/qmail/control/softlimit`

# This enables greetdelay for qmail-smtpd. Put 0 if you decide to delay rblsmtpd instead.
export SMTPD_GREETDELAY=15
export DROP_PRE_GREET=1

# This enables greetdelay for rblsmtpd
#export GREETDELAY=15
# This disables rblsmtpd reject
#export RBLSMTPD=""
 
# This enables chkuser
export CHKUSER_START=ALWAYS

# DKIM - SURBL configuration
# DKIMQUEUE and SURBLQUEUE are front-ends of qmail-queue
#export SURBL=1                               # Comment out to enable SURBL filtering
#export QMAILQUEUE=/var/qmail/bin/surblqueue  # executes surblfilter
#export SURBLQUEUE=/var/qmail/bin/qmail-dkim  # executes qmail-dkim afer sublfilter
#export QMAILQUEUE=/var/qmail/bin/qmail-dkim  # executes qmail-dkim but not surblfilter
#export DKIMQUEUE=/var/qmail/bin/simscan      # simscan is executed after qmail-dkim
#export DKIMKEY=/usr/local/etc/domainkeys/%/default
# DKIM verification. Use carefully
#export DKIMVERIFY="FGHKLMNORTVW"
 
# This enables simscan debug
#export SIMSCAN_DEBUG=2
 
exec /usr/local/bin/softlimit -m "$SOFTLIMIT" \
    /usr/local/bin/tcpserver -v -H -R -l 0 \
    -x /home/vpopmail/etc/tcp.smtp.cdb -c "$MAXSMTPD" \
    -u "$QMAILDUID" -g "$NOFILESGID" 0 25 \
    /var/qmail/bin/qmail-smtpd 2>&1

Notare come il servizio smtpd standard (porta 25) non consente l'autenticazione.

Bisogna adattare alle proprie esigenze il "resource limit" (softlimit in bytes). Ogni sistema è diverso e ha requisiti differenti. Life with qmail suggerisce appena 2MB. Dovresti trovare il tuo valore giusto aumentando il softlimit a passi di  1MB, specialmente una volta che avrai caricato spamassassin, clamAV e simscan (il mail scanner).

Vedremo le caratteristiche di GREETDELAY, DKIM e RBL in seguito.

File qmail/supervise/qmail-smtpd/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s16000000 n200 /var/log/qmail/smtpd

File qmail/supervise/qmail-submission/run

Questo servizio fa sì che la nostra MTA possa agire anche da outgoing relay (la posta può essere anche inviata quando ci connette da un IP remoto che imposta il suo smtp server sulla nostra MTA), a condizione che l'utente si identifichi (in connessione sicura criptata con  TLS!).

#!/bin/sh
 
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
SOFTLIMIT=`cat /var/qmail/control/softlimit`

# You MUST export this, otherwise you'd get a 30 sec timeout
# "!" if you want the submission feature (auth required)
export SMTPAUTH="!"

# This enables greetdelay for qmail-smtpd
# comment out if using fail2ban on port 587
export SMTPD_GREETDELAY=5
export DROP_PRE_GREET=1

# This enables chkuser
export CHKUSER_START=ALWAYS
 
# This enables simscan debug
#export SIMSCAN_DEBUG=2
 
exec /usr/local/bin/softlimit -m "$SOFTLIMIT" \
    /usr/local/bin/tcpserver -v -H -R -l 0 \
    -x /home/vpopmail/etc/tcp.submission.cdb -c "$MAXSMTPD" \
    -u "$QMAILDUID" -g "$NOFILESGID" 0 587 \
    /var/qmail/bin/qmail-smtpd \
    /home/vpopmail/bin/vchkpw /bin/true 2>&1

Notare l'uso vchkpw in unione con qmail-smtpd per assicurare che l'utente si identifichi. La connessione richiede che TLS sia abilitato. Questa è ragione per la quale abbiamo aperto una porta apposita 587: per consentire anche agli utenti remoti di usare la nostra MTA come un relay.

La variabile SMTPAUTH è relativa alla patch per l'autenticazione. Sei invitato a leggere il file README.auth per ulteriori dettagli.

Vedremo le caratteristiche di GREETDELAY in seguito.

File qmail/supervise/qmail-submission/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s16000000 n200 /var/log/qmail/submission

File qmail/supervise/qmail-send/run

#!/bin/sh
exec /var/qmail/rc

File qmail/supervise/qmail-send/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t s16000000 n200 /var/log/qmail/send.

File qmail/supervise/vpopmaild/run

#!/bin/sh
QMAILDUID=`id -u root`
NOFILESGID=`id -g root`

exec /usr/local/bin/softlimit -m 30000000 \
    /usr/local/bin/tcpserver -v -H -R -l 0 \
    -u "$QMAILDUID" -g "$NOFILESGID" 0 89 \
    /home/vpopmail/bin/vpopmaild 2>&1

vpopmaild è importante quando ci si connette a vpopmail attraverso la webmail per cambiare la password, ad esempio.

File qmail/supervise/vpopmaild/log/run

#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/vpopmaild

cronjobs

Per ruotare i log file di qmail useremo lo script convert-multilog di John Simpson (un grazie all'autore e a Marc per il suggerimento), che ne descrive così il funzionamento:

convert-multilog is a script which searches "/service/*/log/main" for any "@4*" files (the automatic cut-off files generated by multilog), converts their timestamps from tai64n to human-readable format, and writes them to /var/log/{service}.{date}. Once the lines from a given "@4*" file have been converted, the file is deleted.

In sostanza i file vengono archiviati con un file separato per data, ad esempio

-rw-r--r-- 1 root   root   259558 Aug 24 12:21 qmail-smtpd.2014-08-20
-rw-r--r-- 1 root   root   806917 Aug 24 12:21 qmail-smtpd.2014-08-21
-rw-r--r-- 1 root   root  1523116 Aug 24 12:21 qmail-smtpd.2014-08-22
-rw-r--r-- 1 root   root   364022 Aug 24 12:21 qmail-smtpd.2014-08-23

all'interno dei quali la data è convertita dal timestamp al formato normale, ad esempio

2014-08-23 00:31:49.503947500 tcpserver: status: 1/20

Questo facilita molto eventuali ricerche future.

Installare come segue:

mkdir -p /var/log/qmail/backup
cd /usr/local/bin
wget http://notes.sagredo.eu/files/qmail/convert-multilog
chmod +x convert-multilog

cd /service/qmail-send/log/
ln -s /var/log/qmail/send main
cd /service/qmail-smtpd/log/
ln -s /var/log/qmail/smtpd main
cd /service/qmail-submission/log/
ln -s /var/log/qmail/submission main
cd /service/vpopmaild/log/
ln -s /var/log/qmail/vpopmaild main

Ora impostare un cronjob una volta al giorno (crontab -e):

59 2 * * * /usr/local/bin/convert-multilog 1> /dev/null

qmailctl script

cd /usr/local/bin
wget http://notes.sagredo.eu/files/qmail/qmailctl
chmod +x qmailctl

Lo script qui sotto avvia e arresta i servizi, chiama tcprules per ricaricare tcp.smtp.cdb e tcp.submission.cdb, mostra lo stato dei servizi e della coda (queue). Notare come esso avvii e arresti pure vpopmaild, e avvii sia il normale servizio smtpd sulla porta 25 che il servizio submission sulla porta 587, dove l'autenticazione è richiesta al fine di eseguire il relay in uscita per gli utenti che si collegano da remoto. Se è stato deciso di disabilitare il servizio submission è necessario cancellare qmail-submission dentro la cariabile svclist . In ogni caso i servizi da avviare con questo script vanno indicati nella quarta riga.

#!/bin/sh

# Put here the services you want to manage
svclist="qmail-send qmail-smtpd qmail-submission vpopmaild"

PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH

QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`

case "$1" in
  start)
    echo "Starting qmail"

    for svc in $svclist ; do
     if svok /service/$svc ; then
       svc -u /service/$svc
      else
       echo $svc service not running
      fi
    done

    if [ -d /var/lock/subsys ]; then
      touch /var/lock/subsys/qmail
    fi
    ;;
  stop)
    echo "Stopping qmail..."
    for svc in $svclist ; do
      echo " $svc"
      svc -d /service/$svc
    done
    if [ -f /var/lock/subsys/qmail ]; then
    rm /var/lock/subsys/qmail
    fi
    ;;
  stat)
    for svc in $svclist ; do
      svstat /service/$svc
      svstat /service/$svc/log
    done
    qmail-qstat
    ;;
  doqueue|alrm|flush)
    echo "Sending ALRM signal to qmail-send."
    svc -a /service/qmail-send
    ;;
  queue)
    qmail-qstat
    qmail-qread
    ;;
  reload|hup)
    echo "Sending HUP signal to qmail-send."
    svc -h /service/qmail-send
    ;;
  pause)
    for svc in $svclist ; do
      echo "Pausing $svc"
      svc -p /service/$svc
    done
    ;;
  cont)
   for svc in $svclist ; do
     echo "Continuing $svc"
     svc -c /service/$svc
   done
    ;;
  restart)
    echo "Restarting qmail:"
    for svc in $svclist ; do
      if [ "$svc" != "qmail-send" ] ; then
        echo "* Stopping $svc."
        svc -d /service/$svc
      fi
    done
    echo "* Sending qmail-send SIGTERM and restarting."
    svc -t /service/qmail-send
    for svc in $svclist ; do
      if [ "$svc" != "qmail-send" ] ; then
        echo "* Restarting $svc."
        svc -u /service/$svc
      fi
    done
    ;;
  cdb)
    if ! grep '\#define POP_AUTH_OPEN_RELAY 1' ~vpopmail/include/config.h >/dev/null; then
      (cd ~vpopmail/etc ; cat tcp.smtp | tcprules tcp.smtp.cdb tcp.smtp.tmp)
      echo "Updated tcp.smtp.cdb."
      (cd ~vpopmail/etc ; cat tcp.submission | tcprules tcp.submission.cdb tcp.submission.tmp)
      echo "Updated tcp.submission.cdb."
    else
      ~vpopmail/bin/clearopensmtp
      echo "Ran clearopensmtp."
    fi
    ;;
  clear)
    echo "Clearing readproctitle service errors with ................."
    svc -o /service/clear
    ;;
  kill)
    echo "First stopping services ... "
    for svc in $svclist ; do
     if svok /service/$svc ; then
            svc -d /service/$svc
            svc -d /service/$svc/log
     fi
    done
    echo "Now sending processes the kill signal ... "
        killall -g svscanboot
    echo "done"
    ;;
  boot)
    echo "Starting qmail"
    /command/svscanboot &
    ;;
  reboot)
    echo "First stopping services ... "
    for svc in $svclist ; do
        if svok /service/$svc ; then
            svc -d /service/$svc
            svc -d /service/$svc/log
        fi
    done
    echo "Now sending processes the kill signal ... "
        killall -g svscanboot
    echo "done"
    echo "Starting qmail"
    /command/svscanboot &
    ;;
  help)
    cat <

Modalità di utilizzo

# qmailctl help

stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
flush -- same as doqueue
hup -- same as reload
clear -- clears the readproctitle service errors with .....................
kill -- svc -d processes in svclist, then do 'killall -g svscanboot'
boot -- Boots qmail and all services in /service running /command/svscanboot
reboot -- kill & boot commands in sequence

qmailctl può anche essere usato per uccidere (kill) tutti i processidi qmail e per fare un reboot del server. Personalmente uso questa opzione dentro il file rc.6 del mio server virtuale Slackware per evitare messaggi di errore quando arresto o riavvio il server virtuale.

Si può anche chiamare il servizio clear.

svtools

Questa è una interessante collezione di script per gestire i servizi di qmail che val la pena installare.  In particolare è molto utile mlcat che senza nessuna fatica consente di visualizzare il log associato a un dato servizio di daemontool con un comando come:

mlcat qmail-smtpd

L'ho leggermente modificato (link) per evitare di digitare sempre il prefisso "qmail-" davanti al nome del servizio:

mlcat smtpd

Come consentire a certi client di inviare messaggi all'esterno

Creare /home/vpopmail/etc/tcp.smtp e /home/vpopmail/etc/tcp.submission (quest'ultimo nel caso si voglia abilitare il servizio submission).

Abilitare la spedizione dei messaggi verso la rete esterna in questo modo:

10.0.0.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
1.2.3.4:deny
:allow

localhost e la sottorete 10.0.0.0 possono usare la nostra MTA come un relay (ovvero spedire messaggi a chiunque, sia all'esterno che ovviamente ai domini serviti da questa MTA), 1.2.3.4 è inibito (bannato), gli altri IP possono solamente spedire messaggi ai domini elencati in /var/qmail/control/rcpthosts.

tcp.smtp

0.0.0.0:allow,RELAYCLIENT=""
10.0.0.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
:allow,CHKUSER_WRONGRCPTLIMIT="3"

chkuser will ban clients' IP after 3 consecutive failures.

tcp.submission

:allow,CHKUSER_WRONGRCPTLIMIT="3"

Aggiornare i file cdb

qmailctl può invocare tcprules per creare i file cdb in questo modo:

> qmailctl cdb
Updated tcp.smtp.cdb.
Updated tcp.submission.cdb.

E' necessario lanciare questo comando ogni qual volta si attuano delle modifiche al file tcp.smtp o tcp.submission.

Avendo configurato il servizio standard smtp sulla porta 25 in questo modo (tcp.smtp) ci assicura che solo localhost e gli IP autorizzati possano utilizzare il servizio smtp (porta 25) come un relay verso l'esterno e che accettiamo messaggi dalla rete esterna a condizione che il dominio del destinatario sia incluso nel file /var/qmail/control/rcpthosts. La spedizione di un messaggio a un dominio non incluso in questo file produce un errore ``sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)'' (spiacente, questo dominio non è incluso nel file rcpthosts).

Ad ogni modo, avendo abilitato l'autenticazione smtp nella porta 587, a un utente remoto che si autentica con successo è consentito inviare messaggi a chiunque usando la nostra MTA.

qmail-send log migliorato

Ho modificato il file extra.h nel codice sorgente (vedi patch qui) per registrare il Message-ID nel log di qmail-send lcome spiegato qui verso la fine della pagina. Pertanto viene automaticamente aggiunto un alias ~alias/.qmail-log  per salvare il comando awk con l'espressione regolare che invia il Message-ID.

E' necessario che vi sia un record  MX per il  FQDN (vedere /var/qmail/control/me).

Il log di qmail-send ora appare così. Notare che apparentemente ogni email viene girata anche all'indirizzo specificato nell'alias.

2014-11-05 12:00:47.930384500 status: local 1/10 remote 1/20
2014-11-05 12:00:47.952694500 delivery 11: success: Received:_(qmail_17359_invoked_by_uid_89);_5_Nov_2014_12:00:47_+0100/Received:_(qmail_17359_invoked_by_uid_89);_5_Nov_2014_12:00:47_+0100/Received:_from_unknown_(HELO_mx.test.net)_(1.2.3.4)/Received:_from_unknown_(HELO_mx.test.net)_(1.2.3.4)/__by_0_with_ESMTPS_(DHE-RSA-AES256-GCM-SHA384_encrypted);_5_Nov_2014_12:00:47_+0100/Received:_(qmail_17349_invoked_by_uid_89);_5_Nov_2014_12:00:47_+0100/Received:_(qmail_17349_invoked_by_uid_89);_5_Nov_2014_12:00:47_+0100/Received:_from_unknown_(HELO_mail-wg0-f47.google.com)_(74.125.82.47)/Received:_from_unknown_(HELO_mail-wg0-f47.google.com)_(74.125.82.47)/__by_0_with_ESMTPS_(RC4-SHA_encrypted);_5_Nov_2014_12:00:46_+0100/Received:_by_mail-wg0-f47.google.com_with_SMTP_id_a1so597995wgh.6/Received:_by_mail-wg0-f47.google.com_with_SMTP_id_a1so597995wgh.6/Received:_by_mail-wg0-f47.google.com_with_SMTP_id_a1so597995wgh.6/________for_<info@test.net>;_Wed,_05_Nov_2014_03:00:48_-0800_(PST)/X-Received:_by_10.180.23.98_with_SMTP_id_l2mr4797959wif.51.1415185247978;_Wed,/X-Received:_by_10.180.23.98_with_SMTP_id_l2mr4797959wif.51.1415185247978;_Wed,/Received:_by_10.27.203.139_with_HTTP;_Wed,_5_Nov_2014_03:00:47_-0800_(PST)/Received:_by_10.27.203.139_with_HTTP;_Wed,_5_Nov_2014_03:00:47_-0800_(PST)/Date:_Wed,_5_Nov_2014_12:00:47_+0100/Message-ID:_<CAD=Xf-WdCFwED9DiMqRj=bUR5RsRA9mPah1OXgA-tB1ffk-3sw@mail.gmail.com>/Message-ID:_<CAD=Xf-WdCFwED9DiMqRj=bUR5RsRA9mPah1OXgA-tB1ffk-3sw@mail.gmail.com>/Subject:_dasda
2014-11-05 12:00:47.952726500 status: local 0/10 remote 1/20/From:_xxx_<someone@@gmail.com>/From:_xxx_<someone@gmail.com>/To:_info@test.net/---/did_0+0+2/
2014-11-05 12:00:48.326103500 delivery 12: success: 1.2.3.4_accepted_message./Remote_host_said:_250_ok_1415185248_qp_17366/

Aggiungi un commento