Ich hab mir heute mal den Spaß gemacht, und das unter http://nolisting.org/ beschriebene Verfahren für meine Domains eingeführt. Das Prinzip ist relativ einfach. Für die entsprechende Domain werden 2 MX Records definiert. Der Primäre zeigt auf eine IP-Adresse, auf dem entweder kein SMTP-Dienst läuft oder aber einer der jede Verbindung mit einem 450er Fehler ablehnt. Der Sekundäre MX zeigt auf den eigentlichen eMail-Server. Laut RFC 2821 MÜSSEN Clients für die eMail Zustellung 2 MX-Records versuchen, wenn 2 hinterlegt sind und der erste nicht erreichbar ist.
Das Ergebniss: Die „fire and forgett“ Methode funktioniert nicht mehr, da der erste Primäre MX eben keine eMails annimmt. Nur korrekt konfigurierte eMail Server versuchen anschließend den zweiten MX.
Diese Methode ersetzt jedoch nicht das Greylisting!
Für postfix lässt sich das ganze relativ einfach realisieren. Man lässt die IPs der beiden MX jeweils auf eine Maschine zeigen und schließt den fake-SMTP-Server in der main.cf über inet_interfaces aus.
fake-ip: 91.121.121.126
echte: 87.98.241.120
inet_interfaces = 87.98.241.120 127.0.0.1
Somit lauscht postfix schonmal nicht auf eingehene Verbindungen über die fake-ip. Nun bringen wir postfix dazu, dies dennoch zu tun, indem wir in der master.cf einen weiteren Port mit IP Angabe öffnen und auch den Hostnamen entsprechend des MX-Records ändern.
91.121.121.126:25 inet n - n - - smtpd -o myhostname=mx01.blog.cscholz.io -o smtpd_client_restrictions=pcre:/etc/postfix/filter/mx01 -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o receive_override_options=no_unknown_recipient_checks -o mynetworks=127.0.0.0/8
Über die Datei /etc/postfix/filter/mx01 blocken wir nun alle eingehenden Verbindungen durch eine 450er Meldung.
/([0-9|A-Z|a-z])/ 450 please try again later
Nun noch
postmap /etc/postfix/filter/mx01 && /etc/init.d/postfix restart
und fertig. Achten Sie darauf, dass beide IPs nicht durch die Firewall geblockt werden.
Bei einem korrekt konfigurierten eMail-Server sieht eine eMail Übertragung dann wiefolgt aus.
Jul 20 11:44:46 host123 postfix/smtp[870]: 4F1B84E81B2: host mx01.blog.cscholz.io[91.121.121.126] said: 450 4.7.1 <host123.domain.tld[212.223.166.218]>: C lient host rejected: please try again later (in reply to RCPT TO command) Jul 20 11:44:47 host123 postfix/smtp[870]: 4F1B84E81B2: to=<user@domain.tld>, relay=mx02.blog.cscholz.io[87.98.241.120]:25, delay=0.74, delays=0.05/0/0.3/0.3 9, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 9B2863AC253)
Diese Methode stellt also keine wirkliche Verzögerung dar. Reduziert aber Erfahrungsgemäß die Verbindungen dynamischer Adressen um 1/3 – 2/3.
Verbindungen abgleichen bzw. blocken mit fail2ban
Nachtrag: Wie ich gerade festgestellt habe, schafft es das Rechenzentrum in dem mein Server steht (Frankreich) selbst nicht, eMail an den zweiten MX zuzustellen. Erst nach einer deaktivierung des SMTP-Dienstes für den fake-MX trudelten die eMails ein!!
Diese Konstellation eröffnet jedoch nocht eine weitere Möglichkeit. Ein Server der sich immer nur zum ersten MX verbindet und niemals zum zweiten ist mit sehr hoher Wahrscheinlichkeit ein Spammer. Somit ist es möglich zu prüfen, ob ein Client der sich zum ersten MX verbindet bereits in der Vergangenheit über den zweiten MX erfolgreich eine eMails zugestellt hat. Ist dies nicht der Fall und dieser Server kommt immer wieder, so kann dieser per iptables geblockt werden.
Für diese Realisierung habe ich ein Script geschrieben, dass zusammen mit fail2ban diese Aufgabe erledigt. Dazu wird dem Script als Parameter die zu prüfende IP-Adresse übergeben. Da auf meinem System eingehende eMails immer direkt in Amavis laufen, kann ich nachvolziehen ob die zu pürfende IP es einmal bis zur Übergabe an Amavis geschafft hat. (grep -c triggers). Wenn dies der Fall ist tauch folgende Log-Zeile auf:
RCPT from server[xx.xx.xx.xx]: <user@domain.tld>: Recipient address triggers FILTER smtp-amavis:[127.0.0.1]:10031; from=<user@domain.tld> to=<user@domain.tld> proto=SMTP helo=<xxx>
Sollte der Server es nicht bis zum Amavis-Filter geschafft haben, wird er geblockt.
/root/scripts/check_fakemx.sh#!/bin/bash check_fake_mxip=$(cat /var/log/mail |grep $1 | grep -c triggers) if [ $check_fake_mxip -eq 0 ] then iptables -I fail2ban-pfx_fakemx 1 -s $1 -j DROP # echo "IP $1 wurde geblockt" fi
Nun fehlt noch die Konfiguration für fail2ban. Dazu müssen zwei Dateien erstellt und eine geändert werden.
/etc/fail2ban/filter.d/pfx_fakemx.conf (erstellen)
[Definition] actionstart = iptables -N fail2ban-<name> iptables -A fail2ban-<name> -j RETURN iptables -I INPUT -p <protocol> --dport <port> -j fail2ban-<name> actionstop = iptables -D INPUT -p <protocol> --dport <port> -j fail2ban-<name> iptables -F fail2ban-<name> iptables -X fail2ban-<name> actionban = /root/scripts/check_fakemx.sh <ip> actionunban = iptables -D INPUT -s $1 -j DROP[Init]
/etc/fail2ban/action.d/pfx_fakemx.conf (erstellen)
[Definition] actionban = /root/scripts/check_fakemx.sh <ip> actionunban = iptables -D INPUT -s $1 -j DROP [Init]
/etc/fail2ban/jail.conf (hinzufügen)
[pfx_fakemx]enabled = true port = smtp filter = pfx_fakemx logpath = /var/log/mail maxretry = 3 action = pfx_fakemx[name=%(__name__)s, port=%(port)s]
Links:
attacking-loganalysis !!!
selektives greylisting
Exchange Greylisting