Externe Mailserver (bis dies in i-MSCP eingebaut ist) mit Backup-MX

  • HOWTO Externe Mailserver (bis dies in i-MSCP eingebaut ist) mit Backup-MX


    DNS Templates anpassen:
    /etc/imscp/bind/parts/db_e.tpl


    Code
    1. $TTL 12H$ORIGIN {DMN_NAME}.@ IN SOA ns1.{DMN_NAME}. postmaster.{DMN_NAME}. (; dmn [{DMN_NAME}] timestamp entry BEGIN. {TIMESTAMP} ; Serial; dmn [{DMN_NAME}] timestamp entry END. 8H ; Refresh 2H ; Retry 7D ; Expire 1D ; Minimum TTL); ns DECLARATION SECTION BEGIN IN NS ns{NS_NUMBER}.{DMN_NAME}.; ns DECLARATION SECTION END; IN MX 10 mail.{DMN_NAME}. ;die naechste Zeile beachten IN MX 20 mx20.{DMN_NAME}.{DMN_NAME}. IN {IP_TYPE} {DMN_IP}www IN {IP_TYPE} {DMN_IP}{DMN_NAME}. IN TXT "v=spf1 a mx {TXT_DMN_IP_TYPE}:{DMN_IP} {TXT_SERVER_IP_TYPE}:{BASE_SERVER_IP} ~all"localhost IN A 127.0.0.1;mail IN {IP_TYPE} {DMN_IP} ;die naechste Zeile beachtenmx20 IN {IP_TYPE} {DMN_IP}; ns A SECTION BEGINns{NS_NUMBER} IN {NS_IP_TYPE} {NS_IP}; ns A SECTION END; CNAME for mail transferimap IN CNAME mailpop IN CNAME mailpop3 IN CNAME mailrelay IN CNAME mailsmtp IN CNAME mail; CNAME for web transferftp IN CNAME www; sub [{SUB_NAME}] entry BEGIN.; sub [{SUB_NAME}] entry END.; dns [{MANUAL_DNS_ID}] entry BEGIN.; dns [{MANUAL_DNS_ID}] entry END.; ctm domain als entries BEGIN.; ctm domain als entries END.


    /etc/imscp/bind/parts/db_master_e.tpl


    Für existierende Domains brauchen wir keine Anpassungen zu machen, dies geschieht automatisch sobald die Zonen aktualisiert werden von iMSCP.


    Nun müssen wir bei den Domains, die einen externen Mailserver haben sollen, unter der DNS Verwaltung in iMSCP GUI "eigenen DNS Records hinzufügen", wir brauchen insgesamt zwei:


    Domain: domain.tld
    Typ: A
    Klasse: IN
    Name: mx10.domain.tld.
    IP-Adresse: IP des externen Mailservers


    Bitte achtet unbedingt darauf, dass der Punkt im Feld Name am Ende wichtig ist!
    Jetz nochmal einen eigenen DNS Record hinzufügen.


    Domain: domain.tld
    Typ: MX
    Klasse: IN
    Priorität: 10
    Zielrechner: mx10.domain.tld.


    Hier bitte auch beachten, dass der Punkt im Feld Zielrechner am Ende nicht vergessen wird.


    Damit hätten wir eine flexible Basis geschaffen, Domains ohne grössere Konflikte auf externe Mailserver zu leiten.
    Da wir ja die DNS Templates angepasst haben, werden alle neuen Domains mit einem MX Record der Priorität 20 erstellt, bei bereits existierenden Domains wird dieser bei nächstem update aktualisiert.
    Nun können wir jeder Zeit externe Mailserver hinzufügen, ob bei neuen oder existierenden Domains, und der externe Mailserver bekommt Priorität 10.


    Da es aber hin und wieder vorkommen kann, dass ein externer Mailserver ausfällt (gerade bei MS Exchange :P), landen die Mails natürlich auf mx20, also unserem Hosting server.
    Um diese fehlgeleiteten Mails trotzdem an ihren Zielort zuzustellen, sobald der Ausfall vorüber ist, konfigurieren wir unseren Server als Backup-MX.


    Wir bearbeiten /etc/postfix/main.cf und fügen die zeile hinzu:
    relay_domains = hash:/etc/postfix/relay_domains
    Diese Änderung reflektieren wir in /etc/imscp/postfix/working/main.cf


    löschen alle domains die einen externen Mailserver haben aus der /etc/postfix/imscp/domains
    Diese Änderung reflektieren wir in /etc/imscp/postfix/working/domains


    Nun erstellen wir eine neue datei /etc/postfix/relay_domains
    In diese Datei packen wir alle Domains rein, die einen externen Mailserver haben mit folgender Syntax:
    domain1.tld OK
    domain2.tld OK
    domain3.tld OK


    Machen wir jetzt Postfix unsere Änderungen an der "virtual domains map" und unsere neu erstellte "relay domains map" bekannt:
    postmap /etc/postfix/imscp/domains
    postmap /etc/postfix/relay_domains
    /etc/init.d/postfix restart


    So, unser Hostingserver bekommt nun ganz normal alle Mails für die lokal vorhandenen Mailboxen, sollte er eine Mail erhalten die keine Mailbox auf unserem Server besitzt, wird Postfix diese auffangen und versuchen sie per MX Record auf den externen Mailserver zuzustellen. Natürlich nur für Domains die in der "relay domains map" gelistet sind, wir wollen ja kein Spam weitersenden.


    Die zu Anfang beschriebene Änderung an den DNS Templates ist wichtig, auch wenn ihr euere Domains extern verwaltet. Denn Postfix fragt den lokalen DNS Server ab um Domains aufzulösen!
    Im Falle, dass ihr euere Domains tatsächlich über externe Nameserver (z.b. die des Registrars) verwaltet, kommt noch ein schritt dazu!. Ihr müsst dort entsprechend die MX Records anpassen:
    mx10. IN A <IP des externen Mailservers>
    mx20. IN A <IP des Hostingservers>
    IN MX 10 mx10.
    IN MX 20 mx20.


    Zwar nicht ganz sinnvoll, aber auch einen externen Mailserver mit dynamischer IP und DynDNS kann man nutzen. In diesem Fall benötigt ihr keinen IN A Record in der DNS Verwaltung, sondern nur den MX Record auf die DynDNS-Adresse des Servers.


    "eigenen DNS Record hinzufügen"
    Domain: domain.tld
    Typ: MX
    Klasse: IN
    Priorität: 10
    Zielrechner: meinhost.dyndns.org.


    Der Punkt am Ende ist auch hier nötig ;)


    bei externen Nameservern:
    mx20. IN A <IP des Hostingservers>
    IN MX 10 meinhost.dyndns.org
    IN MX 20 mx20.


    Da solltet ihr aber bedenken, dass der backup mx um einiges öffter Mails auffängt ;)


    Dieses Howto kollidiert nicht mit Einstellungen des Autoresponders (transport maps) und auch nicht mit Dovecot und Antispam/Amavisd/Spamassassin Howtos, die in diversen Wikis/Foren zu finden sind.
    Wer noch Server mit iSPCP laufen hat, einfach in allen Pfaden imscp gegen ispcp tauschen (jaja, ich habe noch ein paar ispcp server). Und bitte kopiert nicht die DNS Templates aus dem Forum, übernehmt die Anpassungen von Hand, denn diese können sich je nach iMSCP/iSPCP Version unterscheiden.


    Wir haben mehrere produktive Server laufen mit diesem Setup, es funktioniert sehr zuverlässig, mehrere Hundert Domains gemischt mit und ohne externe Mailserver. Dennoch übernehme ich keinerlei Verantwortung.

    Edited once, last by flames ().

  • hab da noch ein kleines script gebastelt um die postmaps zu aktualisieren. verbesserungsvorschläge willkommen.
    bash ./script.sh domain.tld enable|disable


    [code=php]#!/bin/bash
    #mxrelay.sh


    DIR="/etc/postfix"
    ARGS=("$@")
    SYNTAX="\n
    ╔══════════════════════════════════════════════════════════════════════════════╗\n
    ║\tBitte Syntax beachten\t\t\t\t\t\t\t║\n
    ║\terstes Argument die Domain, zweites argument enable oder disable\t║\n
    ║\tbash ./mxrelay.sh domain.tld enable|disable\t\t\t\t║\n
    ╚══════════════════════════════════════════════════════════════════════════════╝\n"


    if [ $# != 2 ]
    then
    echo -e $SYNTAX
    else
    if [ "${ARGS[1]}" = "enable" ]
    then
    sed -i "/^${ARGS[0]}/s/^\(.*\)/#\1/g" "$DIR/imscp/aliases" "$DIR/imscp/domains" "$DIR/imscp/mailboxes" "$DIR/imscp/sender-access" "$DIR/imscp/transport" #auskommentieren
    RC=`grep "${ARGS[0]}" "$DIR/relay_domains" | wc -l` #suchen
    if [ "$RC" != 0 ]
    then sed -i "/${ARGS[0]}/s/^ *#* *\(.*\)/\1/" "$DIR/relay_domains" #einkommentieren
    else echo "${ARGS[0]} OK" >> "$DIR/relay_domains" #zeile am ende der datei hinzufügen
    fi
    echo "${ARGS[0]} aktiviert"
    elif [ "${ARGS[1]}" = "disable" ]
    then
    sed -i "/${ARGS[0]}/s/^ *#* *\(.*\)/\1/" "$DIR/imscp/aliases" "$DIR/imscp/domains" "$DIR/imscp/mailboxes" "$DIR/imscp/sender-access" "$DIR/imscp/transport" #einkommentieren
    sed -i "/^${ARGS[0]}/s/^\(.*\)/#\1/g" "$DIR/relay_domains" #auskommentieren
    echo "${ARGS[0]} deaktiviert"
    else
    echo -e $SYNTAX
    fi
    fi


    postmap "$DIR/imscp/aliases"
    postmap "$DIR/imscp/domains"
    postmap "$DIR/imscp/mailboxes"
    postmap "$DIR/imscp/sender-access"
    postmap "$DIR/imscp/transport"
    postmap "$DIR/relay_domains"
    postmap "$DIR/relay_recipients"
    /etc/init.d/postfix restart[/php]

    Edited once, last by flames ().