#!/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"