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.
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.
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.
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
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
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.
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.
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
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.
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.