The Net Wizard HauptseiteISP SetupNetzwerkeVelotourenSoftwareKryptografieVariaPhysik

Postfix

Der nächste Baustein in meinem Setup ist Postfix. Postfix fungiert als Mail Transfer Agent (MTA), ist also für den Empfang und das Versenden von Mails zuständig. Betrachten wir diese beiden Vorgänge einmal etwas detaillierter:

Überblick

Das folgende Schema zeigt, wie Mails transportiert werden, und welche Protokolle dabei vorkommen:
ISP Setup

Als erstes verschickt der Sender ein Mail. Dabei erstellt er eine SMTP Verbindung zu einem Server, der es ihm erlaubt, über ihn Mails zu versenden. Solche Server werden Mail Transfer Agent (MTA) genannt. Der erste MTA macht nun einen DNS request, um den mx Rekord zu finden, der zur Domain der Empfängeradresse gehört. Es kann durchaus vorkommen, dass mehrere MTA's in der Kette vorkommen, bis der eigentlich zuständige Server erreicht wird. Dieser nimmt dann die Mail entgegen und übergibt sie dem Mail Delivery Agent, der sie wiederum abspeichert. Der Empfänger kann die Mail dann mittels seines Mailclients über pop resp. imap anschauen.

Versenden von Mails.

Theoretisch könnte jeder Mailclient seine Mails auch direkt verschicken. Das ist allerdings problematisch, da viele Provider die entsprechenden Ports in ihren Netzen blockieren, um gegen das Aufkommen von unerwünschten Werbemails (Spam) zu wirken. Zudem markieren viele MTAs Mails als Spam, wenn sie von dynamischen Adressen kommen. Aus diesem Grund sind die meisten Mailclients so konfiguriert, dass sie über einen Mailserver relayen. Dabei geschieht folgendes:
  1. Der Client verbindet sich mit dem Server über Port 25 oder Port 587. Dabei sendet er seine Login Daten an den Server. Dies kann wahlweise verschlüsselt oder unverschlüsselt geschehen.
  2. Der Server fragt beim imap daemon an, ob die Login Daten korrekt sind.
  3. Der imad daemon überprüft die Daten mit der Datenbank. Falls die Daten korrekt sind, erlaubt der Server das versenden einer Mail.

Empfangen von Mails.

Im nachfolgenden Diagramm ist der Empfang von Mail schematisch dargestellt: ISP setup
  1. Der lokale Mail Transfer Agent wird von einem anderen Server kontaktiert.
  2. Als erstes wird mittels postgrey nachgefragt, ob in letzter Zeit bereits Mails von der entsprechenden IP Adresse eingegangen sind. Falls das nicht so ist, wird ein temporärer Fehler zurückgegeben. Ein vernünftig konfigurierter Server wird es dann später nochmals versuchen.
  3. Noch während des smtp Dialoges wird untersucht, ob der Empfänger existiert. Diese Information befindet sich in der Datenbank.
  4. Nach dem SMTP Dialog wird das das Mail auf Spam oder Viren untersucht. Dafür ist amavis zuständig, indem er seinerseits spamassassin resp. clamav aufruft.
  5. Falls amavis das Mail für gut befindet, wird es an dovecot übergeben, der als Mail delivery Agent für das Einsortieren in die Mailbox zuständig ist.

Die Konfigurationsdateien.

Die Konfigurationsdateien für postfix sehen folgendermassen aus (die Einträge für die Domain- und Hostnamen müssen natürlich angepasst werden, damit es funktioniert):
  1. main.cf:
    001:
    002:
    003:
    004:
    005:
    006:
    007:
    008:
    009:
    010:
    011:
    012:
    013:
    014:
    015:
    016:
    017:
    018:
    019:
    020:
    021:
    022:
    023:
    024:
    025:
    026:
    027:
    028:
    029:
    030:
    031:
    032:
    033:
    034:
    035:
    036:
    037:
    038:
    039:
    040:
    041:
    042:
    043:
    044:
    045:
    046:
    047:
    048:
    049:
    050:
    051:
    052:
    053:
    054:
    055:
    056:
    057:
    058:
    059:
    060:
    061:
    062:
    063:
    064:
    065:
    066:
    067:
    068:
    069:
    070:
    071:
    072:
    073:
    074:
    075:
    076:
    077:
    078:
    079:
    080:
    081:
    082:
    083:
    084:
    085:
    086:
    087:
    088:
    089:
    090:
    091:
    092:
    093:
    094:
    095:
    096:
    097:
    098:
    099:
    100:
    101:
    #########################################
    # Debian specific configuration options
    #########################################
    queue_directory = /var/spool/postfix
    command_directory = /usr/sbin
    daemon_directory = /usr/libexec/postfix/
    mail_owner = postfix
    debug_peer_list = gmail.com
    debug_peer_level = 2
    sendmail_path = /usr/sbin/sendmail
    newaliases_path = /usr/bin/newaliases
    alias_maps = hash:/etc/aliases hash:/var/lib/mailman/data/aliases
    mailq_path = /usr/bin/mailq
    setgid_group = postdrop
    manpage_directory = /usr/man
    sample_directory = /etc/postfix
    readme_directory = /usr/share/doc/postfix
    unknown_local_recipient_reject_code = 550
    unknown_address_reject_code = 550
    unverified_recipient_reject_code = 550

    #########################################
    # Overall configuration options
    #########################################
    myhostname = mail.example.com
    mydestination = mail.example.com, localhost.example.com, localhost
    mailman_destination_recipient_limit=1
    transport_maps = hash:/etc/postfix/transport
    mydomain = example.com
    #Aliases are in postgres
    virtual_alias_maps = pgsql:/etc/postfix/pgsql-virtual_forwardings.cf, pgsql:/etc/postfix/pgsql-virtual_email2email.cf 
    #Domains are in postfix
    virtual_mailbox_domains = pgsql:/etc/postfix/pgsql-virtual_domains.cf
    #Adreses are in postfix
    virtual_mailbox_maps = pgsql:/etc/postfix/pgsql-virtual_mailboxes.cf
    virtual_mailbox_base = /data/vmail
    virtual_uid_maps = static:5000
    virtual_gid_maps = static:5000
    virtual_mailbox_limit = 20480000

    #Mail delivery through dovecot
    virtual_transport = lmtp:unix:private/dovecot-lmtp

    mynetworks = 127.0.0.0/8 [::1]/128

    # ipv6 setup
    inet_protocols = ipv6, ipv4

    # Filter out
    smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination,
        reject_unknown_recipient_domain,
        reject_unknown_sender_domain,
        reject_non_fqdn_sender,
        reject_unknown_sender_domain,
        check_recipient_access regexp:/etc/postfix/rcpt_access,
        check_policy_service inet:127.0.0.1:10023,
        reject_unverified_recipient,
        permit
    smtpd_client_restrictions =
        check_sender_access hash:/etc/postfix/access
        permit_mynetworks
        sleep 2
        reject_unauth_pipelining
    smtpd_sender_restrictions =
        check_sender_access hash:/etc/postfix/sender-access
    #smtp authentication by dovecot
    smtpd_sasl_type = dovecot
    smtpd_sasl_path = private/auth
    #content filtering
    content_filter = amavis:[127.0.0.1]:10024
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain =
    broken_sasl_auth_clients = yes
    smtpd_sasl_authenticated_header = yes
    smtpd_use_tls = yes
    #TLS settings
    smtpd_tls_security_level = may
    smtp_tls_security_level = may
    smtp_tls_note_starttls_offer = yes
    smtpd_tls_cert_file = /etc/postfix/smtpd_new.cert
    smtpd_tls_key_file = /etc/postfix/smtpd_new.key
    smtpd_tls_loglevel = 1
    smtpd_tls_received_header = yes
    myorigin = mail.example.com
    # section for mailman
    relay_domains = lists.example.com
    minimal_backoff_time = 300
    queue_run_delay = 300
    html_directory = /usr/share/doc/postfix/html
    #Who is allowed to relay
    smtpd_relay_restrictions = permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination,
        reject_unknown_recipient_domain,
        reject_unknown_sender_domain,
        check_recipient_access regexp:/etc/postfix/rcpt_access,
        check_policy_service inet:127.0.0.1:10023
        reject_unverified_recipient
  2. master.cf:
    01:
    02:
    03:
    04:
    05:
    06:
    07:
    08:
    09:
    10:
    11:
    12:
    13:
    14:
    15:
    16:
    17:
    18:
    19:
    20:
    21:
    22:
    23:
    24:
    25:
    26:
    27:
    28:
    29:
    30:
    31:
    32:
    33:
    34:
    35:
    36:
    37:
    38:
    39:
    40:
    41:
    42:
    43:
    44:
    45:
    46:
    47:
    48:
    49:
    50:
    51:
    52:
    53:
    54:
    55:
    56:
    57:
    58:
    59:
    60:
    61:
    62:
    63:
    64:
    65:
    66:
    67:
    68:
    69:
    70:
    71:
    72:
    73:
    #
    # Postfix master process configuration file.  Each line describes how
    # a mailer component program should be run. The fields that make up
    # each line are described below. A "-" field value requests that a
    # default value be used for that field.
    #
    #
    # SPECIFY ONLY PROGRAMS THAT ARE WRITTEN TO RUN AS POSTFIX DAEMONS.
    # ALL DAEMONS SPECIFIED HERE MUST SPEAK A POSTFIX-INTERNAL PROTOCOL.
    #
    # DO NOT CHANGE THE ZERO PROCESS LIMIT FOR CLEANUP/BOUNCE/DEFER OR
    # POSTFIX WILL BECOME STUCK UP UNDER HEAVY LOAD
    #
    # DO NOT CHANGE THE ONE PROCESS LIMIT FOR PICKUP/QMGR OR POSTFIX WILL
    # DELIVER MAIL MULTIPLE TIMES.
    #
    # DO NOT SHARE THE POSTFIX QUEUE BETWEEN MULTIPLE POSTFIX INSTANCES.
    #
    # ==========================================================================
    # service type    private    unpriv    chroot    wakeup    maxproc    command + args
    #         (yes)    (yes)    (yes)    (never)    (50)
    # ==========================================================================
    smtp      inet    n    -    n    -    -    smtpd
    #628      inet    n    -    n    -    -    qmqpd
    pickup      fifo    n    -    n    60    1    pickup
    cleanup      unix    n    -    n    -    0    cleanup
    qmgr      fifo    n    -    n    300    1    qmgr
    #qmgr      fifo    n    -    n    300    1    nqmgr
    rewrite      unix    -    -    n    -    -    trivial-rewrite
    bounce      unix    -    -    n    -    0    bounce
    defer      unix    -    -    n    -    0    bounce
    flush      unix    n    -    n    1000?    0    flush
    smtp      unix    -    -    n    -    -    smtp -o smtp_bind_address=138.201.127.29
    showq     unix    n    -    n    -    -    showq
    error     unix    -    -    n    -    -    error
    local      unix    -    n    n    -    -    local
    virtual      unix    -    n    n    -    -    virtual
    lmtp      unix    -    -    n    -    -    lmtp
    #
    # Interfaces to non-Postfix software. Be sure to examine the manual
    # pages of the non-Postfix software to find out what options it wants.
    # The Cyrus deliver program has changed incompatibly.
    #
    cyrus      unix    -    n    n    -    -    pipe
      flags=R user=cyrus argv=/usr/sbin/cyrdeliver -e -m ${extension} ${user}
    uucp      unix    -    n    n    -    -    pipe
      flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
    ifmail    unix  -       n       n       -       -       pipe
      flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
    bsmtp     unix  -       n       n       -       -       pipe
      flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -d -t$nexthop -f$sender $recipient
    scalemail-backend unix    -    n    n    -    2    pipe
      flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}

    # amavis
    amavis    unix    -    -    n    -    2    smtp    -o smtp_data_done_timeout=1200    -o myhostname=mail.example.com -o smtp_send_xforward_command=yes
    localhost:10025    inet    n    -    n    -    -    smtpd    -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes=    -o smtpd_client_restrictions=    -o smtpd_helo_restrictions=    -o smtpd_sender_restrictions=    -o smtpd_recipient_restrictions=permit_mynetworks,reject    -o mynetworks=127.0.0.0/8    -o strict_rfc821_envelopes=yes    -o myhostname=mail.example.com
    # only used by postfix-tls
    #smtps      inet    n    -    n    -    -    smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
    587      inet    n    -    n    -    -    smtpd -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
    proxymap      unix    -    -    n    -    -    proxymap
    trace      unix    -    -    n    -    0    bounce
    verify      unix    -    -    n    -    1    verify
    relay     unix  -       -       n       -       -       smtp
    #       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
    tlsmgr    unix  -       -       n       1000?   1       tlsmgr
    anvil     unix  -       -       n       -       1       anvil
    scache    unix  -       -       n       -       1       scache
    discard   unix  -       -       n       -       -       discard
    retry     unix  -       -       n       -       -       error
    mailman   unix   -      n       n       -       -       pipe
       flags=FR user=mailman argv=/usr/lib64/mailman/bin/postfix-to-mailman.py
       ${nexthop} ${user}
  3. Interfaces to the database for domains:
    1:
    2:
    3:
    4:
    5:
    user = dbuser
    password = dbpassword
    hosts = localhost
    dbname = dbname
    query = SELECT domain AS virtual FROM domains WHERE domain='%s'
  4. Interfaces to the database for mailboxes:
    1:
    2:
    3:
    4:
    5:
    6:
    7:
    user = dbuser
    password = dbpassword
    hosts = localhost
    dbname = dbname
    table = users
    select_field = concat(email,'/')
    where_field = email
  5. Interfaces to the database for forwardings:
    1:
    2:
    3:
    4:
    5:
    user = dbuser
    password = dbpassword
    hosts = localhost
    dbname = dbname
    query = SELECT destination FROM forwardings WHERE source='%s'

Powered by w3.css