DNS-Recursor fuer rspamd + Bayes-Trainingsskript

Rspamds DNS-Blocklisten waren wirkungslos: Spamhaus beantwortete keine
Anfragen, weil sie ueber Dockers eingebautes DNS von einem als oeffentlich
eingestuften Resolver kamen (DBL_BLOCKED_OPENRESOLVER im Log, fuer rDNS,
Message-ID und URLs gleichermassen). ENABLE_UNBOUND=1 hat daran nichts
geaendert - die Variable existiert in DMS nicht und war ein No-Op.

- dns-recursor (PowerDNS Recursor 5.3.10) als eigener Service, der selbst
  rekursiv aufloest, in einem separaten Netz dms_dns mit fester IP, weil
  Dockers dns:-Option nur IPs akzeptiert
- ENABLE_UNBOUND entfernt
- train_bayes.sh: einmaliges Anlernen des Bayes-Klassifikators aus den
  vorhandenen Postfaechern (Junk -> Spam, INBOX -> Ham). Bisher feuerte kein
  einziges BAYES_-Symbol, weil die noetigen 200 Lernvorgaenge je Klasse
  fehlten. Default ist ein Trockenlauf, gelernt wird nur mit --apply.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 23:43:02 +02:00
parent 0978154f43
commit 1ef0b96be4
2 changed files with 259 additions and 1 deletions

View File

@@ -91,7 +91,10 @@ services:
# Sicherheit
- ENABLE_FAIL2BAN=1
- ENABLE_UNBOUND=1
# ENABLE_UNBOUND entfernt: die Variable existiert in DMS nicht (mehr) und
# war wirkungslos - rspamd hat ueber Dockers eingebautes DNS (127.0.0.11)
# aufgeloest und bekam von Spamhaus nur DBL_BLOCKED_OPENRESOLVER zurueck.
# Ersetzt durch den dns-recursor-Service weiter unten.
# Sonstige
- ENABLE_MANAGESIEVE=0
@@ -130,11 +133,47 @@ services:
- NET_ADMIN
- SYS_PTRACE
restart: unless-stopped
# -------------------------------------------------------
# DNS: rspamd fragt DNS-Blocklisten (Spamhaus DBL/ZEN, SURBL) ab. Diese
# Dienste beantworten keine Anfragen, die ueber oeffentliche Resolver
# kommen - man bekommt DBL_BLOCKED_OPENRESOLVER statt eines Ergebnisses.
# Deshalb ein eigener rekursiver Resolver, siehe Service dns-recursor.
#
# ACHTUNG: Damit ersetzt der Recursor Dockers eingebautes DNS (127.0.0.11)
# fuer DIESEN Container. Der mailserver kann dann keine Container-Namen
# mehr aufloesen (roundcube-db, email-worker-ts, ...). Das ist hier
# unkritisch, weil er von sich aus nur nach aussen verbindet (SES-Relay).
# Faellt der Recursor aus, hat der mailserver kein DNS mehr - deshalb
# restart: always beim Recursor.
# -------------------------------------------------------
dns:
- 10.99.0.53
depends_on:
- dns-recursor
networks:
mail_network:
aliases:
- mailserver
- ${NODE_HOSTNAME}
dns_network:
# ---------------------------------------------------------
# Rekursiver DNS-Resolver ausschliesslich fuer den mailserver.
# Er fragt die Root-Server selbst ab, statt an einen Upstream-Resolver
# weiterzuleiten - nur so akzeptiert Spamhaus die Anfragen.
# Braucht keine Konfiguration: das Image laeuft per Default als Recursor
# und erlaubt Anfragen aus den RFC1918-Netzen (10.99.0.0/24 liegt darin).
# ---------------------------------------------------------
dns-recursor:
image: powerdns/pdns-recursor-53:5.3.10
container_name: dns-recursor
restart: always
stop_grace_period: 0s
networks:
dns_network:
ipv4_address: 10.99.0.53
roundcube:
image: roundcube/roundcubemail:latest
@@ -190,3 +229,16 @@ services:
networks:
mail_network:
external: true
# Eigenes Netz nur fuer mailserver <-> dns-recursor.
# Bewusst NICHT im externen mail_network: dort vergibt Docker die Adressen
# dynamisch, eine feste IP koennte mit einem anderen Container kollidieren.
# Das Subnetz muss fest sein, weil Dockers `dns:`-Option nur IPs akzeptiert.
# Falls 10.99.0.0/24 bei euch schon belegt ist (VPN, AWS-VPC), hier und bei
# `dns:` sowie `ipv4_address` oben gemeinsam auf ein freies Netz aendern.
dns_network:
name: dms_dns
ipam:
driver: default
config:
- subnet: 10.99.0.0/24