Files
postfix/dmarc-test.sh
2025-11-25 22:44:23 +01:00

155 lines
3.9 KiB
Bash
Executable File

#!/bin/bash
#
# Einfaches DMARC-Testskript für Postfix + OpenDMARC
# --------------------------------------------------
# Es simuliert eine eingehende Verbindung über 127.0.0.1:10025
# und setzt via XFORWARD eine beliebige Absender-IP.
#
# MODI:
# 1) Presets:
# dmarc-test.sh crsend
# dmarc-test.sh google
#
# 2) Frei:
# dmarc-test.sh IP MAIL_FROM RCPT_TO [FROM_HEADER] [SUBJECT]
#
# Beispiele:
# dmarc-test.sh crsend
# dmarc-test.sh google
#
# dmarc-test.sh 178.77.121.168 newsletter@cadus.org newsletter@cadus.org
# dmarc-test.sh 2607:f8b0:4864:20::114a feray@cadus.org ckubu@cadus.org "Feray <feray@cadus.org>" "Google DMARC Test"
#
SERVER="127.0.0.1"
PORT="10025"
# Pfad zum Mail-Log anpassen, falls bei dir anders
LOGFILE="/var/log/mail.log"
preset="$1"
if [ -z "$preset" ]; then
echo "Usage:"
echo " $0 crsend"
echo " $0 google"
echo " $0 IP MAIL_FROM RCPT_TO [FROM_HEADER] [SUBJECT]"
exit 1
fi
# === Presets auflösen =====================================================
case "$preset" in
crsend)
IP="178.77.121.168"
MAIL_FROM="newsletter@cadus.org"
RCPT_TO="newsletter@cadus.org"
FROM_HEADER="CRSend Test <newsletter@cadus.org>"
SUBJECT="CRSend DMARC Test"
echo "[Preset] CRSend gewählt."
;;
google)
# Beispiel-IP aus deinem Log:
# mail-yw1-x114a.google.com[2607:f8b0:4864:20::114a]
IP="2607:f8b0:4864:20::114a"
MAIL_FROM="feray@cadus.org"
RCPT_TO="ckubu@cadus.org"
FROM_HEADER="Feray <feray@cadus.org>"
SUBJECT="Google Workspace DMARC Test"
echo "[Preset] Google Workspace gewählt."
;;
*)
# Freier Modus
IP="$1"
MAIL_FROM="$2"
RCPT_TO="$3"
FROM_HEADER="$4"
SUBJECT="$5"
;;
esac
# === Argumente im freien Modus prüfen ======================================
if [ "$preset" != "crsend" ] && [ "$preset" != "google" ]; then
if [ -z "$IP" ] || [ -z "$MAIL_FROM" ] || [ -z "$RCPT_TO" ]; then
echo "Usage:"
echo " $0 crsend"
echo " $0 google"
echo " $0 IP MAIL_FROM RCPT_TO [FROM_HEADER] [SUBJECT]"
exit 1
fi
fi
# Defaults setzen, falls leer
if [ -z "$FROM_HEADER" ]; then
FROM_HEADER="$MAIL_FROM"
fi
if [ -z "$SUBJECT" ]; then
SUBJECT="DMARC test from $IP"
fi
if [ ! -f "$LOGFILE" ]; then
echo "WARN: Logfile $LOGFILE existiert nicht. Bitte Pfad im Skript anpassen."
exit 1
fi
echo
echo "== DMARC-Test =="
echo " IP : $IP"
echo " MAIL FROM : $MAIL_FROM"
echo " RCPT TO : $RCPT_TO"
echo " From-Header: $FROM_HEADER"
echo " Subject : $SUBJECT"
echo " Server : $SERVER:$PORT"
echo
# Startposition im Log merken
START_LINES=$(wc -l < "$LOGFILE" 2>/dev/null || echo 0)
# Einzigartige Test-ID für die Mail (zum Wiederfinden im Log, falls nötig)
TEST_ID="DMARC-TEST-$(date +%s)-$$"
# SMTP-Dialog bauen
TMP=$(mktemp)
{
echo "EHLO dmarc-test"
echo "XFORWARD ADDR=$IP NAME=test PROTO=ESMTP HELO=test"
echo "MAIL FROM:<$MAIL_FROM>"
echo "RCPT TO:<$RCPT_TO>"
echo "DATA"
echo "Subject: $SUBJECT"
echo "From: $FROM_HEADER"
echo
echo "$TEST_ID"
echo "Dieser Text ist ein DMARC-Testlauf am $(date)."
echo "."
echo "QUIT"
} > "$TMP"
echo "== Sende Test-Mail über nc …"
nc "$SERVER" "$PORT" < "$TMP"
NC_RC=$?
rm -f "$TMP"
if [ "$NC_RC" -ne 0 ]; then
echo "FEHLER: nc konnte nicht erfolgreich mit $SERVER:$PORT sprechen (rc=$NC_RC)."
exit 1
fi
# Kurz warten, damit Logs geschrieben sind
sleep 2
echo
echo "== OpenDMARC-Logzeilen seit Start des Tests =="
echo "(aus $LOGFILE, gefiltert auf 'opendmarc' und die Queue-ID/Testzeit)"
echo
tail -n +"$((START_LINES+1))" "$LOGFILE" | grep opendmarc || echo "Keine neuen opendmarc-Zeilen gefunden."
echo
echo "Hinweis: Falls du die Mail selbst im Log genauer suchen willst, nutze z.B.:"
echo " grep \"$TEST_ID\" $LOGFILE"