serverzeit.de - Logo

Spambekämpfung mit spamd

Zunächst muss natürlich spamd installiert werden. Stelle zuvor sicher, dass der Portstree aktuell ist.

  1. Mit folgendem Befehl installieren wir spamd;

    # cd /usr/ports/mail/spamd/ && make install clean 

  2. Folgende Einträge machen wir in '/etc/rc.conf':

    obspamd_flags="-G 15:4:864 -v -l 127.0.0.1"
    obspamd_enable="YES"
    obspamlogd_enable="YES"

    Die pfspamd_flags bedeuten im einzelnen folgendes:
    -G: aktiviere folgende Refresh-Raten:
    15: Der sendende Host bleibt für 15 Minuten in der Greylist
    4: Leere die Greylist nach 4 Stunden
    864: Lösche die Einträge in der Whitelist, die älter als 3 Monate sind
    -v: protokolliere sehr genau, sodass die ausgehenden Mails in der Whitelist landen
  3. Als nächstes erstellen wir uns eine Konfigurationsdatei für spamd. Diese finden wir als '/usr/local/etc/spamd/spamd.conf'. Diese lädtst du am besten von mir herunter. Die Syntax ist ziemlich klar. Achte aber darauf, dass du nur Leerzeichen verwendest, keine Tabulatoren. Damit kommt spamd nämlich nicht klar. Die Benachrichtigungen an die Absender habe ich deaktiviert.

    In der "spamd.conf" werden die Listen hinterlegt, anhand derer die sendenden Server auf Spam überprüft werden.

  4. Bevor wir in einem weiteren Schritt die pf-Konfiguration anpassen, erstellen wir noch ein paar Dateien und bringen spamd dazu, über syslogd zu protokollieren.

    # touch /var/log/spamd

    # touch /etc/pf_files/whitelist.lst

    # touch /etc/pf_files/blacklist.lst

    # touch /var/db/spamd

    # chown _spamd:_spamd /var/db/spamd

    Füge folgenden Eintrag in die Datei '/etc/syslog.conf' ein:

    !spamd
    daemon.err;daemon.warn;daemon.info   /var/log/spamd

  5. Zu guter letzt starten wir den syslog-Daemon neu und ergänzen in der '/etc/fstab' folgenden Eintrag, sodass spamlogd richtig arbeiten kann:

    fdescfs     /dev/fd     fdescfs     rw     0     0

Firewallregeln anpassen

Jetzt öffnen wir unsere '/etc/pf.conf' und ändern sie wie folgt ab:

  1. Im Abschnitt "Tables" ergänzen wir folgende Zeile, die verhindert, dass interne IPs nicht von außen ankommen dürfen:

    table <rfc1918> persist 
    table <spamd> persist
    table <spamd-white> persist
    table <whitelist> persist file "/etc/pf_files/whitelist.lst"
    table <blacklist> persist file "/etc/pf_files/blacklist.lst"

  2. Jetzt fügen wir noch folgende Weiterleitungsregeln ein. Achte dabei auf die Reihenfolge, da dies erreichen könnte, dass überhaupt keine Mail mehr ankommt.

    rdr pass on $if proto tcp from <whitelist> to $if port 25 -> $mail_ip port 25
    rdr pass on $if proto tcp from <blacklist> to $if port 25 -> 127.0.0.1 port 8025
    rdr pass on $if proto tcp from <spamd> to $if port 25 -> 127.0.0.1 port 8025
    rdr pass on $if proto tcp from <spamd-white> to $if port 25 -> $mail_ip port 25
    rdr pass on $if proto tcp from !<spamd-white> to $if port 25 -> 127.0.0.1 port 8025
    rdr pass on $if proto tcp from any to $if port 25 -> $mail_ip port 25

    $if: Ist das Interface, bspw. eth0
    $mail_ip: Ist die interne IP des Mailservers (z.B. einer Jail)

  3. Bei den Block-Regeln tragen wir noch folgendes ein:

    block in quick on $if inet from <rfc1918> to any

  4. Bei den pass-Regeln tragen wir noch diese Zeilen ein. Diese bewirken, dass pflogd vom Mailverkehr erfährt und somit in die Whitelist aufgenommen werden.

    pass out log on $if inet proto tcp from $mail_ip to any port 25 keep state
    pass in log on $if inet proto tcp from any to $if port 25 keep state

  5. Ein wichtiger Hinweis: Da du wahrscheinlich eine dynamische IP-Adresse hast, wird dein Mailclient nicht mit dem Mailserver verbinden können. Ist logisch, da spamd sagt, dass du später wiederkommen sollst. Um das zu verhindern, kannst du entweder die Regeln entschärfen, dass du sagst, wenn der Host nicht in einer Blacklist steht, dann darf er durch (setze hierzu einfach eine '#' vor die zwei <spamd-white>-Zeilen), oder du erstellst eine weitere rdr pass-Regel, die einen anderen Port weiterleitet und stellst deinen Mailclient dann auf diesen Port ein (hier 8825). Beispiel:

    rdr pass on $if proto tcp from any to $if port 8825 -> $mail_ip port 25
set limit table-entries 500000