Test di qmail, SMTP e vpopmail auth

26 maggio 2016 Roberto Puzzanghera0 commenti

A quest'ora /command/svcscanboot dovrebbe aver avviato qmail:

> ps axfww

 1905 pts/1    Sl     0:00 /home/vpopmail/bin/vusaged
 2008 pts/1    S      0:00 /bin/sh /command/svscanboot
 2010 pts/1    S      0:00  \_ svscan /service
 2012 pts/1    S      0:00  |   \_ supervise qmail-smtpd
 2029 pts/1    S      0:00  |   |   \_ /usr/local/bin/tcpserver -v -H -R -l 0 -x /home/vpopmail/etc/tcp.smtp.cdb -c 20 -u 89 -g 89 0 25 /var/qmail/bin/qmail-smtpd
 2013 pts/1    S      0:00  |   \_ supervise log
 2021 pts/1    S      0:00  |   |   \_ /usr/local/bin/multilog t /var/log/qmail/smtpd
 2014 pts/1    S      0:00  |   \_ supervise qmail-send
 2027 pts/1    S      0:00  |   |   \_ qmail-send
 2039 pts/1    S      0:00  |   |       \_ qmail-lspawn 
 2040 pts/1    S      0:00  |   |       \_ qmail-rspawn
 2041 pts/1    S      0:00  |   |       \_ qmail-clean
 2042 pts/1    S      0:00  |   |       \_ qmail-todo
 2043 pts/1    S      0:00  |   |       \_ qmail-clean
 2015 pts/1    S      0:00  |   \_ supervise log
 2025 pts/1    S      0:00  |   |   \_ /usr/local/bin/multilog t /var/log/qmail/send
 2016 pts/1    S      0:00  |   \_ supervise vpopmaild
 2026 pts/1    S      0:00  |   |   \_ /usr/local/bin/tcpserver -v -H -R -l 0 -u 0 -g 0 0 89 /home/vpopmail/bin/vpopmaild
 2017 pts/1    S      0:00  |   \_ supervise log
 2023 pts/1    S      0:00  |   |   \_ /usr/local/bin/multilog t /var/log/qmail/vpopmaild
 2018 pts/1    S      0:00  |   \_ supervise qmail-submission
 2024 pts/1    S      0:00  |   |   \_ /usr/local/bin/tcpserver -v -H -R -l 0 -x /home/vpopmail/etc/tcp.submission.cdb -c 20 -u 89 -g 89 0 587 /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true
 2019 pts/1    S      0:00  |   \_ supervise log
 2022 pts/1    S      0:00  |   |   \_ /usr/local/bin/multilog t /var/log/qmail/submission
 2020 pts/1    S      0:00  |   \_ supervise clear
 2011 pts/1    S      0:00  \_ readproctitle service errors: ................................................................................................................................................

Se tutto è a posto  si dovrebbe vedere qualcosa del genere. Devono esserci solo punti nella riga readproctitle service errors.

Puoi sempre ripulire la riga degli errori in questo modo:

svc -o /service/clear

Controlliamo la coda e il tempo di up-time dei servizi:

# qmailctl stat

/service/qmail-send: up (pid 7987) 4 seconds
/service/qmail-send/log: up (pid 6998) 1946 seconds
/service/qmail-smtpd: up (pid 7989) 4 seconds
/service/qmail-smtpd/log: up (pid 6995) 1946 seconds
/service/qmail-submission: up (pid 7991) 4 seconds
/service/qmail-submission/log: up (pid 6999) 1946 seconds
/service/vpopmaild: up (pid 7993) 4 seconds
/service/vpopmaild/log: up (pid 6997) 1946 seconds
messages in queue: 0
messages in queue but not yet preprocessed: 0

Ovviamente si vedrà il servizio submission solo se è stato abilitato. Controllare che il tempo di uptime aumenti digitando lo stesso comando più volte. Se qualcosa va storto controllare il log..

In seguito vedremo come provvedere a riparare la coda.

swaks

swaks è uno strumento utile a risparmiarsi la fatica di digitare a mano i comandi di telnet durante una sessione SMTP di test, come quelle che vedremo qui di seguito.

Installare al solito modo:

cd /usr/local/bin
wget http://www.jetmore.org/john/code/swaks/latest/swaks
chown root.root swaks
chmod +x swaks

L'utilizzo è semplice. Modificare secondo le proprie necessità:

swaks \
--to someone@somewhere.net \
--from postmaster@yourdomain.xy \
--server localhost \
--port 587 \
--ehlo test \
-tls \
--auth login \
--auth-user postmaster@yourdomain.xy \
--auth-password [PASSWORD]

Test di qmail delivery

Fare riferimento a quanto suggerito nella pagina man di TEST.deliver.

Test della connessione SMTP

In questo esempio [your-IP] è un IP a cui è consentito usare la nostra MTA come un relay in accordo con il file ~vpopmail/etc/tcp.smtp; tipicamente esso è 0 o 127.0.0.1 o un indirizzo della rete locale come 10.0.0.5 o 192.168.1.12

Questo test fallirà se si cerca di connettersi dalla rete Internet al server di posta senza fare l'autenticazione (Per questo è però previsto il servizio sulla porta 587, vedere  dopo).

# telnet [your IP] 25

Trying [your IP]...
Connected to qmail.yourdomain.net.
Escape character is '^]'.
220 mail.yourdomain.net ESMTP
mail from:<user@yourdomain.net>
250 ok
rcpt to:<someone@somewhere.else.net>
250 ok
data
354 go ahead
subject: This is the subject
to: someone@somewhere.else.net
from: user@yourdomain.net

Testo del messaggio seguente UNA RIGA BIANCA
.
250 ok 1286469273 qp 31969
quit
221 www.yourdomain.net
Connection closed by foreign host.

***********

Naturalmente può succedere che qualcosa vada storto...

# telnet [your IP] 25

Trying [your IP]...
Connected to [yout IP].
Escape character is '^]'.
Connection closed by foreign host.

Controlliamo il log di smtp:

# more /var/log/qmail/smtpd/current

@400000004cb7145314702f74 /var/qmail/bin/qmail-smtpd: error while loading shared libraries: libcrypt.so.1: failed to map segment from shared object: Cannot allocate memory

Se vedi un errore come questo, il tuo softlimit è troppo basso. Prova ad aumentarlo modificando  /var/qmail/supervise/qmail-smtp/run

***********

# more /var/log/qmail/smtpd/current

@400000004cc5baaf076df464 /var/qmail/bin/qmail-smtpd: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory

Ho incontrato questo errore in un virtual mail server a 64b. Mysql era in un virtual server separato da qmail e la cartella mysql era montata localmente ma  qmail-smtp non riusciva a caricarla. Ho risolto copiando (non linkando!) la libreria dentro il guest in questo modo:

cp -p /usr/local/mysql/lib/libmysqlclient.so.16.0.0 /usr/lib64/libmysqlclient.so.16

***********

Controllare se il messaggio è stato correttamente inviato aprendo il log /var/log/qmail/send/current

***********

Provare a inviarsi un messaggio e vedere se è stato correttamente scritto nella cartella Maildir/new folder Maildir/new dell'utente:

# telnet [your IP] 25 Trying [your IP]...
Connected to qmail.yourdomain.net.
Escape character is '^]'.
220 mail.yourdomain.net ESMTP
mail from:<user@yourdomain.net>
250 ok
rcpt to:<user@@yourdomain.net>
250 ok
data
354 go ahead
subject: This is the subject
to: user@yourdomain.net
from: user@yourdomain.net

Testo msg (dopo una riga bianca)
.
250 ok 1286469273 qp 31969
quit
221 www.yourdomain.net
Connection closed by foreign host. 

# ls -l /home/vpopmail/domains/yourdomain.net/user/Maildir/new total 4
-rw------- 1 vpopmail vchkpw 211 2010-12-09 13:22 1291897368.13072.qmail,S\=211

Test vpopmail auth

# telnet [your-IP] 89

Trying [your-IP]...
Connected to [your-IP].
Escape character is '^]'.
+OK
login userid@yourdomain.net PASSWORD
+OK+
vpopmail_dir /home/vpopmail
domain_dir /home/vpopmail/domains/yourdomain.net
uid 89
gid 89
name userid
comment userName userSurname
quota NOQUOTA
user_dir /home/vpopmail/domains/yourdomain.net/userid
encrypted_password $xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
clear_text_password xxxxxxxxxxxxxxxxx
no_password_change 0
no_pop 0
no_webmail 0
no_imap 0
bounce_mail 0
no_relay 0
no_dialup 0
user_flag_0 0
user_flag_1 0
user_flag_2 0
user_flag_3 0
no_smtp 0
domain_admin_privileges 0
override_domain_limits 0
no_spamassassin 0
delete_spam 0
no_maildrop 0
system_admin_privileges 0
.
quit
+OK
Connection closed by foreign host.

Test di chkuser

Se esegui questo test da localhost o da una delle reti ammesse al relay secondo il file ~vpopmail/etc/tcp.smtp...

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

...prima di continuare, devi inibire te stesso dal relaying. Pulisci dunque e ricarica tcp.smtp:

cd ~vpopmail/etc
mv tcp.smtp tcp.smtp.bck
touch tcp.smtp
qmailctl cdb

Ora siamo pronti ad eseguire i test.

MX record non valido

chkuser respinge i messaggi se l'MX record del dominio presente nel campo from non esiste. Questo è comunque un caso raro poichè gli spammers metteranno proprio il nostro dominio nel campo from.

# telnet [yourIP] 25
Trying [yourIP]...
Connected to [yourIP].
Escape character is '^]'.
220 yourdomain.net ESMTP
mail from: unexistent@fake_domain.xxx
550 5.1.8 sorry, can''t find a valid MX for sender domain (chkuser)
quit

Mailbox inesistente

il file qmail/contro/rcpthosts determina se il destinatario sarà accettato: lo sarà se e solo se il dominio nell'indirizzo dato nel comando RCPT TO è listato in rcpthosts. In ogni caso  chkuser è programmato per respingere già a livello SMTP i messaggi per gli utenti locali che non esistono:

# telnet [yourIP] 25
Trying [yourIP]...
Connected to [yourIP].
Escape character is '^]'.
220 yourdomain.net ESMTP
mail from: someone@gmail.com
250 ok
rcpt to: nobody@yourdomain.net
550 5.1.1 sorry, no mailbox here by that name (chkuser)
quit

rcpthosts non valido

Per consentire ai client di spedire messaggi all'esterno usando la nostra MTA, bisogna autorizzare i loro indirizzi IP nel file tcp.smtp:

111.222.333.444:allow,RELAYCLIENT=""

In questo caso, per fare questo test, abbiamo cancellato tutti gli IP autorizzati dal file tcp.smtp, quindi possiamo spedire messaggi solo agli utenti locali, sempre che esistano, ovvero dei domini listati all'interno di rcpthosts e siccome chkuser non troverà il dominio remoto tra di questi, presenterà un messaggio di rcpthosts not allowed:

# telnet [yourIP] 25
Trying [yourIP]...
Connected to [yourIP].
Escape character is '^]'.
220 yourdomain.net ESMTP
mail from: someone@gmail.com
250 ok
rcpt to: someone@gmail.com
553 5.7.1 sorry, that domain isn''t in my list of allowed rcpthosts (chkuser)
quit

In aggiunta a questo dai un'occhiata ai messaggi di chkuser dentro l'smtp log /var/log/qmail/smtp/current.

Non dimentichiamo di ripristinare il file tcp.smtp

rm tcp.smtp
mv tcp.smtp.bck tcp.smtp
qmailctl cdb

Test di smtp-auth e della connessione criptata con TLS

Supponiamo di aver abilitato il servizio submission sulla porta 587. In caso sia stata abilitata l'autenticazione sulla porta 25 gli esempi qui sotto valgono per la porta 25.

Innanzitutto controlliamo che l'autenticazione e il TLS siano presenti:

# telnet [your-IP] 587

Trying [your-IP]...
Connected to [your-IP].
Escape character is '^]'.
220 smtp.yourdomain.net ESMTP
EHLO test
250-smtp.yourdomain.net
250-STARTTLS
250-PIPELINING
250-8BITMIME
250-SIZE 3000000
250 AUTH LOGIN PLAIN
mail from:someone@somewhere.net
530 Authorization required (#5.7.1)
AUTH PLAIN
538 auth not available without TLS (#5.3.3)
STARTTLS
220 ready for tls
?(?S^F?^@???^\?^^CR?^??*LV^?^Y+
^W^C^A^@ o?^?&@?????^N^?>??^?.d[^ZE?^?2^?^F^?Xr?XN^W^C^A^@P?^?^?4H&>/4^UG^?^??Njg^]?^_^F;@?^T?^?
^@i?>r^F??g4??{^C??bc^^N?^Qb???^@?n^???8`?W^\?5?^?^HT?F^?X?(^?+
^W^C^A^@ ?+^??2??W]^Y??}?^?^B^[??n?w^?qs^???^N^B^[^W^C^A^@@^CC3^?f?^Y.^?^?x#?j?^D?+?u^F^?^H?0^?^U??^@i?c$
^CConnection closed by foreign host.

Il server sembra fornire correttamente il supporto STARTTLS e AUTH. Come si può vedere l'autorizzazione è richiesta e l'autenticazione non viene eseguita senza che sia stata inizializzata una sessione criptata con TLS. Quando il server è pronto ("ready for tls") la connessione diventa criptata ed è necessario interromperla con un ctrl-C.

Si badi al fatto che si può settare il meccanismo di autenticazione tra i tre seguenti:

  1. PLAIN (non sicuro senza TLS)
  2. LOGIN (non sicuro senza TLS)
  3. CRAM-MD5 (più sicuro, ma non necessario se la connessione è criptata con TLS)

Poichè la connessione è già criptata con TLS è meglio non abilitare CRAM-MD5, che reallenterebbe solo la connessione, che è già criptata di suo con TLS. Se comunque si desidera abilitare CRAM-MD5 è possibile riferirsi al file README.auth.

Vediamo qui come testare le prime due modalità di autenticazione.

Test del relay con "AUTH LOGIN"

- Codificare il login -

Per testare la modalità "AUTH LOGIN" (è sicura poichè l'intera connessione è sicura) bisogna codificare in una stringa BASE64 il nome utente, useremo qui "test@test.net", e la password, che sarà in questo esempio "test".

# printf "test@test.net" | base64
dGVzdEB0ZXN0Lm5ldA==
# printf "test" | base64
dGVzdA==

Quindi, il nome utente "test@test.net" viene tradotto in "dGVzdEB0ZXN0Lm5ldA==" e la password corrispondente "test" diventerà "dGVzdA=="

- Test del relay -

Ora controlliamo se il relay funziona. Per dialogare con il server durante la sessione smtp criptata useremo una connessione openssl con l'opzione -starttls smtp; prima di tutto verrà presentato il certificato:

# openssl s_client -starttls smtp -crlf -connect [your-IP]:587

CONNECTED(00000003)                                                                                                                        
depth=0 /C=IT/ST=Italy/L=Cagliari/O=Your Name/CN=smtp.yourdomain.net/emailAddress=postmaster@yourdomain.net                              
verify error:num=18:self signed certificate                                                                                                
verify return:1
depth=0 /C=IT/ST=Italy/L=Cagliari/O=Your Name/CN=smtp.yourdomain.net/emailAddress=postmaster@yourdomain.net
verify return:1
---
Certificate chain
 0 s:/C=IT/ST=Italy/L=Cagliari/O=Your Name/CN=smtp.yourdomain.net/emailAddress=postmaster@yourdomain.net
   i:/C=IT/ST=Italy/L=Cagliari/O=Your Name/CN=smtp.sagredo.eu/emailAddress=postmaster@yourdomain.net
---
Server certificate
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
subject=/C=IT/ST=Italy/L=Cagliari/O=Your Name/CN=smtp.yourdomain.net/emailAddress=postmaster@yourdomain.net
issuer=/C=IT/ST=Italy/L=Cagliari/O=Your Name/CN=smtp.yourname.net/emailAddress=postmaster@yourname.net
---
No client certificate CA names sent
---
SSL handshake has read 1650 bytes and written 354 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Session-ID-ctx:
    Master-Key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    Key-Arg   : None
    Start Time: 1292613625
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
250 AUTH LOGIN PLAIN
AUTH LOGIN
334 VXNlcm5hbWU6

Test del relay con "AUTH PLAIN"

- Codifica del login -

La forma corretta di AUTH PLAIN è "\0authentication-id\0passwd" dove \0 il null byte. Se il nome utente è "test@test.net" e la password è "test" bisogna codificare in BASE64 la stringa "\0test@test.net\0test":

# printf "\0test@test.net\0test" | base64
AHRlc3RAdGVzdC5uZXQAdGVzdA==

- Test del relay -

Ora controlliamo che il relay funzioni bene. Per dialogare con il server durante la sessione smtp criptata useremo una connessione openssl con l'opzione -starttls smtp; prima di tutto verrà presentato il certificato:

# openssl s_client -starttls smtp -crlf -connect [your-IP]:587

CONNECTED(00000003)
[THE SAME AS AUTH LOGIN BEFORE]
---
250 AUTH LOGIN PLAIN
AUTH PLAIN AHRlc3RAdGVzdC5uZXQAdGVzdA==

Sorry,_no_mailbox_here_by_that_name._(#5.1.1)

Molti lettori di guesta guida mi hanno inviato messaggi, lamentando il fatto di non riuscire a capire l'origine di questo errore associato alla casella log@dominio.xy nei loro log, o il fatto che la casella log@theirdomain.xy non riceve i messaggi. Per favore leggere questo prima di postare, grazie :-). Si tratta di una mailbox fittizia, che serve solo allo scopo di migliorare il log di qmail-send.

Risoluzione dei problemi

Se qualcosa va storto sarà il caso di registrare la connessione smtp con il programma di Berstein recordio (magari dalla linea di comando):

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 submission \
    /usr/local/bin/recordio \
    /var/qmail/bin/qmail-smtpd \
    /home/vpopmail/bin/vchkpw /bin/true 2>&1

oppure, cosa ancora migliore, vedere cosa succede con strace.

Test di SPF

  • Informazioni su cosa è SPF qui

Controllare come prima cosa l'intestazione del messaggio in arrivo. Si dovrebbe trovare una riga "Received-SPF" come questa nel caso di SPF non abilitato

Received-SPF: none (0: domain at  does not designate permitted sender hosts)

o come questa nel caso di un SPF abilitato e regolare:?

Received-SPF: pass(0: SPF record at  designates x.x.x.x as permitted sender)

Il comportamento di SPF è controllato dal file /var/qmail/control/spfbehavior. Si può specificare un valore tra 0 e 6:

  • 0 disabilitato (Default). Non esegue il controllo controlla SPF, non crea la riga Received-SPF nell'intestazione
  • 1 seleziona la modalità 'solo annotazione', nella quale qmail-smtpd annoterà le email in arrivo con il campo Received-SPF, ma non rigetterà i messaggi in nessun caso. 
  • 2 produce un temporaneo fallimento nei problemi di lettura del DNS di modo che si può essere sicuri di intestazioni Received-SPF di un qualche significato. 
  • 3 seleziona la modalità 'rigetta',  dove le email in ingresso vengono rigettate se il record SPF dice 'fail'. 
  • 4 seleziona una modalità di rigetto anche più severa, che è come la modalità porecedente, ma le email in arrivo vengono rigettate abnhce nel caso il record SPF dica 'softfail'. 
  • 5 vengono rigettate anche le email con record SPF 'neutral'
  • 6 se non è proprio disponibile il record SPF (o si è verificato un errore di sintassi) il messaggio viene respinto.

Il contenuto di questo file viene sovrascritto dal valore della variabile di ambiente SPFBEHAVIOR (se è stata impostata, tipicamente in /etc/tcprules.d/tcp.smtp).

Valori superiori a 3 sono fortemente sconsigliati, mentre normalmente si imposta un valore pari a 2 o 3. Per testare il rigetto impostare temporaneamente il valore più alto 6 e riavviare qmail. Dopo di chè inviare un email con un mittente fasullo connettendosi al server da remoto; il messaggio dovrebbe essere rigettato con un messaggio come questo:

# telnet qmail.yourserver.net 25
Trying [remote-IP]...
Connected to [remote-IP].
Escape character is '^]'.
220 qmail.yourserver.net ESMTP
mail from: test@nospfdomain.net
250 ok
rcpt to: user@yourdomain.net
550 See http://spf.pobox.com/why.html?sender=test%40nospfdomain.net&ip=[sender-IP]&receiver=0 (#5.7.1)
quit
221 qmail.yourserver.net
Connection closed by foreign host.

Ricordarsi di ripristinare a 2 o 3 il file /var/qmail/control/spfbehavior.

Aggiungi un commento