newaliases
sans arguments, à la condition que le fichier d'aliases soit indiqué dans la configuration de Postfix avec le paramètre alias_database
, ce qui est notre cas présentNous faisons ici une installation de base, qui sera avant tout destinée à pouvoir envoyer nos e-mails vers le monde et accessoirement gérer quelques boites-aux-lettres de service, juste pour voir comment Postfix gère les messages entrants. Nous n'attendons pas ici de messages provenant de l'internet.
Nous avons donc une machine nommée cyrus.nain-t.net (vous comprendrez beaucoup plus loin pourquoi elle se nomme comme ceci). Elle est animée par une Debian stable (Etch à l'heure où ces lignes sont écrites).
Le domaine nain-t.net
est un « vrai » domaine, ne l'oublions pas, ceci aura son importance dans la suite.
aptitude install postfix
Lors du post-install
, vous pouvez laisser Postfix « non configuré », mais le choix de « Site Internet » vous permettra de disposer d'une base de configuration.
Il y a deux fichiers importants dans la configuration de postfix et quelques autres dont l'importance varie en fonction de ce que l'on souhaite faire.
Ce fichier contient des informations diverses sur le comportement de Postfix et sa façon de faire résider les différents « daemons » en mémoire. Nous ne nous en occuperons pas pour l'instant.
Ce fichier contient la configuration principale de Postfix. Dans le cadre de ce que nous voulons faire ici, c'est le seul qu'il nous faudra manipuler dans un premier temps.
Voici ce que nous mettons dans /etc/postfix/main.cf
(à peine modifié par rapport à ce que l'on obtient en choisissant le mode « site internet ») :
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU) 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 = $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
Ce qui est surligné en bleu concerne TLS, ne nous en préoccupons pas pour l'instant, nous n'aurons pas l'occasion de nous en servir ici.
Pour ce qui est surligné en jaune :
myhostname
représente le nom pleinement qualifié du serveur (le nom qui sera utilisé dans le protocole SMTP avec la commande HELO ou EHLO et aussi pour la construction de l'en-tête des messages passant par le MTA) ;myorigin
est ici identique à celle de myhostname
;mydestination
indique pour quel(s) domaine(s) notre Postfix est le destinataire final. Ici, les adresses considérées comme « locales » seront de la forme @cyrus.nain-t.net ou de la forme @localhost ;mynetworks
indique quelles sont les adresses IP qui sont autorisées à se connecter à ce MTA. Ici, l'adresse locale et le réseau local (192.168.0.0/24 dans l'exemple).
Pour ce qui est surligné en blanc, le fichier /etc/aliases
a son importance, que nous verrons plus tard.
Pour envoyer un message localement, il faut un utilisateur local, qui dispose d'un compte Unix. Nous en créons un qui s'appellera « prof »
adduser prof
Je vous passe les détails de la création de ce compte. Ensuite, il nous faut un outil minimal pour poster un message. mail
fait partie du paquet mailx
. Donc, si ce n'est déjà fait :
aptitude install bsd-mailx
Enfin, « root » va envoyer un message à « prof » :
# mail prof Subject: test Postfix en local Bonjour Prof . Cc:
Dans le fichier de logs /var/log/mail.info
(Sur Debian), nous lisons :
Jun 1 18:09:01 cyrus postfix/pickup[19600]: AF6D367D9E: uid=0 from=<root> Jun 1 18:09:01 cyrus postfix/cleanup[19681]: AF6D367D9E: message-id=<20080601160901.AF6D367D9E@cyrus.nain-t.net> Jun 1 18:09:01 cyrus postfix/qmgr[19601]: AF6D367D9E: from=<root@cyrus.nain-t.net>, size=327, nrcpt=1 (queue active) Jun 1 18:09:01 cyrus postfix/local[19683]: AF6D367D9E: to=<prof@cyrus.nain-t.net>, orig_to=<prof>, relay=local, delay=0.07, delays=0.04/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox) Jun 1 18:09:01 cyrus postfix/qmgr[19601]: AF6D367D9E: removed
Les logs disent que tout s'est bien passé. Notez que lors de la manipulation, nous n'avons pas indiqué de domaine de destination (pas de @quelquechose
). Postfix en a déduit qu'il s'agissait d'utilisateurs locaux et a donc complété avec le contenu de $myorigin
.
Mais où est-ce passé ce message ? Dans /var/mail/
(sur Debian) :
# ls -l /var/mail total 4 -rw------- 1 prof mail 465 2008-06-01 18:09 prof
Voyons :
# cat /var/mail/prof From root@cyrus.nain-t.net Sun Jun 1 18:09:01 2008 Return-Path: <root@cyrus.nain-t.net> X-Original-To: prof Delivered-To: prof@cyrus.nain-t.net Received: by cyrus.nain-t.net (Postfix, from userid 0) id AF6D367D9E; Sun, 1 Jun 2008 18:09:01 +0200 (CEST) To: prof@cyrus.nain-t.net Subject: test Postfix en local Message-Id: <20080601160901.AF6D367D9E@cyrus.nain-t.net> Date: Sun, 1 Jun 2008 18:09:01 +0200 (CEST) From: root@cyrus.nain-t.net (root) Bonjour Prof
C'est bien lui. Le travail de Postfix pour la livraison locale s'arrête là.
Comme nous sommes curieux, que se passerait-il si root envoyait un message à un compte local qui n'existe pas ?
# mail machin Subject: test foireux il n'y a personne ici . Cc:
Et voyons les logs :
Jun 1 18:30:54 cyrus postfix/pickup[19719]: 74C0167D9E: uid=0 from=<root> Jun 1 18:30:54 cyrus postfix/cleanup[19723]: 74C0167D9E: message-id=<20080601163054.74C0167D9E@cyrus.nain-t.net> Jun 1 18:30:54 cyrus postfix/qmgr[19717]: 74C0167D9E: from=<root@cyrus.nain-t.net>, size=329, nrcpt=1 (queue active) Jun 1 18:30:54 cyrus postfix/local[19725]: 74C0167D9E: to=<machin@cyrus.nain-t.net>, orig_to=<machin>, relay=local, delay=0.07,delays=0.04/0.01/0/0.01, dsn=5.1.1, status=bounced (unknown user: "machin") Jun 1 18:30:54 cyrus postfix/cleanup[19723]: 80E9767D9F: message-id=<20080601163054.80E9767D9F@cyrus.nain-t.net> Jun 1 18:30:54 cyrus postfix/qmgr[19717]: 80E9767D9F: from=<>, size=2093, nrcpt=1 (queue active) Jun 1 18:30:54 cyrus postfix/bounce[19726]: 74C0167D9E: sender non-delivery notification: 80E9767D9F Jun 1 18:30:54 cyrus postfix/qmgr[19717]: 74C0167D9E: removed Jun 1 18:30:54 cyrus postfix/local[19725]: 80E9767D9F: to=<root@cyrus.nain-t.net>, relay=local, delay=0.02, delays=0.01/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox) Jun 1 18:30:54 cyrus postfix/qmgr[19717]: 80E9767D9F: removed
C'est du travail sérieux. Comme le destinataire local n'a pas pu être trouvé par Postfix (par le service « local », en fait), Postfix (le service « bounce », en réalité) a envoyé une notification à l'expéditeur (root). Nous devons nous attendre à trouver un fichier /var/mail/root
:
# cat /var/mail/root
From MAILER-DAEMON Sun Jun 1 18:30:54 2008
Return-Path: <>
X-Original-To: root@cyrus.nain-t.net
Delivered-To: root@cyrus.nain-t.net
Received: by cyrus.nain-t.net (Postfix)
id 80E9767D9F; Sun, 1 Jun 2008 18:30:54 +0200 (CEST)
Date: Sun, 1 Jun 2008 18:30:54 +0200 (CEST)
From: MAILER-DAEMON@cyrus.nain-t.net (Mail Delivery System)
Subject: Undelivered Mail Returned to Sender
To: root@cyrus.nain-t.net
Auto-Submitted: auto-replied
MIME-Version: 1.0
Content-Type: multipart/report; report-type=delivery-status;
boundary="74C0167D9E.1212337854/cyrus.nain-t.net"
Message-Id: <20080601163054.80E9767D9F@cyrus.nain-t.net>
This is a MIME-encapsulated message.
--74C0167D9E.1212337854/cyrus.nain-t.net
Content-Description: Notification
Content-Type: text/plain; charset=us-ascii
This is the mail system at host cyrus.nain-t.net.
I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.
For further assistance, please send mail to postmaster.
If you do so, please include this problem report. You can
delete your own text from the attached returned message.
The mail system
<machin@cyrus.nain-t.net> (expanded from <machin>): unknown user: "machin"
--74C0167D9E.1212337854/cyrus.nain-t.net
Content-Description: Delivery report
Content-Type: message/delivery-status
Reporting-MTA: dns; cyrus.nain-t.net
X-Postfix-Queue-ID: 74C0167D9E
X-Postfix-Sender: rfc822; root@cyrus.nain-t.net
Arrival-Date: Sun, 1 Jun 2008 18:30:54 +0200 (CEST)
Final-Recipient: rfc822; machin@cyrus.nain-t.net
Original-Recipient: rfc822; machin
Action: failed
Status: 5.1.1
Diagnostic-Code: X-Postfix; unknown user: "machin"
--74C0167D9E.1212337854/cyrus.nain-t.net
Content-Description: Undelivered Message
Content-Type: message/rfc822
Received: by cyrus.nain-t.net (Postfix, from userid 0)
id 74C0167D9E; Sun, 1 Jun 2008 18:30:54 +0200 (CEST)
To: machin@cyrus.nain-t.net
Subject: test foireux
Message-Id: <20080601163054.74C0167D9E@cyrus.nain-t.net>
Date: Sun, 1 Jun 2008 18:30:54 +0200 (CEST)
From: root@cyrus.nain-t.net (root)
il n'y a personne ici
--74C0167D9E.1212337854/cyrus.nain-t.net--
Tout ceci appelle deux remarques importantes :
Il serait bon que les messages adressés à « root » soient redirigés sur un compte sans privilèges particuliers. Comment réaliser ceci ?
Ici entre en scène le fichier /etc/alias
. Ce fichier va expliquer à Postfix que certains destinataires locaux (et seulement locaux) peuvent être redirigés sur d'autres destinataires locaux (ou distants).
Nous allons faire ceci :
Ainsi un message envoyé à root sera dirigé sur prof et un message pour postmaster sera dirigé sur root, donc sur prof.
Nous créons (ou modifions) le fichier /etc/aliases
comme ceci :
# cat aliases postmaster: root root: prof
C'est bien, mais Postfix n'utilisera pas ce fichier. Il lui faudra un fichier formaté comme indiqué dans main.cf
:
alias_maps = hash:/etc/aliases
L'utilitaire postalias
1), va le faire pour nous :
# postalias hash:/etc/aliases
Ce qui a créé un fichier /etc/aliases.db
, qui n'est pas un simple fichier texte.
Voyons maintenant en envoyant un message à « postmaster » :
# mail postmaster Subject: essai d'aliases postmaster -> prof . Cc:
Le message est bien envoyé à « postmaster » et dans les logs :
Jun 1 19:33:28 cyrus postfix/pickup[19719]: B43F467D9E: uid=0 from=<root>
Jun 1 19:33:28 cyrus postfix/cleanup[19777]: B43F467D9E: message-id=<20080601173328.B43F467D9E@cyrus.nain-t.net>
Jun 1 19:33:28 cyrus postfix/qmgr[19717]: B43F467D9E: from=<root@cyrus.nain-t.net>, size=333, nrcpt=1 (queue active)
Jun 1 19:33:28 cyrus postfix/local[19779]: B43F467D9E: to=<prof@cyrus.nain-t.net>, orig_to=<postmaster>, relay=local, delay=0.06, delays=0.04/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)
Jun 1 19:33:28 cyrus postfix/qmgr[19717]: B43F467D9E: removed
Je vous laisse vérifier dans /var/mail/prof
.
Voilà une bonne chose de faite.
Notre Postfix saurait-il envoyer des messages à des destinataires dans d'autres domaines ? Bien entendu, c'est un vrai serveur SMTP, il sait le faire.
Cependant, lutte anti-spam obligeant, nous allons rencontrer quelques difficultés. Heureusement, nous avons un « vrai » domaine et la possibilité chez notre fournisseur d'accès de personnaliser le « reverse dns »
Exemple avant personnalisation :
~$ host cyrus.nain-t.net lair.nain-t.net has address 82.229.45.192 ~$ host 82.229.41.192 192.45.229.82.in-addr.arpa domain name pointer smg13-1-82-229-45-192.fbx.proxad.net.
C'est pas très bon. Il vaudrait bien mieux avoir :
~$ host 82.229.41.132 192.45.229.82.in-addr.arpa domain name pointer cyrus.nain-t.net.
Et nous allons voir pourquoi.
# mail irp@eme-enseignement.fr Subject: Test distant Avec de la chance... on va passer. . Cc:
Et dans les logs :
Jun 1 20:00:15 cyrus postfix/pickup[19719]: C736067D9E: uid=0 from=<root> Jun 1 20:00:15 cyrus postfix/cleanup[19783]: C736067D9E: message-id=<20080601180015.C736067D9E@cyrus.nain-t.net> Jun 1 20:00:15 cyrus postfix/qmgr[19717]: C736067D9E: from=<root@cyrus.nain-t.net>, size=343, nrcpt=1 (queue active) Jun 1 20:02:46 cyrus postfix/smtp[19791]: C736067D9E: to=<irp@eme-enseignement.fr>, relay=mx3.ovh.net[213.186.33.73]:25, delay=150, delays=0.01/0.01/60/90, dsn=2.0.0, status=sent (250 ok 1212343362 qp 10101) Jun 1 20:02:46 cyrus postfix/qmgr[19717]: C736067D9E: removedC'est passé, mais au bout de 2 minutes 30…
Comme « wireshark » était justement là, nous allons savoir pourquoi :
No. Time Source Destination Protocol Info 1 0.000000 192.168.0.15 213.186.33.73 TCP 40953 > smtp [SYN] Seq=0 Win=5840 Len=0 MSS=1460 TSV=1433613 TSER=0 WS=5 2 0.056990 213.186.33.73 192.168.0.15 TCP smtp > 40953 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460 TSV=48788396 TSER=1433613 WS=9 3 0.057057 192.168.0.15 213.186.33.73 TCP 40953 > smtp [ACK] Seq=1 Ack=1 Win=5856 Len=0 TSV=1433627 TSER=48788396 4 60.158023 213.186.33.73 192.168.0.15 SMTP Response: 220 mx1.ovh.net mx3.ovh.net mx0.ovh.net. You connect to mail14.ha.ovh.net ESMTP 5 60.158074 192.168.0.15 213.186.33.73 TCP 40953 > smtp [ACK] Seq=1 Ack=82 Win=5856 Len=0 TSV=1448653 TSER=48803421 6 60.158336 192.168.0.15 213.186.33.73 SMTP Command: EHLO cyrus.nain-t.net 7 60.216044 213.186.33.73 192.168.0.15 TCP smtp > 40953 [ACK] Seq=82 Ack=27 Win=6144 Len=0 TSV=48803436 TSER=1448653 8 60.216096 213.186.33.73 192.168.0.15 SMTP Response: 250-mx1.ovh.net mx3.ovh.net mx0.ovh.net. You connect to mail14.ha.ovh.net 9 60.216655 192.168.0.15 213.186.33.73 SMTP Command: MAIL FROM:<root@cyrus.nain-t.net> SIZE=580 10 60.310846 213.186.33.73 192.168.0.15 TCP smtp > 40953 [ACK] Seq=268 Ack=115 Win=6144 Len=0 TSV=48803460 TSER=1448667 11 150.278169 213.186.33.73 192.168.0.15 SMTP Response: 250 ok. I do not like your reverse. 12 150.278436 192.168.0.15 213.186.33.73 SMTP Command: Received: from [127.0.0.1] (localhost.nain-t.net [127.0.0.1]) 13 150.341513 213.186.33.73 192.168.0.15 TCP smtp > 40953 [ACK] Seq=327 Ack=704 Win=7168 Len=0 TSV=48825967 TSER=1471183 14 150.357314 213.186.33.73 192.168.0.15 SMTP Response: 250 ok 1212331928 qp 21627 15 150.357489 213.186.33.73 192.168.0.15 SMTP Response: 221 mx1.ovh.net mx3.ovh.net mx0.ovh.net. You connect to mail14.ha.ovh.net 16 150.357929 192.168.0.15 213.186.33.73 TCP 40953 > smtp [RST, ACK] Seq=704 Ack=431 Win=6912 Len=0 TSV=1471203 TSER=48825971Après établissement de la connexion TCP (trames 1 à 3) qui se passe normalement, nous voyons que :
Clairement, le MX d'OVH émet quelques doutes sur la légitimité de notre MTA et nous fait perdre du temps volontairement. Le but poursuivi étant le suivant :
Le jeu d'un « spammer », c'est d'envoyer un maximum de messages en un minimum de temps. Si chaque message doit mettre 2 minutes 30 à passer, ce n'est pas intéressant, le spammer laisse tomber.
Nous ne sommes pas des spammers et nous souhaitons ne pas trop perdre de temps dans l'envoi de nos messages. Aussi allons-nous faire ce qu'il faut pour gagner la confiance du MX OVH. Puisque notre nom de domaine existe et que notre fournisseur d'accès nous permet de personnaliser le « rdns », arrangeons nous pour que la recherche inverse sur notre adresse IP renvoie non pas smg13-1-82-229-45-192.fbx.proxad.net
, mais cyrus.nain-t.net
.
Nous en profitons pour mettre proprement à jour les informations dns. nous devons avoir :
Une fois le rdsn mis à jour:
Jun 2 09:20:06 cyrus postfix/pickup[3926]: A91E2EEA7: uid=0 from=<root>
Jun 2 09:20:06 cyrus postfix/cleanup[3932]: A91E2EEA7: message-id=<20080602072006.A91E2EEA7@cyrus.nain-t.net>
Jun 2 09:20:06 cyrus postfix/qmgr[3924]: A91E2EEA7: from=<root@cyrus.nain-t.net>, size=319, nrcpt=1 (queue active)
Jun 2 09:20:07 cyrus postfix/smtp[3934]: A91E2EEA7: to=<irp@eme-enseignement.fr>, relay=mx3.ovh.net[213.186.33.73]:25, delay=0.9, delays=0.21/0.1/0.24/0.35, dsn=2.0.0, status=sent (250 ok 1212391203 qp 8008)
Jun 2 09:20:07 cyrus postfix/qmgr[3924]: A91E2EEA7: removed
C'est bien mieux.
newaliases
sans arguments, à la condition que le fichier d'aliases soit indiqué dans la configuration de Postfix avec le paramètre alias_database
, ce qui est notre cas présent