Postfix MTA setup handbuch -------------------------- Weil das _richtige_ Einrichten eines MTA nicht ganz so einfach ist, werd ich den Vorgang ein bisschen dokumentieren - zumindest für Postfix 2.3/2.4. Ich werde main.cf, master.cf und das Zeug in maps/ kurz ansprechen. Auch werde ich nur einige grundlegende Einstellungen ansprechen. Das ist ausserdem keine Schritt-für-Schritt-Anleitung, ich garantiere nicht, dass das überhaupt funktioniert oder sogar so, wie man sich das vorstellt. Ich ewarte von den Lesern, dass sie GENAU WISSEN, was sie machen. Nicht beschweren, wenn es nicht hinhaut, weil man die Warnung ignoriert. Dieses Handbuch richtet sich an Experten - als Nachschlagewerk Erwähnen sollte ich auch noch folgendes: Dieses Setup kommt ohne externe Datenquellen aus wie Blacklisten und dergleichem. Euer satmd 2011-05-21 15:34 CEST ------------------------------------------------------------------------------- ############################ ### /etc/postfix/main.cf ### ############################ # Wir möchten keine Mail für nicht existierende Benutzer annehmen (5xx) unknown_local_recipient_reject_code = 550 # Nur diese Maschine selbst darf Mail nach aussen weiterleiten (relayen) - und # angemeldete Benutzer mynetworks_style = host mynetworks = 127.0.0.1 # Mail in Maildir - weils einfach besser ist home_mailbox = .maildir/ # VRFY erlaubt es, die Existenz einer Mailbox zu prüfen, OHNE eine Mail zu # verfassen. Naja, Spammer werden wohl trotzdem senden disable_vrfy_command = yes # Wir verlangen von Sendern ein EHLO/HELO smtpd_helo_required = yes # Wir sollten die Verschlüsselung eventuell auch in Received:-Kopfzeilen # erwähnen smtpd_tls_received_header = yes # SMTP-Anmeldung aktivieren # In meinem Fall benutze ich Dovecot für SASL smtpd_sasl_auth_enable = yes smtpd_sasl_application_name = smtpd smtpd_sasl_local_domain = $myhostname smtpd_sasl_security_options = noanonymous # Die nächste Zeile wird ausschliesslich wegen so mancher kaputten Version von # Microsoft Outlook benötigt, die es nicht gebacken kriegt, den AUTH reply zu # lesen. Vermutlich kein großer Verlust für die Menschheit, wenn ich das AUS # lasse :P broken_sasl_auth_clients = yes # Wir möchten, dass der Empfänger den Benutzernamen des Absenders sehen kann smtpd_sasl_authenticated_header = yes # Spezielle Einstellungen für Dovecot SASL smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth # *_restrictions sind das Herz von Postfix, weil sie entscheiden, wie Postfix # mit Mail umgeht: annehmen, zurückhalten, umleiten, abweisen. Wenn keine # Regel greift, wird Postfix "OK" nehmen # permit_sasl_authenticated ..... Erlaube, angemeldeten Usern, weiterzumachen # permit_mynetworks ............. Rechner aus mynetwork dürfen weitermachen # reject_unknown_client_hostname. Rechner abweisen, deren ip keinen # reverse-dns-Eintrag hat # check_client_access ........... In einer Tabelle nachschlagen # reject_unknown_sender_domain .. Überprüfung der Domain der Absenderadresse # reject_non_fqdn_sender ........ Wir sind im Internet, also erwarten wir von # anderen Rechnern im Netz einen FQDN-Hostname # check_policy_services ......... Damit kann man einen Policy-Dämon ansprechen # reject_unauth_destination ..... Mail ablehnen, für die wir nicht das Ziel # sind (relaying) ohne Anmeldung # reject_unauth_pipelining ...... Man darf keine Befehle senden, bevor der # vorige abgearbeitet ist ohne Anmeldung # check_helo_access ............. EHLO/HELO in einer Tabelle nachschlagen # reject_invalid_helo_hostname .. Ablehnen, wenn im EHLO/HELO ungültige # Zeichen sind # reject_non_fqdn_helo_hostname . EHLO/HELO muss FQDN-Form haben # reject_unknown_helo_hostname .. Ablehnen, wenn kein DNS Hostname vorhanden # ist. Spielt eventuell eine Rolle fuer den # Fall, dass Postfix eine IP als FQDN # akzeptieren würde # reject_unverified_recipient ... Mail ablehnen, bei welcher wir die Existenz # des Empfängers nicht verifizieren können # oder dessen Empfänger-Account schlicht nicht # existiert. Empfehlenswert, wenn man kein # Backup MX ist - wie weit sich das nämlich # verträgt hab ich nicht ausgetestet. Diese # Option verhindert, dass Postfix eine Mail an # den Sender schickt, wenn er den Empfänger # nicht rechtzeitig überprüfen kann. Solche # rückgesendeten Mails nennt man Backscatter - # ärgerlich, wenn der Absender von vorneherein # gefaket war (Vgl: Brief mit zuwenig Porto) # CLIENT Hostname/IP prüfen smtpd_client_restrictions = permit_sasl_authenticated permit_mynetworks reject_unknown_client_hostname check_client_access cidr:/etc/postfix/maps/access_cidr_map check_client_access hash:/etc/postfix/maps/access_map check_client_access regexp:/etc/postfix/maps/access_regexp_map # Den Sender aus MAIL FROM: prüfen (nicht zwingend der gleiche aus From:) smtpd_sender_restrictions = reject_authenticated_sender_login_mismatch permit_mynetworks permit_sasl_authenticated #reject_unknown_sender_domain reject_non_fqdn_sender # Empfänger überprüfen smtpd_recipient_restrictions = permit_sasl_authenticated permit_mynetworks # check_policy_service unix:private/policy-spf reject_unauth_destination reject_unauth_pipelining # reject_unverified_recipient # EHLO/HELO prüfen smtpd_helo_restrictions = permit_sasl_authenticated permit_mynetworks check_helo_access hash:/etc/postfix/maps/helo_map reject_invalid_helo_hostname reject_non_fqdn_helo_hostname reject_unknown_helo_hostname # Man kann auch Kopfzeilen überprüfen header_checks = regexp:/etc/postfix/maps/header_checks # Wozu das genau dient, weiss ich nicht mehr. Ich glaube aber, dass mein # Postfix mit 4xx geantwortet hatte, wenn es den Empfänger nicht gab. unknown_local_recipient_reject_code = 550 # Hier kann man Mail-Adressen mit Benutzern verknüpfen oder Weiterleitungen # eintragen virtual_alias_maps = hash:/etc/postfix/maps/virtuals virtual_mailbox_maps = $virtual_alias_maps # Der Syntax fuer Aliase in virtuals ist # Neben den Aliasen muss fuer JEDE virtuals-Domain ein Eintrag der Form # angelegt werden, sonst erhaelt man "relay access denied" # Domains, die durch den Relay-Transport müssen, sollten hier rein # z.B. mailmans lists.example.com, wenn man den mailman:-Transport benutzt #relay_domains = # Hier wird dann eine domain mit einem Transport verknüpft transport_maps = hash:/etc/postfix/maps/transport # Hiermit bringen wir Postfix dazu, dass Benutzer nur ihre eigene # eMail-Adressen als Absender benutzen können nach dem Einloggen. # Praktischerweise kann man hier auch die virtual-Table nutzen smtpd_sender_login_maps = hash:/etc/postfix/maps/virtuals # Diese Zeile bezieht sich auf die Annahme von Mail direkt vom System ohne # TCP/IP für nicht extra-eingeloggte Clients (sendmail-binary). Effektiv soll # Apache keine Mails rausschicken ohne Login. authorized_submit_users = !apache, static:all # Einen MDA verwenden (dazu auch die procmail hinweisdatei lesen) # mailbox_command = /usr/bin/procmail -a "$EXTENSION" ############################## ### /etc/postfix/master.cf ### ############################## # Solange der smtpd in einer Chroot lief, funktionierte bei mir garnichts # Vermutlich ein Problem mit Pfaden, die extern vom Chroot liegen smtp inet n - n - - smtpd # Definition für einen Transport mailman:, das benutzte Script ist bei Debian # dabei, jedoch nicht bei Gentoo. Ich habe es manuell aus dem Netz reinkopiert # und angepasst mailman unix - n n - - pipe flags=FR user=mailman argv=/usr/lib/mailman/bin/postfix-to-mailman-2.1.py ${nexthop} ${user} # Ein Beispiel für einen Policy-Dämon policy-spf unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/postfix-policyd-spf.pl ################################## ### /etc/postfix/maps/Makefile ### ################################## # Immer, wenn ich eine Map ändere, müsste ich die .db-Datei neu generieren. So # mach ich nur "make" und das Makefile übernimmt mir die Arbeit. .PHONE: FORCE .SILENT: all: access_map.db access_regexp_map.db header_checks.db helo_map.db transport.db virtuals.db access_cidr_map.db postfix reload %.db: % FORCE echo -n "Compiling $< ... " -postmap $< echo "done" FORCE: ################################## ### /etc/postfix/maps/* (maps) ### ################################## # Eigentlich empfehle ich hierzu nur die Manual-Seiten zu "access", # "transport", "virtual", ... diese Erklären nänlich auch die ACTIONs # Trotzdem gebe ich mal ein paar Beispiele an: # zum Beispiel kann man header_checks benutzen, um kaputte und angreifbare # Mail-Clienten auszusperren, wie einige ältere SquirrelMail-Versionen # Ich habe hier eine regex:-Tabelle, statt Leerzeichen bitte \s nehmen! /^User-Agent:\s\s*SquirrelMail\/1\.4\.[34]/ HOLD /^X-Mailer:\s\s*SquirrelMail\/1\.4\.[34]/ HOLD # oder in helo_map kann man alle Hostnamen eintragen, die dem Rechner SELBST # gehören und die wir nie von anderen Rechnern empfangen sollten localhost REJECT You are not me. # und die transport-Map funktioniert so: lists.example.com mailman: # Für die anderen Tabellen empfehle ich die Manual-Seiten, lohnt sich.