====== 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 '' 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 [[http://www.postfix.org|la documentation de Postfix officielle]] ou [[http://postfix.traduc.org|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.