#!/bin/bash # Cloudflare API-Konfiguration # Setze deine API-Schlüssel und Zone-ID als Umgebungsvariablen oder ersetze sie direkt # CF_ZONE_ID="1b7756cee93ed8ba8c05bdc3cb0a5da8" # Die Zone-ID deiner Domain bei Cloudflare # DOMAIN_NAME="andreasknuth.de" # Deine Domain AWS_REGION="us-east-2" # AWS-Region if [ -z "$DOMAIN_NAME" ]; then echo "Fehler: DOMAIN_NAME ist nicht gesetzt." echo "Bitte setzen Sie die Variable mit: export DOMAIN_NAME='IhreDomain.de'" exit 1 # Skript mit Fehlercode beenden fi # Überprüfen, ob der erforderliche API-Token gesetzt ist if [ -z "$CF_API_TOKEN" ]; then echo "Fehler: Bitte setze CF_API_TOKEN als Umgebungsvariable oder im Skript." exit 1 fi # Zone ID basierend auf Domain-Namen abrufen echo "Zone ID für $DOMAIN_NAME abrufen..." ZONE_RESPONSE=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$DOMAIN_NAME" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json") # Überprüfen, ob die Antwort erfolgreich war if [ "$(echo $ZONE_RESPONSE | jq -r '.success')" != "true" ]; then echo "Fehler beim Abrufen der Zone ID:" echo $ZONE_RESPONSE | jq . exit 1 fi # Zone ID extrahieren CF_ZONE_ID=$(echo $ZONE_RESPONSE | jq -r '.result[0].id') # Überprüfen, ob eine Zone ID gefunden wurde if [ -z "$CF_ZONE_ID" ] || [ "$CF_ZONE_ID" = "null" ]; then echo "Keine Zone ID für $DOMAIN_NAME gefunden. Bitte stelle sicher, dass die Domain bei Cloudflare registriert ist." exit 1 fi echo "Zone ID für $DOMAIN_NAME: $CF_ZONE_ID" # Hilfsfunktion für DNS-Einträge anlegen create_dns_record() { local TYPE=$1 local NAME=$2 local CONTENT=$3 local PROXIED=$4 local TTL=$5 local PRIORITY=$6 # Neu: MX-Priority # Standardwerte für Proxied und TTL setzen, falls nicht angegeben if [ -z "$PROXIED" ]; then PROXIED="false" fi if [ -z "$TTL" ]; then TTL=3600 # 1 Stunde fi echo "Erstelle $TYPE-Eintrag für $NAME mit Inhalt $CONTENT..." # Json Payload vorbereiten abhängig vom Record-Typ local JSON_DATA="" if [ "$TYPE" = "MX" ]; then # Bei MX-Einträgen müssen wir die Priority separat angeben if [ -z "$PRIORITY" ]; then PRIORITY=10 # Standard-Priority, falls nicht angegeben fi JSON_DATA="{ \"type\": \"$TYPE\", \"name\": \"$NAME\", \"content\": \"$CONTENT\", \"ttl\": $TTL, \"priority\": $PRIORITY, \"proxied\": $PROXIED }" elif [ "$TYPE" = "TXT" ]; then # Bei TXT-Einträgen müssen wir sicherstellen, dass der Inhalt in Anführungszeichen steht # Aber Anführungszeichen innerhalb von JSON müssen escaped werden # Wir entfernen zuerst alle vorhandenen Anführungszeichen und fügen sie dann korrekt hinzu CONTENT=$(echo "$CONTENT" | sed 's/"//g') JSON_DATA="{ \"type\": \"$TYPE\", \"name\": \"$NAME\", \"content\": \"\\\"$CONTENT\\\"\", \"ttl\": $TTL, \"proxied\": $PROXIED }" else # Für alle anderen Record-Typen (z.B. CNAME) JSON_DATA="{ \"type\": \"$TYPE\", \"name\": \"$NAME\", \"content\": \"$CONTENT\", \"ttl\": $TTL, \"proxied\": $PROXIED }" fi # API-Aufruf an Cloudflare curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$CF_ZONE_ID/dns_records" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ --data "$JSON_DATA" | jq . } # DKIM-Einträge abrufen und bei Cloudflare eintragen echo "DKIM-Tokens abrufen von AWS SES..." DKIM_TOKENS=$(aws ses get-identity-dkim-attributes \ --identities ${DOMAIN_NAME} \ --region ${AWS_REGION} \ --query "DkimAttributes.\"${DOMAIN_NAME}\".DkimTokens" \ --output text) # Überprüfen, ob DKIM-Tokens abgerufen wurden if [ -z "$DKIM_TOKENS" ]; then echo "Fehler: Konnte DKIM-Tokens nicht abrufen. Ist die Domain bei AWS SES verifiziert?" exit 1 fi # Domain-Verifizierungstoken abrufen VERIFICATION_TOKEN=$(aws ses get-identity-verification-attributes \ --identities ${DOMAIN_NAME} \ --region ${AWS_REGION} \ --query "VerificationAttributes.\"${DOMAIN_NAME}\".VerificationToken" \ --output text) # DKIM-Einträge anlegen echo "DKIM-Einträge anlegen bei Cloudflare..." for TOKEN in ${DKIM_TOKENS}; do create_dns_record "CNAME" "${TOKEN}._domainkey.${DOMAIN_NAME}" "${TOKEN}.dkim.amazonses.com" "false" 3600 done # Domain-Verifizierungs-TXT-Eintrag anlegen echo "Domain-Verifizierungs-TXT-Eintrag anlegen bei Cloudflare..." create_dns_record "TXT" "_amazonses.${DOMAIN_NAME}" "${VERIFICATION_TOKEN}" "false" 3600 # MX-Einträge anlegen echo "MX-Einträge anlegen bei Cloudflare..." create_dns_record "MX" "${DOMAIN_NAME}" "inbound-smtp.${AWS_REGION}.amazonaws.com" "false" 3600 10 create_dns_record "MX" "mail.${DOMAIN_NAME}" "feedback-smtp.${AWS_REGION}.amazonaws.com" "false" 3600 10 # SPF-Eintrag anlegen echo "SPF-Eintrag anlegen bei Cloudflare..." create_dns_record "TXT" "mail.${DOMAIN_NAME}" "v=spf1 include:amazonses.com ~all" "false" 3600 # DMARC-Eintrag anlegen echo "DMARC-Eintrag anlegen bei Cloudflare..." create_dns_record "TXT" "_dmarc.${DOMAIN_NAME}" "v=DMARC1; p=quarantine; pct=100; rua=mailto:postmaster@${DOMAIN_NAME}" "false" 3600 echo "DNS-Einrichtung abgeschlossen." echo "Es kann bis zu 72 Stunden dauern, bis AWS SES die Domain verifiziert hat."