Configurazione di qmail

3 maggio 2025 by Roberto Puzzanghera 10 commenti

qmail v2025.04.18 e successivi include un nuovo script config-all che automatizza la configurazione di qmail. Vari script che prima dovevano essere installati a mano successivamente all'installazione di base di qmail vengono ora installati automaticamente se si lancia semplicemente il comando './config-all mx.domain.tld' dopo la compilazione. Ecco cosa sarà installato e configurato con l'installazione rapida:

  • control file pricipali come da script originale config-fast,
  • alias,
  • RBL
  • SPF
  • SRS (usa control/me come srs_domain),
  • directory log in /var/log/qmail,
  • cronjobs 
  • logrotate
  • PATH e MANPATH in /etc/profile.d/qmail.sh
  • tcprules (base, solo per poter fare i testi inziali),
  • supervise scripts,
  • qmailctl script,
  • DKIM control/filterargs and control/domainkeys directory,
  • SURBL,
  • overlimit feature,
  • moreipme,
  • smtpplugins,
  • helodnscheck spp plugin,
  • svtools,
  • qmHandle,
  • queue-repair,
  • SSL key file (opzionale)

Da ora in avanti, lanciando ./config-all mx.mydomain.tld dopo la compilazione si otterrà una installazione di qmail pronta per i test. Si dovrà solo aggiungere i propri domini virtuali e le altre funzionalità non menzionate sopra.

Coloro che preferiscono configurare tutto a mano possono continuare a usare lo script config-fast, che orà copia i miei script supervise nella cartella qmail/doc.

In quanto segue, la sezione "Configurazione Manuale" è ovviamente una lettura caldamente suggerita al fine di avere un quadro di come funziona il tutto, soprattutto se si è principianti di qmail.

Considerare questa funzionalità ancora come 'test' per il momento. I commenti sono apprezzati.

Changelog

  • Apr 15, 2025
    - added script config-all.sh
  • Jul 31, 2024
    multilog uses "d" flag as default to gain compatibility with the readable datetime format of multilog in daemontools-0.78. Change it with the "t" flag if you prefer to have timestamps.

Indice

 

Configurazione rapida

Lanciare lo script config-all nella cartella dei sorgenti per installare e configurare quanto segue:

  • principali file control come da script originario config-fast,
  • alias,
  • RBL
  • SPF
  • SRS (usa control/me come srs_domain),
  • directory log in /var/log/qmail,
  • cronjobs 
  • logrotate
  • PATH e MANPATH in /etc/profile.d/qmail.sh (anche  vpopmail e dovecot)
  • tcprules (base, solo per poter fare i test iniziali),
  • supervise scripts,
  • qmailctl script,
  • Directory DKIM control/filterargs and control/domainkeys,
  • SURBL,
  • overlimit feature,
  • moreipme,
  • smtpplugins,
  • helodnscheck spp plugin,
  • svtools,
  • qmHandle,
  • queue-repair,
  • SSL key file (opzionale)
./config-all mx.mydomain.tld

Il resto di questa pagina è una lettura fortemente suggerita per capire come funziona il tutto, soprattutto per i principianti.

mx.mydomain.tld deve avere un record MX, SPF, DKIM  DMARC valido.

 

Configurazione manuale

Come già detto questa è la configurazione classica. Lascerò qui le vecchie note dal momento che sono materiale utile per capire cosa si è installato se si è scelto di utilizzare l'installazione rapida.

Creazione dei file alias e control

QMAILDIR=/var/qmail
echo 3 > $QMAILDIR/control/spfbehavior
echo "| ~vpopmail/bin/vdelivermail '' delete" > $QMAILDIR/control/defaultdelivery
echo 200 > $QMAILDIR/control/concurrencyincoming
echo noreply > $QMAILDIR/control/bouncefrom
echo 20000000 > $QMAILDIR/control/databytes
echo 272800 > $QMAILDIR/control/queuelifetime
echo 30000000 > $QMAILDIR/control/softlimit
echo 100 > $QMAILDIR/control/maxrcpt
echo 2 > $QMAILDIR/control/brtlimit
echo "HIGH:MEDIUM:!MD5:!RC4:!3DES:!LOW:!SSLv2:!SSLv3" > /var/qmail/control/tlsserverciphers

cd /usr/local/src/qmail
./config-fast smtp.mydomain.tld

L'ultimo comando riempie i file defaultdomain locals me plusdomain rcpthosts. smtp.mydomain.tld sarà il nome della MTA e dovrà necessariamente avere un record MX valido.

  • 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. I domini listati in locals non dovrebbero essere confusi con i domini virtuali (virtualdomains). Infatti, nel caso il dominio sia presente nel file locals, qmail-send non andrà ad aprire il file virtualdomains e si otterrà un errore di "no mailbox". Questo è il motivo per cui è sconsigliabile usare un dominio virtuale come nome della propria MTA.
  • me il nome del server. Questo è il nome a dominio che compare nel campo from quando si ricevono messaggi di sistema, ad esempio. E' anche il dominio usato nell'HELO (il saluto all'inizio della conversazione SMTP). Esso deve avere un record MX valido nel DNS e anche i record SPF e DKIM, come vedremo in seguito. Inoltre, me dovrebbe essere il dominio definito nel reverse DNS, dal momento che vi sono dei provider che bloccano connessione ove l'HELO domain non è associato all'indirizzo IP.
  • 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 chkuser rigetta le email per gli utenti non esistenti.
  • spfbehavior riguarda  la configurazione di SPF.
  • softlimit imposta il soft resource limits per qmail-smtpd
  • bouncefrom è lo username dell'account che invia i bounce. Similmente è possibile definire anche bouncefrom, il dominio che compare nel bounce, che però ha come default me.
  • databytes è il numero massimo di bytes in un messaggio (0=nessun limite).
  • queuelifetime sono il numero di secondi che un messaggio può trascorrere nella coda prima di essere definitivamente cancellato.
  • brtlimit è il limite massimo di destinatari non trovati consentito dopo il quale la connessione verrà chiusa (vedi la brtlimit patch).
  • maxrcpt imposta un limite al numero di destinatari di un messaggio (qmail-maxrcpt patch).
  • 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.
  • tlsserverciphers imposta la suite di cifratura (cipher suite, gli algoritmi del protocollo TLS) della connessione TLS. Nella nostra configurazione SSL non è ammesso, mentre TLS versione 1 e 1.1 (deprecato) è consentito. Se si vuole escludere anche il TLS v. 1 e 1.1 aggiungere :!TLSv1 alla fine della linea.

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 $QMAILDIR/alias
echo "postmaster@mydomain.tld" > .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

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

Creazione degli script supervise

Copiare gli script suprvise dalla cartella qmail/doc/example-supervise. Non fare copia&incolla dagli esempi sottostanti perchè non è detto che essi siano aggiornati e anche perchè potrebbero contenere dei caratteri esadecimali nascosti che causerebbero degli errori nell'esecuzione.

Scaricare gli startup scripts da qui e scompattarli

cd $QMAILDIR
cp -rp doc/example-supervise/* .

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

rc
supervise/
|
|----clear/
|    |
|    |----run
|    |----down
|
|----qmail-smtpd/
|    |
|    |-----run
|    |-----log/
|          |
|          |---run
|
|----qmail-smtpsd/
|    |
|    |-----run
|    |-----log/
|          |
|          |---run/
|
|----qmail-submission/
|    |
|    |-----run
|    |-----log/
|          |
|          |---run
|
|----qmail-send/
|    |
|    |-----run
|    |-----log/
|          |
|          |---run
|
|----vpopmaild/
|    |
|    |-----run
|    |-----log/
|          |
|          |---run
|
|----vusaged/
     |
     |-----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

QMAILDIR=/var/qmail
ln -s $QMAILDIR/supervise/qmail-smtpd      /service
ln -s $QMAILDIR/supervise/qmail-smtpsd     /service
ln -s $QMAILDIR/supervise/qmail-submission /service
ln -s $QMAILDIR/supervise/qmail-send       /service
ln -s $QMAILDIR/supervise/vpopmaild        /service
ln -s $QMAILDIR/supervise/vusaged          /service
ln -s $QMAILDIR/supervise/clear            /service

Vediamo ora in dettaglio gli script che abbiamo appena scaricato. Molte righe sono ancora commentate, perchè riguardano delle funzionalità che attiveremo in seguito. Per il momento sono attive solo le funzionalità di base.

File qmail/rc

#!/bin/sh 

QMAILDIR=/var/qmail 

# Comment out DKIM_ON=1 to disable dkim sign at qmail-remote level 
# You have to define your variables in control/filterargs (DKIM page for more info)
# echo "*:remote:/var/qmail/bin/qmail-dkim:DKIMQUEUE=/bin/cat,DKIMSIGN=/var/qmail/control/domainkeys/%/default,DKIMSIGNOPTIONS=-z 2" > /var/qmail/control/filterargs

DKIM_ON=1

if [ -r ${QMAILDIR}/control/filterargs ] &&​ [ -n "$DKIM_ON" ]; then
  # DKIM sign at qmail-remote level
  exec env - PATH="$QMAILDIR/bin:$PATH" \
  QMAILREMOTE=$QMAILDIR/bin/spawn-filter \
  qmail-start "`cat $QMAILDIR/control/defaultdelivery`" 
else 
  exec env - PATH="$QMAILDIR/bin:$PATH" \
  qmail-start "`cat $QMAILDIR/control/defaultdelivery`" 
fi

Per il momento ignorare le righe che riguardano la firma DKIM (anche nei run file successivi). Vedremo queste cose dopo. E' infatti possibile testare il server sin da subito anche con queste righe presenti.

Servizio clear

Il servizio "clear" può comodamente ripulire la riga readproctitle service errors (qmailctl clear):

#!/bin/sh
yes '' | head -4000 | tr '\n' .

Creare il file 'down':

touch /var/qmail/supervise/clear/down

File qmail/supervise/qmail-smtpd/run

#!/bin/sh

QMAILDIR=/var/qmail
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
MAXSMTPD=`cat $QMAILDIR/control/concurrencyincoming`
SOFTLIMIT=`cat $QMAILDIR/control/softlimit`
LOCAL=`head -1 $QMAILDIR/control/me`
TCPRULES_DIR=/var/qmail/control

#export REJECTNULLSENDERS=0
#export SMTPAUTH="!cram"

# qmail-spp plugins
#export ENABLE_SPP=1
#export HELO_DNS_CHECK=PLRIV

# enable greetdelay for qmail-smtpd
export SMTPD_GREETDELAY=20
export DROP_PRE_GREET=1

# greylisting
#export JGREYLIST_DIR="$QMAILDIR/jgreylist"
#export JGREYLIST_LOG_SMTP=1

# enable chkuser
export CHKUSER_START=ALWAYS

################### DKIM - SURBL configuration #################################
# DKIMQUEUE and SURBLQUEUE are front-ends of qmail-queue
export SURBL=1 # enable SURBL filtering

# If simscan is not installed yet, do not assign QMAILQUEUE
# so that the installation works at the beginning stage as well
if [ -x $QMAILDIR/bin/simscan ]; then
  export QMAILQUEUE=$QMAILDIR/bin/surblqueue # executes surblfilter
  export SURBLQUEUE=$QMAILDIR/bin/simscan    # executes simscan after SURBL
  #export QMAILQUEUE=$QMAILDIR/bin/simscan # do not execute SURBL nor DKIM filtering

  #### qmail-dkim disabled => no dkim verification
  #### to have verification active export SURBLQUEUE=$QMAILDIR/bin/qmail-dkim. Othewise the following will be ignored
  #export SURBLQUEUE=$QMAILDIR/bin/qmail-dkim # executes qmail-dkim after surblfilter

  export DKIMQUEUE=$QMAILDIR/bin/simscan     # simscan is executed after qmail-dkim

  # DKIM verification. Use carefully
  export DKIMVERIFY="FGHKLMNOQRTVWp"
  # allow msg without "subject" in the h= list
  export UNSIGNED_SUBJECT=1
  # avoid verification of outgoing messages
  export RELAYCLIENT_NODKIMVERIFY=1
fi
################################################################################

# turn off TLS on port 25
#export DISABLETLS="1"

# rcptcheck-overlimit. Limits the number of emails sent by relayclients
if [ -x $QMAILDIR/bin/rcptcheck-overlimit ]; then
  export RCPTCHECK=$QMAILDIR/bin/rcptcheck-overlimit
  export RCPTCHECKRELAYCLIENT="1"
fi

# enable simscan debug
#export SIMSCAN_DEBUG=4
#export SIMSCAN_DEBUG_FILES=2

exec /usr/local/bin/softlimit -m "$SOFTLIMIT" \
    /usr/local/bin/tcpserver -v -R -l "$LOCAL" \
    -x $TCPRULES_DIR/tcp.smtp.cdb -c "$MAXSMTPD" \
    -u "$QMAILDUID" -g "$NOFILESGID" 0 25 \
    $QMAILDIR/bin/qmail-smtpd /bin/true 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 GREETDELAYDKIM in seguito.

Considerazioni dull'uso del programma multilog

Come già accennato nella pagina su daemontools, si può fare in modo che multilog stampi le linee del log precedute da un timestamp, come già faceva il programma originale, oppure optare per un formato in cui data e ora sono stampati in modo intelligibile (che chiamerò datetime in quanto segue). La modalità di utilizzo varia leggermente per quanto riguarda il primo parametro da passare a multilog, dato che il timestamp va con il flag t mentre datetime va con una d.

Pertanto questo sarà l'utilizzo di datetime:

multilog d <other-arguments> <script>

che stamperà qualcosa come

2024-07-31 18:06:03.823254532 tcpserver: status: 0/200/0

mentre questo è per il vecchio timestamp this is for timestamps

multilog t <other-arguments> <script>

che produrrà delle righe nel log simili a questa

@4000000066aa062d281ba97c tcpserver: status: 0/200/0

Questa guida utilizzerà datetime come impstazione di default.

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

#!/bin/sh

LOGUSER="qmaill"
LOGDIR="/var/log/qmail/smtpd"
LOGDIRQLOG="/var/log/qmail/smtpd/qlog"
NLOGS=50

exec /usr/local/bin/setuidgid $LOGUSER /usr/local/bin/multilog d n5 s16777215 $LOGDIR \
  n$NLOGS s16777215 '-*' '+*qlog*' $LOGDIRQLOG

In questo modo avremo il file /var/log/qmail/smtpd/qmail-smtpd.log con le sole righe di qlog e con la data e l'ora scritte in modo leggibile:

2016-01-29 13:15:17.677946500 qlogenvelope: result=accepted code=250 reason=rcptto detail=chkuser helo=smtp.senderdomain.com mailfrom=sender@senderdomain.com rcptto=user@rcptdomain.com relay=no rcpthosts=yes size= authuser= authtype= encrypted= sslverified=no localip=10.0.0.4 localport=25 remoteip=83.103.72.231 remoteport=43618 remotehost= qp= pid=11928
2016-01-29 13:15:17.677946500 qlogreceived: result=accepted code=250 reason=queueaccept detail= helo=smtp.senderdomain.com mailfrom=sender@senderdomain.com rcptto=user@rcptdomain.com relay=no rcpthosts= size=2689 authuser= authtype= encrypted= sslverified=no localip=10.0.0.4 localport=25 remoteip=83.103.72.231 remoteport=43618 remotehost= qp=11934 pid=11928

File /var/qmail/supervise/qmail-smtpsd/run

#!/bin/sh

QMAILDIR=/var/qmail
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
MAXSMTPD=`cat $QMAILDIR/control/concurrencyincoming`
SOFTLIMIT=`cat $QMAILDIR/control/softlimit`
LOCAL=`head -1 $QMAILDIR/control/me`
TCPRULES_DIR=/var/qmail/control

SSL_DIR="$QMAILDIR/control"
SSL_CHROOT="$SSL_DIR"
SSL_UID=$QMAILDUID
SSL_GID=$NOFILESGID
CERTFILE="$SSL_DIR/servercert.pem"
KEYFILE="$SSL_DIR/servercert.pem"
DHFILE="$SSL_DIR/dh4096.pem"
export SSL_UID SSL_GID SSL_CHROOT
export CERTFILE KEYFILE DHFILE

#export REJECTNULLSENDERS=1
export SMTPAUTH="!"

# qmail-spp plugins
export ENABLE_SPP=1
export HELO_DNS_CHECK=PLRIV

# This enables greetdelay for qmail-smtpd
export SMTPD_GREETDELAY=20
export DROP_PRE_GREET=1

# greylisting
#export JGREYLIST_DIR="$QMAILDIR/jgreylist"
#export JGREYLIST_LOG_SMTP=1

# enable 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

# If simscan is not installed yet, do not assign QMAILQUEUE
# so that the installation works at the beginning stage as well
if [ -x $QMAILDIR/bin/simscan ]; then
  export QMAILQUEUE=$QMAILDIR/bin/surblqueue # executes surblfilter
  export SURBLQUEUE=$QMAILDIR/bin/simscan    # executes simscan after SURBL
  #export QMAILQUEUE=$QMAILDIR/bin/simscan # do not execute SURBL nor DKIM filtering

  #### qmail-dkim disabled => no dkim verification
  #### to have verification active export SURBLQUEUE=$QMAILDIR/bin/qmail-dkim. Othewise the following will be ignored
  #export SURBLQUEUE=$QMAILDIR/bin/qmail-dkim # executes qmail-dkim after surblfilter

  export DKIMQUEUE=$QMAILDIR/bin/simscan     # simscan is executed after qmail-dkim

  # DKIM verification. Use carefully
  export DKIMVERIFY="FGHKLMNOQRTVWp"
  # allow msg without "subject" in the h= list
  export UNSIGNED_SUBJECT=1
  # avoid verification of outgoing messages
  export RELAYCLIENT_NODKIMVERIFY=1
fi
################################################################################

# turn off TLS on port 465
export DISABLETLS=1
export FORCETLS=0

# require that authenticated user and 'mail from' are identical
export FORCEAUTHMAILFROM="1"

# rcptcheck-overlimit. Limits the number of emails sent by relayclients
if [ -x $QMAILDIR/bin/rcptcheck-overlimit ]; then
  export RCPTCHECK=$QMAILDIR/bin/rcptcheck-overlimit
  export RCPTCHECKRELAYCLIENT="1"
fi

# enable simscan debug
#export SIMSCAN_DEBUG=4
#export SIMSCAN_DEBUG_FILES=2

exec /usr/local/bin/softlimit -m "$SOFTLIMIT" \
    /usr/local/bin/sslserver -seV -Rp -l "$LOCAL" \
    -Xx $TCPRULES_DIR/tcp.smtp.cdb -c "$MAXSMTPD" \
    -u "$QMAILDUID" -g "$NOFILESGID" 0 smtps \
    $QMAILDIR/bin/qmail-smtpd ~vpopmail/bin/vchkpw /bin/true 2>&1

File qmail/supervise/qmail-smtpsd/log/run

#!/bin/sh

LOGUSER="qmaill"
LOGDIR="/var/log/qmail/smtpsd"

exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog d s16777215 /var/log/qmail/smtpsd

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

QMAILDIR=/var/qmail
QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vpopmail`
MAXSMTPD=`cat $QMAILDIR/control/concurrencyincoming`
SOFTLIMIT=`cat $QMAILDIR/control/softlimit`
LOCAL=`head -1 $QMAILDIR/control/me`
TCPRULES_DIR=/var/qmail/control

# 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.
export SMTPD_GREETDELAY=3
export DROP_PRE_GREET=1

# This enables chkuser
export CHKUSER_START=ALWAYS

# This makes qmail to allow connections without TLS (default 1)
#export FORCETLS=0

# This turns off TLS on port 587 (default 0)
#export DISABLETLS=1

# Requires that authenticated user and 'mail from' are identical (default 0)
export FORCEAUTHMAILFROM=1

# rcptcheck-overlimit. Limits the number of emails sent by relayclients
#export RCPTCHECK=$QMAILDIR/bin/rcptcheck-overlimit
#export RCPTCHECKRELAYCLIENT=1

exec /usr/local/bin/softlimit -m "$SOFTLIMIT" \
    /usr/local/bin/tcpserver -v -R -l "$LOCAL" \
    -x $TCPRULES_DIR/tcp.submission.cdb -c "$MAXSMTPD" \
    -u "$QMAILDUID" -g "$NOFILESGID" 0 587 \
    $QMAILDIR/bin/qmail-smtpd \
    ~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 d 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 d s16000000 n200 /var/log/qmail/send.

File qmail/supervise/vpopmaild/run

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

exec /usr/local/bin/softlimit -m 30000000 \
    /usr/local/bin/tcpserver -v -H -R -l 0 \
    -u $QMAILDUID -g $NOFILESGID 0 $VPOPMAILID \
    ~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 d /var/log/qmail/vpopmaild

File qmail/supervise/vusaged/run

#!/bin/sh
exec ~vpopmail/bin/vusaged 2>&1

File qmail/supervise/vusaged/log/run

#!/bin/sh
exec setuidgid qmaill /usr/local/bin/multilog d /var/log/qmail/vusaged

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
wget -O /usr/local/bin/convert-multilog https://notes.sagredo.eu/files/qmail/convert-multilog
chmod +x /usr/local/bin/convert-multilog

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

NB: lo script che abbiamo scaricato è la versione da me modificata per funzionare con le formato datetime nei log ( patch multilog_readable-datetime per daemontools). Se invece si è scelto di usare il timestamp scaricare il programma convert-multilog originale.

Ora impostare un cronjob una volta al giorno. E dal momento che vogliamo convertire il log in formato leggibile una volta al giorno è necessario ruotarlo su base giornaliera. Perciò è necessario aggiungere qualcosa come questo al nostro crontab:

cat > /etc/cron.d/qmail << EOF
# convert-multilog 
59 2 * * * /usr/local/bin/convert-multilog 1> /dev/null 
# qmail log 
0 0  * * * /usr/local/bin/svc -a /service/qmail-submission/log 
0 0  * * * /usr/local/bin/svc -a /service/qmail-smtpd/log 
0 0  * * * /usr/local/bin/svc -a /service/qmail-smtpsd/log 
0 0  * * * /usr/local/bin/svc -a /service/qmail-send/log 
0 0  * * * /usr/local/bin/svc -a /service/vpopmaild/log 
0 0  * * * /usr/local/bin/svc -a /service/vusaged/log
EOF

Notare che almeno nelle dstribuzione derivate da RedHat il cronjob deve contenere l'utente che deve lanciare il comando, perciò la sintassi da utilizzare è la seguente:

cat > /etc/cron.d/qmail << EOF
# convert-multilog
59 2 * * * root /usr/local/bin/convert-multilog 1> /dev/null 
# qmail log
0 0 * * * root /usr/local/bin/svc -a /service/qmail-submission/log
0 0 * * * root /usr/local/bin/svc -a /service/qmail-smtpd/log
0 0 * * * root /usr/local/bin/svc -a /service/qmail-smtpsd/log
0 0 * * * root /usr/local/bin/svc -a /service/qmail-send/log
0 0 * * * root /usr/local/bin/svc -a /service/vpopmaild/log
0 0 * * * root /usr/local/bin/svc -a /service/vusaged/log
EOF

Impostazione PATH e MANPATH

Agiungere la cartella bin di qmail al PATH e la cartella man al MANPATH

cat > /etc/profile.d/qmail.sh << __EOF__
PATH=\$PATH:/var/qmail/bin:/home/vpopmail/bin:/usr/local/dovecot/bin:/usr/local/dovecot-pigeonhole/bin
export PATH
MANPATH=\$MANPATH:/var/qmail/man:/usr/local/dovecot/share/man
export MANPATH
__EOF__

Abbiamo aggiunto in anticipo il PATH di vpopmail, dovecot e dovecot-pigeonhole PATH. Correggere se si è pensato di installarli altrove.

Creare la SSL key

SE non hai intenzione di costruire un un open relay (che consente l'invio di email connettendosi da remoto con accesso smtp/tls) puoi saltare questo punto.

Per mettere in sicurezza l'autenticazione smtp bisogna creare un certificato SSL. Il certificato deve essere di proprietà dell'utente sotto il quale viene eseguito qmail-smtpd, nel nostro caso vpopmail.

# make cert

Generating a 1024 bit RSA private key
..................++++++
.......++++++
writing new private key to '/var/qmail/control/servercert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:Italy
Locality Name (eg, city) []:Cagliari
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Name
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:smtp.yourdomain.net
Email Address []:postmaster@yourdomain.net

# make tmprsadh
# chown vpopmail:vchkpw /var/qmail/control/*.pem

E' importante che il "Common Name" corrisponda al nome a dominio del server che viene usato come relay.

Ora creiamo un cronjob che aggiorni giornalmente il certificato:

# crontab -e

03 05 * * * /var/qmail/bin/update_tmprsadh > /dev/null 2>&1

Importante: se si sta usando la mia patch e nella vostra installazione qmail-submission viene lanciato sotto un utente diverso da vpopmail (diversamente da quanto suggerito in questa guida), è necessario modificare di conseguenza il file update_tmprsadh, altrimenti è possibile eccedere il timeout della connessione a causa della mancanza dei privilegi di lettura del certificato.

Installazione di un certificato SSL valido

Non appena il server è funzionante sarà il caso di ritornare qui per installare un certificato valido fornito da Let's Encrypt. Si veda questa pagina al proposito.

qmailctl script

wget -O /var/qmail/bin/qmailctl https://raw.githubusercontent.com/sagredo-dev/qmail/refs/heads/main/scripts/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. In ogni caso i servizi da avviare con questo script vanno indicati nella quarta riga.

qmailctl is a pure bash script. Unix BSD users should install bash, edit the script and point the bash executable correctly in the very first line:

#!/usr/local/bin/bash

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.

Compiling the tcprules

Creare un file tcprules per qmail-smtpd

cat > /var/qmail/control/tcp.smtp << EOF
0.0.0.0:allow,RELAYCLIENT="",SMTPD_GREETDELAY="0"
127.:allow,RELAYCLIENT="",SMTPD_GREETDELAY="0"
:allow,CHKUSER_WRONGRCPTLIMIT="3"
EOF 

e per qmail-submission

cat > QMAIL/control/tcp.submission << EOF
:allow
EOF

Compilare le tcprules:

> qmailctl cdb

Updated tcp.smtp.cdb. 
Updated tcp.submission.cdb.

Sarà necessario ricompilare le tcprules ogni volta che si modifica tcp.smtp o tcp.submission. Non c'è bisogno di riavviare qmail.

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 per evitare di digitare sempre il prefisso "qmail-" davanti al nome del servizio:

mlcat smtpd

Installazione

git clone https://github.com/sagredo-dev/svtools.git
cd svtools
make
make install

Lanciare qmail all'avvio

Il comando /command/svcscanboot è già stato inserito nel file /etc/inittab al momento dell'installazione di daemontools. Nei sistemi basati su systemd abbiamo invece installato un apposito servizio per l'avvio automatico di daemontools, come spiegato qui.

Commenti

Messaggio nei log

Salve Roberto,
non riesco a capire questo messaggio nei log /var/log/qmail/smtpd/current, l'ip anonimizzato è il mio

May 17 12:53:38 2021 qmail-smtpd: read failed (hang up before quit cmd): (null) from 109..xxx.xxx.xxx to (null) helo 161.xxx.xxx.xxx.cust.ip.xxxxxxxxxxxx.it

Grazie

Gabriele

Rispondi |

Messaggio nei log

Credo che significhi che il client abbia chiuso la conversazione prima del comando quit del server. Il messaggio di errore esplicito l'avevo aggiunto io tempo fa al posto di un generico "read failed", ma non ricordo più molto... In ogni caso il messaggio viene correttamente ricevuto

Rispondi |

Messaggio nei log

Grazie del chiarimento.

A presto

G

Rispondi |

Received-SPF: unknown (0: Multiple SPF records returned)

Buongiorno Roberto,

Per bloccare le mail in ingresso con Received-SPF: unknown (0: Multiple SPF records returned) come devo modifcare i file della patch qmail-SPF.

Grazie mille

Rispondi |

Received-SPF: unknown (0: Multiple SPF records returned)

da quello che vedo nella patch lo stato di unknown viene lasciato passare sempre quando spfbehaviour<6... un po' brutto effettivamente. Occorrerebbe in effetti metterci le mani, avendo tempo :-)

Rispondi |

Cambio dominio di default

Buongiorno Roberto, in un server in produzione dovrei cambiare il dominio di default, quello che si imposta con ./config-fast yourdomain.net per intenderci. Se cambio tutte le ricorrenze del vecchio dominio nei vari file in qmail/control e riavvio qmail continua a funzionare tutto?

Grazie

Gabriele

Rispondi |

Cambio dominio di default

si, non mi viene in mente nessun effetto collaterale, ed io l'ho fatto più di una volta... per esempio quando installo un nuovo server clono un virtual server in produzione e poi faccio un config-fast

Rispondi |

impostazione bouncefrom

Ciao Roberto, c'è l'impostazione del bouncefrom che se settata come da te indicata, echo postmaster@yourdomain.net > /var/qmail/control/bouncefrom, mi genera le mail di mailer-daemon con mittente postmaster@yourdomain.net"@yourdomain.net".

Ho cambiato in echo postmaster > /var/qmail/control/bouncefrom, è ugualmente corretto?

Grazie ancora

Rispondi |

impostazione bouncefrom

Mi sa che hai ragione... hai fatto un test con la nuova impostazione?

Rispondi |

impostazione bouncefrom

Grazie della risposta.

Si con la nuova impostazione.

Grazie

Rispondi |

Aggiungi un commento

qmail notes

Pay me a coffee:

PayPal - The safer, easier way to pay online.

LXC scripts
Other contents
Guide per gli utenti
Ultimi commenti
Articoli recenti

RSS feeds