Ich habe bei mir Zuhause einen eigenen kleinen Mailserver stehen, der sich um die Abwicklung der Mails aus meinem ganzen Netzwerk kümmert. Als der alte Server erste Anzeichen seines baldigen ablebens von sich gab, beschloß ich einen neuen Server aufzusetzten. Als Basis habe ich diesmal FreeBSD 5.3(BETA4) genommen. (Der alte Server lief noch mit FreeBSD 4.5-STABLE)
Vorarbeit
Das bei FreeBSD mitgelieferte Sendmail hat einen kleinen Schönheitsfehler. Es ist ohne SASL kompiliert. Es gibt zwei Wege, diesen Umstand zu beheben. Man installiert aus den Ports Sendmail mit SASL oder linkt das mitgelieferte Sendmail gegen SASL. Ich habe mich für letzteres entschieden. Dafür habe ich zuerst Cyrus-SASL2 installiert. Danach habe ich diese drei Zeilen zur /etc/make.conf
hinzugefügt:
SENDMAIL_CFLAGS=-I/usr/local/include -DSASL=2 SENDMAIL_LDFLAGS=-L/usr/local/lib SENDMAIL_LDADD=-lsasl2
Nach einem (langwierigen) make buildworld war nun das Sendmail gegen SASL gelinkt. Dies habe ich einfach mit sendmail -d0.1 < /dev/null
überprüft. Die Ausgabe von Sendmail sollte dann so aussehen:
Version 8.13.1 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF STARTTLS TCPWRAPPERS USERDB XDEBUG
Damit wäre alles vorbereitet. Ich versende meine Mails in der Regel über GMX. Sendmail wird also die Mails über den SMTP-Server von GMX versenden. Der Server von GMX läßt mich Emails nur dann abliefern, wenn er sich sicher ist, daß ich es auch wirklich bin. Hierzu bietet GMX zwei Alternativen. SMTP-after-POP und SMTP-AUTH. Ich habe mich für letzteres entschieden. SMTP-AUTH funktioniert nur mit SASL, deshalb war die kleine Vorarbeit nötig.
Konfiguration mit m4
Nun muß man Sendmail noch zu verstehen geben, was es tun soll. Dies ist der Inhalt meiner /etc/mail/anubis.shadowrun.not.mc
(Das Makefile benutzt als Dateinamen automatisch $(hostname).mc):
divert(0) VERSIONID(`$Id: anubis.shadowrun.not.mc,v 1.2 2004/09/19 22:47:42 fastjack Exp fastjack $‘) OSTYPE(freebsd5) DOMAIN(generic) FEATURE(access_db, `hash -o -T/etc/mail/access’) FEATURE(local_lmtp) FEATURE(mailertable, `hash -o /etc/mail/mailertable’) FEATURE(virtusertable, `hash -o /etc/mail/virtusertable’) define(`confCW_FILE’, `-o /etc/mail/local-host-names’) define(`SMART_HOST’, `mail.gmx.net’) MASQUERADE_AS(`gmx.net’) FEATURE(`local_no_masquerade’) MASQUERADE_DOMAIN(`shadowrun.not’) FEATURE(`masquerade_entire_domain’) FEATURE(`masquerade_envelope’) dnl Process login names through the genericstable FEATURE(`genericstable’) GENERICS_DOMAIN(`shadowrun.not’) FEATURE(`generics_entire_domain’) FEATURE(`authinfo’) FEATURE(`relay_hosts_only’) dnl The group needs to be mail in order to read the sasldb2 file define(`confRUN_AS_USER’,`root:mail’) define(`confDONT_BLAME_SENDMAIL’,`GroupReadableSASLDBFile’) dnl Enable for both IPv4 and IPv6 (optional) DAEMON_OPTIONS(`Name=IPv4, Family=inet’) DAEMON_OPTIONS(`Name=IPv6, Family=inet6, Modifiers=O’) define(`confBIND_OPTS’, `WorkAroundBrokenAAAA’) define(`confNO_RCPT_ACTION’, `add-to-undisclosed’) define(`confPRIVACY_FLAGS’, `authwarnings,noexpn,novrfy’) MAILER(local) MAILER(smtp)
Zusätzliche Konfigurationsdateien
Während mein Login auf allen meinen Rechnern „fastjack“ ist, habe ich bei GMX einen anderen Namen. Das Umschreiben des Benutzernamens übernimmt die genericstable. Der Hostname wird vom Masquerading geändert. In der /etc/mail/genericstable
steht bei mir folgendes:
fastjack mmaciaszek
Nun muß sich Sendmail beim Abliefern der Mails bei GMX noch authentifizieren. Hierzu steht in meiner /etc/mail/authinfo
diese Zeile:
AuthInfo:mail.gmx.net “U:123456” “P:sehrgeheim” “M:CRAM-MD5”
Die „123456“ steht für meine GMX-Kundennummer und „sehrgeheim“ ist stellvertretend für mein Paßwort bei GMX. (Beides habe ich natürlich hier geändert)
Fehlen jetzt noch die Hosts, für die Sendmail Emails relayen soll. Ich habe hier bewußt auf SMTP-AUTH innerhalb des Netzwerkes verzichtet, da einige Hosts (z.B.: die NeXTSTEP-Maschine) ein altes Sendmail ohne SASL und SMTP-AUTH fahren. Diese Hosts stehen in der /etc/mail/relay-domains
. Pro Zeile sollte ein Host stehen. Meine /etc/mail/relay-domains
sieht so aus:
renraku.shadowrun.not nexus.shadowrun.not fuchi.shadowrun.not sprawl.shadowrun.not
Dies wären alle Einstellungen, die nötig sind. Die genericstable
und authinfo
habe ich dann mit makemap(8)
in eine entsprechende Map umgewandelt. Dies geht mit makemap hash genericstable < genericstable
(für die authinfo
muß man entsprechend die Namen ändern). Da sich in der /etc/mail/authinfo
das Paßwort für den SMTP-Server befindet, sollte es nach Möglichkeit nur für root lesbar sein.
Die sendmail.cf
habe erzeugt man dann mit make cf
und make install
in /etc/mail/
. Ein beherztes make restart
startet Sendmail mit der neuen Konfiguration neu. Nun liefert Sendmail nicht-lokale Mails über GMX aus.
Troubleshooting
Falls etwas schiefgegangen ist und es nicht wie gewünscht klappt, sind hier ein paar Tips zum „Debugging“. Falls das Masquerading/Generics nicht wie erwartet funktioniert, kann man Sendmail anweisen eine Email-Adresse durch seine Regeln zu schicken. Dazu muß man Sendmail mit sendmail -bt
im sogenannten „Rule-testing mode“ starten. Da das Umschreiben der Absenderadresse getestet werden soll, muß man dies Sendmail mitteilen. Dies geschieht mit /tryflags HS
. Nun können beliebige Absender-Adressen getestet werden. z.B: /try smtp fastjack
. Sendmail wird nun genau beschreiben, wie es den Absender umschreiben würde, wenn die Mail über SMTP verschickt würde.
Falls der Fehler weniger genau einzugrenzen ist, kann man Sendmail beim SMTP-Dialog über die Schulter schauen. Dazu muß man Sendmail mit sendmail -Am -v -t
starten. Danach erwartet Sendmail, daß man ihm eine Mail incl. Headern zu futtern gibt und mit Strg-D abschließt. Vorausgesetzt der Empfänger der Mail ist über SMTP erreichbar (also nicht lokal), wird Sendmail nun versuchen, diese Mail zuzustellen und gibt dabei die gesamte SMTP-Konversation auf dem Bildschirm aus. Damit sollte man den kniffeligeren Fehlern auf die Spur kommen können.
Eine ähnliche Anleitung für NetBSD hat tecneeq auf Newbie-Net geschrieben.