www.Newbie-Net.de

NetBSD Mailserver

Mailserver mit Sendmail/Fetchmail/POP3/Imap und SMTP-AUTH unter NetBSD

Autor: Karsten Kruse

Inhalt

Vorwort

In dieser Anleitung will ich mich mit Sendmail und SMTP-Auth beschäftigen. SMTP-Auth ist in letzter Zeit sehr populär geworden. Dem wollen wir Tribut zollen, indem wir es benutzen. Einige ISPs bieten sogar nichts anderes mehr an, so dass man keine Wahl hat, als sich damit auseinanderzusetzen.

Glücklicherweise haben wir es mit NetBSD gar nicht schwer. Das System bietet uns dank pkgsrc einen einfachen Einstieg. Weil Maillösungen unter unixartigen Systemen typischerweise sehr flexibel sind und eine Fülle an Möglichkeiten bieten, werde ich mich auf einen sehr typischen und einfachen Fall beschränken.

Ein NetBSD-Rechner erledigt die Mail für ein privates LAN und verschickt ausgehende Mail über Sendmail nach außen an ein Mailrelay, das die weitere Auslieferung übernimmt. Eingehende Mail wird mit Fetchmail aus verschiedenen POP3- oder IMAP-Mailboxen auf unseren NetBSD-Rechner geholt. Dort können Clients im LAN die Mail dann via POP3 abholen oder mit IMAP lesen.

Hier ist ein Schema:

       INTERNET                                    LAN
 +-----------------+           +---------------------------------------+
 |                 |           |                                       |
 | +------------+  | Fetchmail |  +----------------+  POP3  +--------+ |
 | | POP3-Konten| --------------> |                | -----> |        | |
 | +------------+  |           |  |                |        |        | |
 |                 |           |  |                |        |        | |
 |                 |           |  | NetBSD-Rechner |        | Client | |
 |                 |           |  |                |        |        | |
 | +------------+  | SMPT-Auth |  |                |  SMTP  |        | |
 | | Mailrelay  | <-------------- |                | <----- |        | |
 | +------------+  |           |  +----------------+        +--------+ |
 |                 |           |                                       |
 +-----------------+           +---------------------------------------+

Die Anzahl der POP3-Konten und Client-Rechner ist egal, da wir alle ausgehende Mail über ein Mailrelay versenden können, unabhängig davon was wir als Absenderadresse in unserer Mail stehen haben. Damit kommen wir auch schon zu der Liste der Anforderungen, die dieser Weg stellt:

Was wir brauchen

Als erstes brauchen wir ein Mailrelay. Die meisten Provider bieten ihren Kunden Mailaccounts, bei denen die Absenderadresse immer die Adresse des Mailaccounts sein muss. Ein Mailrelay arbeitet anders: hier kann man Mail mit jeglicher Absenderadresse abschicken, und das Mailrelay kümmert sich dann um die weitere Auslieferung.

Wie kommt man also an ein solches Mailrelay? Fast alle Provider bieten es an, allerdings muss man schon genau suchen oder sogar nachfragen. Wer gar kein Mailrelay hat kann sich bei einem Provider einen Account mieten.

Als Beispiele möchte ich zwei typische Fälle aufzeigen:
1. Als Kunde bei T-Online kann man z.B. gegen eine monatliche Gebühr deren Mailrelay benutzen.
2. Als Kunde von kleineren Providern, die kein Mailrelay anbieten, kann man sich z.B. für ein kleines Paket bei einem anderen, flexibleren Provider begeistern. Als Beispiel sei hier ganz uneigennützig unser Sponsor (http://www.bw-networx.net/) ans Herz gelegt. ;)

Die meisten Provider bieten das Mailrelay aber umsonst an.

Nachdem wir unser Mailrelay haben, fehlen noch POP3 oder IMAP-Konten für die Clients. Ich habe z.B. von meinem ISP ein Konto, eines bei dem "Umsonst-Anbieter" GMX und ein weiteres, das zu meiner Webseite gehört. Die Anzahl der POP3-Konten ist im Prinzip egal und wird nur durch die verfügbare Bandbreite beschränkt.

Natürlich brauchen wir noch einen installierten NetBSD-Rechner der Zugang zum Internet hat. Außerdem muß auf diesem Rechner pkgsrc installiert sein. Hier nochmal alles im Überblick:

Sendmail/Procmail/Fetchmail und POP3d installieren

Das installieren ist dank pkgsrc ein Spaziergang, für Sendmail gibt es aber etwas zu beachten: weil wir Unterstützung für die SASL- und STARTTLS-Libraries brauchen, fügen wir der Datei /etc/mk.conf folgendes hinzu:

 USE_SASL=YES
 USE_STARTTLS=YES

NetBSDs pkgsrc wird diese Datei auswerten und die entsprechenden Funktionen in Sendmail einbauen. Jetzt können wir alle Pakete installieren, die benötigt werden. Ich gehe davon aus, das pkgsrc auf aktuellem Stand ist und in /usr/pkgsrc installiert wurde:

 cd /usr/pkgsrc/mail/sendmail
 make install
 cd /usr/pkgsrc/mail/procmail
 make install
 cd /usr/pkgsrc/mail/imap-uw
 make install
 cd /usr/pkgsrc/mail/fetchmail
 make install

Die Programme sind installiert, und pkgsrc hat sich um Abhängigkeiten gekümmert. Was bleibt ist die Konfiguration der einzelnen Pakete:

Sendmail konfigurieren

Fangen wir mit Sendmail an, seine Konfiguration ist am schwierigsten. Wir beginnen mit dem einbinden des aus pkgsrc gebauten Sendmail in das System. NetBSD bringt von Haus aus eine Datei /etc/mailer.conf (man mailer.conf) mit, die es ermöglicht, das benutzte Mailpaket zu ändern. Im System sind z.B. die Sendmail- und die Postfix-Suite, welche man benutzt, kann man mit der Datei einstellen. Es handelt sich also um einen Mailwrapper.

Unser Glück ist es, dass der Sendmail den wir aus pkgsrc installiert haben eine fertige mailer.conf mitbringt. Wir benennen einfach die orginal /etc/mailer.conf um und legen dann einen symbolischen Link auf die neue mailer.conf:

 mv /etc/mailer.conf /etc/mailer.conf_orginal
 ln -fs /usr/pkg/share/examples/sendmail/mailer.conf /etc/mailer.conf

Das war es schon. Das System wird ab jetzt den Sendmail aus pkgsrc benutzen. Die Konfigurationsdateien liegen, wie auch vorher schon, in /etc/mail/. Besonders wichtig sind für uns folgende Dateien:

Wir beginnen mit /etc/mail/access und tragen ans Ende der Datei ein, welche Hosts, Domains oder Netzwerkabschnitte unseren NetBSD-Rechner als Mailrelay benutzen dürfen. Üblicherweise sind das unser ganzes Netzwerk und unsere ganze Domain. Meine Domain habe ich .home genannt und sie kann mit DNS auch in meinem Netz aufgelöst werden. Außerdem trage ich noch meinen Netzwerkabschnitt als IP-Bereich ein:

 # Meine Domain ist .home und relay ist erlaubt
 .home       RELAY
 # Mein Netzwerk beginnt mit 192.168.1 und relay ist erlaubt
 192.168     RELAY
 # Loopback darf immer relayen
 127         RELAY

Wer keinen eigenen DNS hat, trägt seine Host/IP-Mappings in die Datei /etc/hosts ein (man hosts). Sendmail erwartet die Daten aus /etc/mail/access als Datenbank, also erstellen wir diese:

 makemap hash /etc/mail/access.db < /etc/mail/access

Als nächstes erstellen wir /etc/mail/authinfo, dort tragen wir die Auth-Informationen ein, die wir benötigen um später Mail erfolgreich über das Mailrelay unseres Providers abzusetzen. Ich zeige als Beispiel meine eigene Datei, natürlich müßt ihr eure eigenen Daten einfügen:

 AuthInfo:mail.bw-networx.net "U:karsten" "P:supergeheim"

AuthInfo:mail.bw-networx.net sagt, dass die folgenden Daten für das Mailrelay mail.bw-networx.net sind, "U:karsten" ist der Username mit dem ich mich anmelde und "P:supergeheim" enthält mein supergeheimes Passwort. Damit nicht jeder diese Daten lesen kann, ändern wir die Rechte der Datei, so daß nur Root sie lesen und schreiben darf. Danach erstellen wir auch daraus eine Datenbank und ändern auch deren Rechte:

 chmod 600 /etc/mail/authinfo
 makemap hash /etc/mail/authinfo.db < /etc/mail/authinfo
 chmod 600 /etc/mail/authinfo.db

Weiter geht es mit der Datei /etc/mail/genericstable. Dort tragen wir die Mappings von internem Usernamen und externer Mailadresse ein. Sagen wir es gibt einen User "karsten" dessen reale Mailadresse kk@irgendwo.com ist. Nehmen wir weiter an, der Host auf dem der User eine Mail schreiben will ist ein Host, der nicht im Internet per Namen aufzulösen ist, z.B. uberhost.home. Würde der User also eine Mail schreiben, wäre der Absender karsten@uberhost.home. Keiner könnte eine Mail von diesem User beantworten, weil der Name im Internet nicht aufzulösen ist.

Also müssen wir die Absenderadresse umschreiben und dazu nehmen wir /etc/mail/genericstable. So könnte sie aussehen:

 karsten:  kk@irgendwo.com
 karl:     kalle@provider.net
 lotta:    lottchen@domain.de

Sendmail erwartet auch diese Datei als Datenbank. Das erledigt der folgende Befehl:

 /usr/sbin/sendmail -bi -oA/etc/mail/genericstable

Als nächstes erstellen wir die Datei /etc/mail/virtusertable und tragen dort die Absenderadressen ein die nicht erst nach draussen gehen sollen weil es einen lokalen User gibt dem diese Adresse gehört.

Als Beispiel: Der User karl sendet eine Mail an kk@irgendwo.com. Normalerweise geht die Mail über das Gateway raus und kommt via fetchmail wieder rein weil kk@irgendwo.com ja in Wirklichkeit der lokale User karsten ist. Warum also erst rausschicken und wieder reinholen? Warum nicht gleich lokal ausliefern?

Genau das macht die /etc/mail/virtusertable.db. Um sie anzulegen tragen wir folgendes in /etc/mail/virtusertable ein:

 kk@irgendwo.com     karsten
 kalle@provider.net  karl
 lottchen@domain.de  lotta

Danach erstellen wir mit folgendem Befehl daraus eine Datenbank:

 makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable

Damit die Einträge aus virtusertable auch funktionieren müssen alle Domainnamen in die Datei /etc/mail/local-host-names eingetragen werden:

 irgendwo.com
 provider.net
 domain.de

Als letztes bleibt noch die Datei /etc/mail/sendmail.cf, die wir mit einigen M4-Macros erstellen. Dazu wechseln wir in das Verzeichnis /usr/pkg/share/sendmail/m4/ und erstellen folgende Datei als mycf.mc:

 divert(-1)dnl
 include(`../m4/cf.m4')dnl
 VERSIONID(`mycf.mc von root')dnl
 OSTYPE(bsd4.4)dnl

 dnl # Ein Kommentar beginnt mit dnl und Anweisungen enden mit dnl
 dnl # Kommando zum Neuerstellen der sendmail.cf:
 dnl # cd /usr/pkg/share/sendmail/m4/ ; m4 mycf.mc > /etc/mail/sendmail.cf

 dnl # Um korrektes Masquerading zu ermöglichen, muß hier unser Hostname rein
 GENERICS_DOMAIN(uberhost.home uberhost)dnl

 dnl # Wir wollen die genericstable benutzen (user zu echter Mailadresse mappen)
 FEATURE(genericstable)dnl
 FEATURE(masquerade_envelope)dnl

 dnl # Hier tragen wir unser Mailrelay ein
 define(`SMART_HOST',`mail.bw-networx.net')dnl

 FEATURE(redirect)dnl
 FEATURE(nocanonify)dnl

 dnl # Das brauchen wir für Fetchmail
 FEATURE(`accept_unresolvable_domains')dnl

 dnl # Einige Mailclients schreiben >mailadresse<

 FEATURE(`accept_unqualified_senders')dnl

 define(`SMTP_MAILER_FLAGS',`e')dnl
 define(`confCON_EXPENSIVE',`True')dnl
 define(`confTO_QUEUEWARN', `16h')dnl
 define(`confDEF_CHAR_SET',`ISO-8859-1')dnl

 dnl # Wir wollen die access.db benutzen (Relaying)
 FEATURE(`access_db',`hash -T<TMPF> /etc/mail/access.db')dnl
 FEATURE(relay_mail_from)dnl

 dnl # Dies stellt sicher das eine /etc/mail/local-host-names beachtet wird
 FEATURE(`use_cw_file')dnl

 FEATURE(`virtusertable',`hash /etc/mail/virtusertable.db')dnl
 define(`confMAX_MESSAGE_SIZE',`10000000')dnl

 dnl # Dies ist für SMTP-Auth
 FEATURE(`authinfo',`hash /etc/mail/authinfo.db')dnl
 define(`confAUTH_MECHANISMS',`CRAM-MD5 DIGEST-MD5 LOGIN PLAIN')dnl

 dnl # Das braucht procmail
 define(`PROCMAIL_MAILER_PATH',`/usr/pkg/bin/procmail')dnl
 FEATURE(local_procmail)dnl

 MAILER(local)dnl
 MAILER(smtp)dnl
 MAILER(procmail)dnl

Geändert werden muß auf jeden Fall GENERICS_DOMAIN und SMART_HOST, nach Bedarf auch MAX_MESSAGE_SIZE. Danach erstellen wir aus dieser Datei mit m4 unsere /etc/mail/sendmail.conf:

 cd /usr/pkg/share/sendmail/m4/
 m4 mycf.mc > /etc/mail/sendmail.cf

Die Warnung "FEATURE(`relay_mail_from') may cause your system to act as open relay." können wir ignorieren weil unser Host erstens von aussen eh durch einen Paketfilter geschützt sein sollte und zweitens nur localhost und unserem internen Netzwerk in /etc/mail/access das Relayen erlaubt wird.

Natürlich gibt es noch viel mehr Möglichkeiten, doch für die meisten Fälle sollte das erstmal reichen. Was die Optionen und Features im einzelnen bedeuten und welche Möglichkeiten noch vorhanden sind, kann man in /usr/pkg/share/sendmail/README nachlesen.

Fetchmail

Fetchmail wird benutzt, um die Mail von Mailboxen, die im Internet sind, auf den lokalen Rechner zu holen und sie den verschiedenen Usern zuzuordnen. Gesteuert wird Fetchmail durch eine Konfigurationsdatei /root/.fetchmailrc, deren Rechte sehr restriktiv eingestellt werden müssen. Der Inhalt der Datei erklärt sich fast von allein:

 set postmaster "postmaster"
 set daemon 300              # wir holen alle 300Sekunden Mail
 set syslog                  # wir loggen ins syslog
 set bouncemail
 set properties ""
 # Hier ist der erste Eintrag
 poll mail.netbeat.de protocol POP3
        user "tecneeq" password "geheim" to karsten
 # Von gmx.net holen wir für mehrere User
 poll pop.gmx.net protocol POP3
        user "1827063" password "secret" to karsten
        user "8118233" password "ratemal" to karl
        user "1656124" password "unsichtbar" to lotta

Wenn man keine Flatrate zum Internet hat, sollte man den Eintrag "set daemon" auskommentieren. Er sagt fetchmail, daß es sich nach dem Abholen nicht beenden soll, sondern im angegeben Intervall wieder aufwacht.

Die Usereinträge sollten klar sein. Ich werde beispielhaft den ersten erklären: "poll mail.netbsd.de" gibt den Server an auf dem das Mailkonto liegt, "protokol POP3" gibt POP3 als Format an. Fetchmail unterstützt auch andere wie man in man fetchmailrc nachlesen kann. Danach kommt der Username auf dem entfernten Rechner und sein Passwort. "to karsten" schließlich sagt, daß die Mail in das Mailfach von karsten gelegt werden soll. Der User karsten kann sie sich später z.B. mit POP3 von dort abholen oder lokal lesen.

Schließlich müssen wir noch sicherstellen, daß die Rechte der Datei /root/.fetchmailrc richtig eingestellt sind, weil Fetchmail seine Arbeit sonst verweigert:

 chmod 600 /root/.fetchmailrc

Fertig.

POP3 und IMAP konfigurieren

Den POP3d und den IMAPd von der Universität Washington zu konfigurieren, ist keine große Schwierigkeit. Die Installation ist so gestaltet, dass wir beides Dienste direkt benutzen können ohne besondere Einstellungen vorzunehmen. Einzig einige Einträge in /etc/inetd.conf müssen vorgenommen werden:

 imap    stream  tcp  nowait  root  /usr/pkg/libexec/imapd   imapd
 #imaps  stream  tcp  nowait  root  /usr/pkg/libexec/imapd   imapd
 #pop2   stream  tcp  nowait  root  /usr/pkg/libexec/ipop2d  ipop2d
 pop3    stream  tcp  nowait  root  /usr/pkg/libexec/ipop3d  ipop3d
 #pop3s  stream  tcp  nowait  root  /usr/pkg/libexec/ipop3d  ipop3d

Hier habe ich die Rauten vor imap und pop3 schon entfernt. Nach einem Neustart von Inetd können die Dienste schon benutzt werden:

 /etc/rc.d/inetd restart

Zusammenspiel und Systemstart

Nachdem wir jetzt alles installiert haben und die grundsätzlichen Konfigurationen geschrieben haben, bleibt uns nur noch die Dienste so einzurichten, dass sie auch beim Systemstart ordentlich gestartet werden.

Für Inetd und Sendmail reichen Einträge in /etc/rc.conf. Sendmail geben wir als Argument noch das Intervall mit, in dem ausgehende Mail verschickt werden soll:

 inetd=YES
 sendmail=YES
 sendmail_args="-bd -q1m"

Den Start von Fetchmail erledigen wir in /etc/rc.local:

 if [ -f /usr/pkg/bin/fetchmail ]; then
        /usr/pkg/bin/fetchmail --fetchmailrc /root/.fetchmailrc &
 fi

Wer keine Flatrate hat, möchte Fetchmail eventuell via cron oder von einem ppp-script starten lassen.

Testen

Zum Testen starten wir erstmal Sendmail und Inetd (damit ja auch POP3d und IMAPd). Fetchmail wird erst gestartet, nachdem alles andere funktioniert:

 /etc/rc.d/sendmail restart
 /etc/rc.d/inetd restart

In diesem Fall schreibe ich restart falls die Dienste schon gestartet waren. Wenn nicht, tut das auch nicht weh. :)

Jetzt schreiben wir eine erste Testmail mit Telnet. Auf dem NetBSD-Rechner geben wir also ein:

 telnet localhost 25

Wenn alles geklappt hat, sollten wir jetzt mit Sendmail verbunden sein und folgendes lesen können:

 karsten@uberhost:~> telnet localhost 25
 Trying ::1...
 telnet: connect to address ::1: Connection refused
 Trying 127.0.0.1...
 Connected to localhost.
 Escape character is '^]'.
 220 uberhost.newbie-net.de ESMTP Sendmail 8.12.6; Tue, 4 Mar 2003 15:29:50 +0100 (CET)

Wir melden uns am Server mit unserem Hostnamen an:

 HELO localhost

Und bekommen als Antwort:

 250 uberhost.newbie-net.de Hello IDENT:karsten@localhost [127.0.0.1], pleased to meet you

Jetzt beginnen wir mit einer Testnachricht. Als erstes geben wir eine Absenderadresse ein:

 MAIL FROM:testuser@test.org

Sendmail antwortet:

 250 2.1.0 testuser@test.org... Sender ok

Jetzt die Zieladresse:

 RCPT TO:tecneeq@gmx.net

Auch das bestätigt Sendmail:

 250 2.1.5 tecneeq@gmx.net... Recipient ok

Mit DATA sagen wir Sendmail, dass jetzt die eigentliche Nachricht kommt:

 DATA

Sendmail erklärt, dass wir jetzt unsere Nachricht eingeben können und dann mit einem einzelnen Punkt auf einer Zeile die Nachricht beenden müssen.

 354 Enter mail, end with "." on a line by itself

Hier also unsere Eingabe:

 bla,bla,bla
 .

Was Sendmail auch gleich bestätigt. Die Nachricht ist komplett und wird versendet.

 250 2.0.0 h24EToFQ012002 Message accepted for delivery

Wir verabschieden uns:

 QUIT

Sendmail beendet die Verbindung:

 221 2.0.0 uberhost.newbie-net.de closing connection
 Connection closed by foreign host.

Wenn alles klappt, wird kurze Zeit später die Nachricht eintreffen. Diesen Test sollten wir auch von einem Clientrechner ausprobieren. Unter Windows benutzt man dazu auch einfach Telnet, welches aus einer Dos-Box gestartet wird.

Jetzt können wir Fetchmail starten. Abgeholte Mail sollte ordentlich in die Usermailboxen einsortiert werden:

 /usr/pkg/bin/fetchmail --fetchmailrc /root/.fetchmailrc

Durch Anzeigen der Logdatei für Mailangelegenheiten überprüfen wir, daß alles ordentlich funktioniert:

 less /var/log/maillog

Nachwort

Das war es schon. Alle beteiligten Programme sollten jetzt ohne Probleme laufen. Man sollte abschließend mit einem Paketfilter sicherstellen, dass die Ports 25 (smtp), 110 (pop3) und 143 (imap) nicht vom Internet aus zu erreichen sind. Die Clients einzurichten sollte nicht schwerfallen. Happy Mailing.

Kommentare, Wünsche und Anträge an Karsten Kruse tecneeq(at)tecneeq(dot)de.