15/11/2011
201111151920 openbsd sendmail
OpenBSD, Free.fr, Hurricane Electric et le courriel
A la faveur d'une réinstallation sauvage de mon Linutop (qui est passé d'un OpenBSD 4.5 à un OpenBSD 5.0), je me suis rendu compte que ma configuration du courriel laissait à désirer.
Les forces en présence:
- mon FAI (free.fr)
- une connectivité ipv6 offerte par HE
- un openbsd et son sendmail livré de base
Openbsd et sendmail
On laisse de côté les sendmail sapu, postfix/exim/qmail/whatever saymieu, seul opensmtp pourrait trouver grâce à mes yeux mais pour l'instant il ne fait pas la réécriture d'entête.
Pas la peine de me ressortir le couplet sendmail saytrouhay, le fichier de conf saymalfay, toussa ... Je sais. Mais s'il y a bien un avantage à sendmail, c'est qu'il est livré de base. Toujours ça de moins à installer. De plus, les dernières failles commencent à dater un peu et la conf livrée par défaut ne transforme pas la machine en passoire.
Tunnel Hurricane Electric
Pas la peine de me parler de l'ipv6 de chez free. Je salue l'initiative, c'est gentil pour faire mumuse mais un /64 ça fait vraiment pingre. Un grand merci à HE qui, en plus de faire du prosel intelligent (leur certification vaut ce quelle vaut, elle a le mérite d'exister, tout comme leur tshirt) accorde gracieusement 5 (oui, cinq) /48.
Réinstall sauvage
Oui, je sais, c'est pas compliqué de mettre à jour un openbsd. Mais je suis une loutre (hum, mon mirroir et ma balance parlent plutôt d'une p....n de grosse loutre mais ce sont de grossiers personnages) et je suis du genre à passer de 4.5 à 5.0 à la faveur d'une coupure électrique.
Les objectifs
Envoyer du courriel en utilisant le smtp de mon FAI. Les entêtes des courriels seront réécrites afin de faire référence à l'adresse email de mon FAI. Faire en sorte que la prochaine réinstall sauvage se passe mieux.
Premier exemple
OSTYPE(openbsd) define(`SMART_HOST', `smtp.free.fr') FEATURE(genericstable, `hash -o /etc/mail/genericstable') FEATURE(`no_default_msa') FEATURE(`local_procmail') DAEMON_OPTIONS(`Family=inet, address=127.0.0.1, Name=MTA') DAEMON_OPTIONS(`Family=inet6, address=::1, Name=MTA6, M=O') MASQUERADE_AS(`free.fr') FEATURE(masquerade_envelope) FEATURE(local_no_masquerade) GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain') MAILER(procmail) MAILER(local) MAILER(smtp)
Compliqué hein ? Quelques explications:
- j'utilise 'openbsd'
- je veux utiliser 'smtp.free.fr' pour envoyer du courriel
- la correspondance adresse locale -> adresse distante est faite à partir du fichier '/etc/mail/genericstable'
- je ne veux pas d'un Mail Submission Agent (pas très utile dans notre cas)
- je veux que le courrier local soit délivré par 'procmail'
- je veux que mon sendmail écoute uniquement sur les adresses "loopback"
- tous les courriels seront réécrit en
@free.fr - toutes les entêtes seront réécrites
- le courrier local ne sera pas impacté
- la définition de 'courrier local' se trouve dans le fichier '/etc/mail/genericsdomain'
- le reste je sais juste qu'il est obligatoire :)
Je passe sous silence le contenu de '/etc/mail/genericstable', il est livré de base et documenté.
Seul soucis avec cette configuration: elle ne fonctionne pas tout à fait. Aucun soucis avec la réécriture des entêtes mais l'utilisation de 'smtp.free.fr' va poser) comme en témoigne les logs:
# extrait /var/log/mailog to=, ctladdr= , relay=smtp.free.fr. [IPv6:2a01:e0c:1:1599::10], stat=Service unavailable DSN: Service unavailable
Solution
- utiliser l'authentification. Il faut activer cette fonctionnalité dans la console de gestion puis modifier notre configuration comme indiqué ici
Je ne vous cache pas que ici, sapamarche. Je ne sais pas ce que j'ai merdoyé et flemme de résoudre.
- une solution un peu plus loutresque:
define(`SMART_HOST', `[212.27.48.4]')
On se dispense de l'authentification à chaque envoi de courriel et les pros du réseau confirmeront qu'il est plus simple/rapide de joindre 212.27.48.4 plutôt que de passer par un tunnel londonien pour atteindre 2a01:e0c:1:1599::10.
Pour finir
Pour me simplifier la vie, un Makefile sans prétention:
MAKEMAP= /usr/libexec/sendmail/makemap
MY!= hostname -s
.SUFFIXES: .mc .cf
DB_FILES= genericstable.db
FILES= genericsdomain
ALL= ${MY}.cf ${DB_FILES} ${FILES}
.mc.cf:
@m4 /usr/share/sendmail/m4/cf.m4 ${.ALLSRC} > $@
all: ${ALL}
clean:
@rm -f ${ALL}
genericstable.db: genericstable
@${MAKEMAP} hash ${.ALLSRC} < ${.ALLSRC}
genericsdomain:
@hostname > $@
install: ${ALL}
@sudo install -g wheel -o root -m 644 ${.ALLSRC} /etc/mail
@echo "You can add the following line in /etc/rc.conf.local:"
@echo "sendmail_flags=\"-L sm-mta -C/etc/mail/${MY}.cf -bd -q30m\""
restart:
@sudo /etc/rc.d/sendmail restart
Le contenu de mon $HOME/etc/mail:
dsx@linutop>ls -l total 12 -rw-r--r-- 1 dsx wheel 619 Nov 14 22:18 Makefile -rw-r--r-- 1 dsx wheel 998 Nov 13 12:51 genericstable -rw-r--r-- 1 dsx wheel 459 Nov 14 22:19 linutop.mc
Le tout en action:
dsx@linutop>make clean && make && make install You can add the following line in /etc/rc.conf.local: sendmail_flags="-L sm-mta -C/etc/mail/linutop.cf -bd -q30m" dsx@linutop>make restart sendmail(ok) sendmail(ok)
Le mot de la fin
Oui, j'ai lu http://wiki.mutt.org/?MuttFaq/Sendmail. Oui les clients de courriels savent dialoguer directement avec un serveur smtp. Alors à quoi bon tous ces efforts ? Tout simplement parce que participer à un projet opensource cela peut commencer par (dmesg; sysctl hw.sensors) | mail -s 'Linutop v3' dmesg@openbsd.org (et continuer avec sendbug(1), okazou).
![Validate my Atom 1.0 feed [Valid Atom 1.0]](/valid-atom.png)
![Validate my RSS feed [Valid RSS]](/valid-rss-rogers.png)