diff --git a/dmarc-test.sh b/dmarc-test.sh new file mode 100755 index 0000000..a891915 --- /dev/null +++ b/dmarc-test.sh @@ -0,0 +1,154 @@ +#!/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 " "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 " + 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 " + 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" +