Installation et essais

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

Plate-forme de tests

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.

Configuration « deBase »

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.

master.cf

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.

main.cf

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) ;
  • la valeur de 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.

Envoi local

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 :

  1. Le message de notification signale qu'il y a un « postmaster@cyrus.nain-t.net ». Ce compte n'existe pas et il n'est pas forcément bon qu'il existe réellement. Cependant, il faudrait pouvoir traiter les messages pour « postmaster », en les envoyant à quelqu'un d'autre. « root » par exemple ?
  2. « root » reçoit des messages, c'est bien et c'est mal. Root a d'autres choses à faire que d'ouvrir son compte pour lire une messagerie. Nous ne sommes pas ici sous certains systèmes peu sécurisés et l'identité « root », nous le savons, ne doit être utilisée que lorsque c'est absolument nécessaire, certainement pas pour consulter des messages.

Il serait bon que les messages adressés à « root » soient redirigés sur un compte sans privilèges particuliers. Comment réaliser ceci ?

Les alias

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 :

  • les messages pour « postmaster » seront transmis à « root » ;
  • les messages pour « root » seront transmis à « prof » (puisque « prof » qui n'a pas de privilèges particuliers.

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.

Envoi ailleurs

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: removed
C'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=48825971
Après établissement de la connexion TCP (trames 1 à 3) qui se passe normalement, nous voyons que :

  1. Entre les trames 3 et 4, nous avons 60 secondes d'attente…
  2. Entre les trames 10 et 11, nous avons 90 secondes d'attente…
  3. Le message de la trame 11 « I do not like your reverse » n'est pas très poli, mais explicite…

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 :

  1. un enregistrement A qui indique l'adresse IP (publique, bien sûr) de notre serveur ;
  2. un enregistrement MX qui indique le nom de notre MTA. Nous lui mettons la priorité minimale, pour la suite des opérations. Pour l'instant, nous ne gérons pas de boites-aux-lettres @nain-t.net hormis quelques comptes administratifs, donc nous ne devrions rien recevoir de l'internet (à part du spam, éventuellement) ;

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.

1)
Nous aurions pu aussi utiliser la commande 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