Ich habe mir diese Woche mal wieder Zeit genommen, die Konfiguration meiner privaten Mailserver zu entstauben. Nicht, dass die nicht mehr funktioniert hätte, aber sie stammt zum einen aus einer Zeit, als Postfix noch keine offiziellen Kompatibilitäts-Mechanismen hatte, und zum aus einer Zeit, in der ich noch deutlich motivierter war, alles bis in’s kleinste Detail zu konfigurieren. Davon bin ich zwar mittlerweile geheilt, aber die alte Konfiguration hatte alleine 28 Einträge für smtpd_recipient_restrictions. Also habe ich da die Axt angesetzt :-)

Kurz, es geht generell um Relaying- und Mail-Annahme. Postfix kennt verschiedene Restriktionen, die man setzen kann, mit der man eine Mail dann z.B. anhand formaler Kriterien, DNS-Lookups etc. abweisen kann, wenn man sie für Spam hält, oder falls es sich um den Versuch handelt, den eigenen Mailserver unberechtigterweise als Relay, also zum Versand, zu benutzen. Diese Restriktionen sind meistens nach dem entsprechenden Schritt aus dem SMTP-Protokoll benannt. Es gibt z.B. Restriktionen, die die IP des Clients auswerten (smtpd_client_restrictions), für die Begrüßung der Mailserver untereinander (smtpd_helo_restrictions) oder eben auch für die Liste der Empfänger - eben smtpd_recipient_restrictions. Nun ist es so, dass Postfix per Default alle diese Restriktionen sowieso erst auswertet, wenn die Empfänger bekannt sind (vgl. smtpd_delay_reject). Weil es also de-facto keinen Unterschied gemacht hat, und weil man sich leichter damit getan hat, Ausnahme einzubauen, hat so ziemlich jeder auf diesem Planeten alle seine Anti-Spam- und Anti-Relay-Restriktionen unter smtpd_recipient_restrictions gepackt - ich war einer davon.

Mit dem Release 2.10 hat Postfix jedoch den neuen Parameter smtpd_relay_restrictions bekommen, um genau diese beiden Funktionen zu trennen. Ich habe die Gelegenheit, diesen neuen Parameter in meine Konfiguration zu packen, gleich genutzt, um Kahlschlag zu üben: Von den mehr als 28 Restriktionen haben im täglichen Betrieb ungefähr drei oder vier angeschlagen. Und das über Jahre hinweg. Und da ich kein Freund von umfangreichen Konfigurationen bin sehen die entsprechenden Stellen in der main.cf jetzt so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
general_smtpd_restrictions =
  reject_non_fqdn_sender,
  reject_non_fqdn_recipient,
  reject_unlisted_sender,
  reject_unlisted_recipient,
  reject_unknown_sender_domain,
  reject_unknown_recipient_domain
smtpd_recipient_restrictions =
  check_client_access cidr:${maps_dir}/hard_blacklist.cidr,
  $general_smtpd_restrictions
smtpd_relay_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  check_client_access cidr:${maps_dir}/relay_clients.cidr,
  reject_unauth_destination

Bei hard_blacklist.cidr handelt es sich um eine Liste von Netzen, die ich manuell Pflege, und aus denen noch NIE was ordentliches Kam. Die Map in relay_clients.cidr dagegen wird von Puppet gerendert und enthält alle meine Maschinen, die statische IPs haben.