Postfix: Speicher sparen bei großen Lookup-Tabellen

Die meisten Lookup-Tabellen, die man so per Hand erstellt und dann in Postfix einbindet, die werden nicht sonderlich groß - ein paar hundert Zeilen, 200kByte, das ist alles nicht so tragisch. Tragisch wird es immer dann, wenn Lookup-Tabellen automatisch generiert werden und dann mehrere MBytes groß sind. Bei indizierten Tabellen kann man sich ein bißchen behelfen, indem man statt btree/hash/dbm auf das cdb-Format wechselt, welches einen deutlich kleineren Memory-Footprint hat - bei cidr-Tabellen gibt es keine solche Alternative, wer also z.B. die DNSWL-Whitelisten eingebunden, der muß sich was anderes einfallen lassen. Die Lösung besteht darin, den proxymap-Service zu nutzen, den Postfix von Haus aus mitbringt.

Die Konfiguration ist leider nicht ganz trivial - zunächst einmal muß man die großen Lookup-Tabellen identifizieren. Nehmen wir im folgenden an, der Schuldige wäre die folgende Zeile in den smtpd_recipient_restrictions:

smtpd_recipient_restrictions =
  ...
  ...
  check_client_access cidr:/etc/postfix/dnswl-permit.cidr
  ...
  ...

Ersetzt man nun diese Zeile einfach durch

check_client_access proxy:cidr:/etc/postfix/dnswl-permit.cidr

dann wird das nicht funktionieren, denn der proxymap-Dämon weigert sich, einfach so Dateien zu öffnen - dafür gibt es den Parameter proxy_read_maps. Wer sich diesen mit postconf -d proxy_read_maps mal ansieht wird bemerken, daß da schon einiges drinsteht - und wenn man den Wert in der main.cf überschreibt, dann sollte man sichergehen, daß man keine Map vergisst. Welche Maps noch alles den proxymap-Service benutzen findet man beherzt via postconf | grep proxy:; heraus. Angenommen, man hätte sonst nur noch in den virtual_mailbox_maps und virtual_mailbox_domains einen Verweis auf proxymap gefunden, dann würde man vor der obigen Änderung an den smtpd_recipient_restrictions also die folgende Zeile in die Konfiguration aufnehmen:

proxy_read_maps =
  $virtual_mailbox_domains,
  $virtual_mailbox_maps,
  proxy:cidr:/etc/postfix/dnswl-permit.cidr

Nach einem Neustart (und den üblichen Sicherheitsmaßnahmen wie soft_bounce) kann man das Log dann ja noch kurze Zeit beobachten, ob auch alles weiterhin so funktioniert wie gewünscht.

Beethoven, Pathetique.