Recevoir du monde

Nous pouvons maintenant commencer à envisager de recevoir des messages depuis le monde vers nos comptes @nain-t.net.

Nous devons déjà nous assurer que le DNS qui gère le domaine nain-t.net répond correctement à une requête de type MX :

# host -t MX nain-t.net
nain-t.net mail is handled by 1 cyrus.nain-t.net.

C'est le cas. Il va falloir tout de même prévoir quelques mesures sanitaires en conséquence.

Remarque à propos de Bind

Bind9, Le serveur de noms quasi universellement utilisé sur l'internet présente une petite restriction qu'il est important de souligner. En effet, il ne supporte pas que le nom d'hôte indiqué comme MX soit un alias, autrement dit un CNAME.

Evitez donc les ennuis et ne faites pas quelque chose comme :

truc.machin.net.    IN  A      192.168.0.5
cyrus.machin.net.   IN CNAME   truc.machin.net.
machin.net.         IN MX 1    cyrus.machin.net.

Mais plutôt :

cyrus.machin.net.   IN  A      192.168.0.5
truc.machin.net.    IN CNAME   cyrus.machin.net.
machin.net.         IN MX 1    cyrus.machin.net.

Le silence est d'or

La bannière d'accueil

Est-il bien nécessaire que notre postfix s'annonce de manière si explicite ? Non. Seul le nom d'hôte est obligatoire. Notre Postfix se présente actuellement comme ceci :

$ telnet cyrus.nain-t.net 25
Trying 192.168.10.7...
Connected to cyrus.nain-t.net.
Escape character is '^]'.
220 cyrus.nain-t.net ESMTP Postfix (Debian/GNU)

Ce n'est pas nécessaire d'indiquer à tout le monde que nous utilisons Postfix sur une Debian. Modifions notre smtp_banner en fonction :

smtpd_banner = $myhostname ESMTP Experimental

Et vérifions :

$ telnet cyrus.nain-t.net 25
Trying 192.168.10.7...
Connected to cyrus.nain-t.net.
Escape character is '^]'.
220 cyrus.nain-t.net ESMTP Experimental

C'est mieux, c'est plus discret, c'est moins extraverti.

La commande « vrfy »

SMTP prévoit la commande vrfy <username> qui permet à un client de savoir si un utilisateur existe ou non dans le domaine :

vrfy lambda
252 2.0.0 lambda
vrfy truc
550 5.1.1 : Recipient address rejected: User unknown in local recipient table

Cette commande est bien utile pour des besoins de mise au point, mais à quoi bon donner aux spammers un moyen simple de trouver ce genre d'informations ?

disable_vrfy_command = yes

va arranger ça :

vrfy lambda
502 5.5.1 VRFY command is disabled

La politesse, Bordel !

On se présente...

SMTP prévoit que les MTA sont polis. Ils se présentent avec la commande EHLO (ou HELO). Il est possible d'éjecter simplement les malpolis en indiquant à Postfix que :

smtpd_helo_required = yes

Voyons :

$ telnet cyrus.nain-t.net 25
Trying 192.168.10.7...
Connected to cyrus.nain-t.net.
Escape character is '^]'.
220 cyrus.nain-t.net ESMTP Experimental
MAIL FROM: <machin@truc.com>
503 5.5.1 Error: send HELO/EHLO first

Un dialogue « bcbg »

Postfix permet de placer des restrictions plus ou moins serrées lors du dialogue SMTP, principalement sur les commandes MAIL FROM: et RCPT TO:, ainsi que sur l'adresse IP du client.

smtpd client restrictions

Le paramètre smtpd_client_restrictions permet de contrôler qui se connecte à notre MTA. Par défaut, ce paramètre n'applique aucune restriction.

Nous pouvons vérifier que les clients ne sont pas référencés sur des « blacklists » réputées :

smtpd_client_restrictions = 
    permit_mynetworks,                                # Nous faisons confiance aux clients de notre réseau
    reject_rbl_client blackholes.easynet.nl,          # mais pas à ceux qui sont "blacklistés"
    reject_rbl_client cbl.abuseat.org,
    reject_rbl_client proxies.blackholes.wirehub.net,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client sbl.spamhaus.org,
    reject_rbl_client dnsbl.njabl.org,
    reject_rbl_client list.dsbl.org,
    permit

Les règles sont lues de gauche à droite (de haut en bas dans notre façon de l'écrire) et la première règle vérifiée est la bonne. Les autres sont donc ignorées. Ici, les réseaux spécifiés dans $mynetworks sont permis et dans ce cas, le filtrage n'ira pas plus loin. En revanche, si le client qui se connecte n'est pas dans $mynetworks, Postfix va vérifier qu'il n'est référencé dans aucune des « blacklists » indiquées avant de lui permettre (permit en fin de liste) de se connecter.

Le principe de ces listes est simple. Postfix va effectuer une requête dns inverse (rdns) à partir de l'adresse IP du client, inversée et apposée au domaine annoncé de la liste noire :

$ host 95.57.127.82.sbl.spamhaus.org

Si la réponse est :

Host 95.57.127.82.sbl.spamhaus.org not found: 3(NXDOMAIN)

C'est que l'adresse 82.127.57.95 n'est pas référencée. Si au contraire, la réponse est :

95.57.127.82.sbl.spamhaus.org has address 82.127.57.95

C'est que l'adresse 82.127.57.95 est référencée. Le client sera alors rejeté.

Nous pouvons utiliser plusieurs blacklists, au détriment des ressources consommées sur le serveur, au risque de voir ces clients rejetés par erreur… Le postmaster doit donc rester attentif.

smtpd sender restrictions

La commande MAIL FROM: doit indiquer l'adresse (de messagerie) de l'émetteur du message. Nous pouvons vérifier certaines choses à ce niveau et nous allons le faire, par l'intermédiaire de la directive smtpd_sender_restrictions :

smtpd_sender_restrictions = 
    permit_mynetworks,                                 # Nous faisons confiance aux clients de notre réseau
    reject_non_fqdn_sender,                            # machin@chose ne passera pas
    reject_unknown_sender_domain,                      # machin@truc.tld ne passera pas
    permit

smtpd recipient restrictions

Ces restrictions touchent à ce qu'il y a dans la commande RCPT TO:. La valeur par défaut (permit_mynetworks, reject_unauth_destination) est acceptable, mais il est possible de restreindre d'avantage. Voyez la documentation de Postfix officielle ou sa traduction en français pour plus de détails.

Vérifions...

Nous avons désormais un main.cf qui ressemble à ceci :

smtpd_banner = $myhostname ESMTP Experimental
disable_vrfy_command = yes
smtpd_helo_required = yes
smtpd_sender_restrictions = 
    permit_mynetworks,
    reject_non_fqdn_sender
    reject_unknown_sender_domain,
    permit

smtpd_client_restrictions = 
    permit_mynetworks,
    reject_rbl_client blackholes.easynet.nl,
    reject_rbl_client cbl.abuseat.org,
    reject_rbl_client proxies.blackholes.wirehub.net,
    reject_rbl_client bl.spamcop.net,
    reject_rbl_client sbl.spamhaus.org,
    reject_rbl_client dnsbl.njabl.org,
    permit

biff = no
append_dot_mydomain = no
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
myhostname = cyrus.nain-t.net
myorigin = $myhostname
mydestination = $mydomain, $myhostname, localhost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
relayhost = 
mynetworks = 127.0.0.0/8 192.168.0.0/24
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
home_mailbox = Maildir/

Depuis un client de l'internet, nous allons, en passant par le SMTP du fournisseur de ce client, envoyer un message à lambda@nain-t.net. Observons les logs sur cyrus.nain-t.net :

Jun  4 11:24:54 cyrus postfix/smtpd[21077]: connect from smtp21.orange.fr[80.12.242.49]
Jun  4 11:24:55 cyrus postfix/smtpd[21077]: B230A67D9D: client=smtp21.orange.fr[80.12.242.49]
Jun  4 11:24:55 cyrus postfix/cleanup[21082]: B230A67D9D: message-id=<48465F65.4020809@eme-enseignement.fr>
Jun  4 11:24:55 cyrus postfix/smtpd[21077]: disconnect from smtp21.orange.fr[80.12.242.49]
Jun  4 11:24:55 cyrus postfix/qmgr[21075]: B230A67D9D: from=, size=1243, nrcpt=1 (queue active)
Jun  4 11:24:55 cyrus postfix/local[21083]: B230A67D9D: to=, relay=local, delay=0.98, delays=0.96/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Jun  4 11:24:55 cyrus postfix/qmgr[21075]: B230A67D9D: removed

C'est bon ça.

Allons lire ce message avec notre oiseau du tonnerre, via Dovecot (code source du message) :

Return-Path: <christian.caleca@exe-enxeignexent.fr>
X-Original-To: lambda@nain-t.net
Delivered-To: lambda@nain-t.net
Received: from smtp21.orange.fr (smtp21.orange.fr [80.12.242.49])
	by cyrus.nain-t.net (Postfix) with ESMTP id B230A67D9D
	for <lambda@nain-t.net>; Wed,  4 Jun 2008 11:24:54 +0200 (CEST)
Received: from me-wanadoo.net (localhost [127.0.0.1])
	by mwinf2121.orange.fr (SMTP Server) with ESMTP id 46CF01C004ED
	for <lambda@nain-t.net>; Wed,  4 Jun 2008 11:24:54 +0200 (CEST)
Received: from jupiter.eme.org (LSt-Amand-152-32-18-95.w82-127.abo.wanadoo.fr [82.127.57.95])
	by mwinf2121.orange.fr (SMTP Server) with ESMTP id 2EDE51C0044A
	for <lambda@nain-t.net>; Wed,  4 Jun 2008 11:24:54 +0200 (CEST)
X-ME-UUID: 20080604092454192.2EDE51C0044A@mwinf2121.orange.fr
Received: from [172.16.129.250] (p-caleca.eme.org [172.16.129.250])
	by jupiter.eme.org (Postfix) with ESMTP id C61C81E3
	for <lambda@nain-t.net>; Wed,  4 Jun 2008 11:24:53 +0200 (CEST)
Message-ID: <48465F65.4020809@eme-enseignement.fr>
Date: Wed, 04 Jun 2008 11:24:53 +0200
From: Christian Caleca <christian.caleca@exe-enxeignexent.fr>
User-Agent: Thunderbird 2.0.0.14 (Windows/20080421)
MIME-Version: 1.0
To: lambda@nain-t.net
Subject: Test lointain
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 8bit

Et ça passe :p

Notre MTA est devenu aussi MX et nous pouvons désormais recevoir des messages depuis le monde.