Webentwicklung und Design Symbole
29. September, 2025

DNS-Check-Skript (macOS/bash 3.x kompatibel)

Mit diesem Script kann Du eine Domain inkl. Nameserver (default ns11.infomaniak.ch) prüfen:

# !/bin/bash
# DNS-Check-Skript (macOS/bash 3.x kompatibel)
# Nutzung:
#   ./check-domain.sh  [expected-nameserver]
# Beispiele:
#   ./check-domain.sh cloudmeister.ch
#   ./check-domain.sh cloudmeister.ch ns11.infomaniak.ch

clear

DOMAIN="$1"
NS_EXPECTED_INPUT="$2"
DEFAULT_NS="ns11.infomaniak.ch"

if [ -z "$DOMAIN" ]; then
  echo "Bitte Domain angeben! (und Nameserver falls nicht von infomaniak)"
  echo "---------------------"
  echo "Beispiel: $0 cloudmeister.ch ns11.infomaniak.ch"
  echo ""
  exit 1
fi

# Erwarteten NS bestimmen (Parameter > Default)
if [ -n "$NS_EXPECTED_INPUT" ]; then
  NS_EXPECTED="$NS_EXPECTED_INPUT"
else
  NS_EXPECTED="$DEFAULT_NS"
fi

# Hilfsfunktion: trailing dot entfernen & lowercase (bash 3.x kompatibel)
norm() {
  printf "%s" "$1" | sed 's/\.$//' | tr '[:upper:]' '[:lower:]'
}

NS_EXPECTED_NORM="$(norm "$NS_EXPECTED")"

# --- DIG Wrapper: erst UDP, wenn leer -> TCP ---
dig_try() {
  # $1=TYPE (A|AAAA|NS|DS|SOA), $2=DOMAIN, $3=(optional)SERVER
  local qtype="$1"; local qname="$2"; local qsrv="$3"
  local base="dig +short $qtype $qname"
  [ -n "$qsrv" ] && base="$base @$qsrv"

  # 1) UDP
  local out_udp
  out_udp=$(eval "$base" 2>/dev/null | sed 's/\.$//' | tr -s ' ' | sed '/^$/d')
  if [ -n "$out_udp" ]; then
    echo "$out_udp"
    return 0
  fi
  # 2) TCP
  local out_tcp
  out_tcp=$(eval "$base +tcp" 2>/dev/null | sed 's/\.$//' | tr -s ' ' | sed '/^$/d')
  echo "$out_tcp"
  [ -n "$out_tcp" ]
}

echo "Prüfe Domain: $DOMAIN"
echo "============="
echo "Erwarteter Nameserver: $NS_EXPECTED_NORM"
echo "======================"
echo ""

# 1) Registry (.ch) Delegation – AUTHORITY-Section parsen (UDP) mit Fallback (rekursiv)
echo -n "[1] Registry (.ch) Delegation... "
NS_ACTUAL_LIST="$(
  dig "$DOMAIN" NS @a.nic.ch +norecurse 2>/dev/null \
    | awk '$4=="NS"{print $5}' \
    | sed 's/\.$//' \
    | tr '[:upper:]' '[:lower:]' \
    | sort -u
)"
if [ -z "$NS_ACTUAL_LIST" ]; then
  NS_ACTUAL_LIST="$(dig_try NS "$DOMAIN" | tr '[:upper:]' '[:lower:]' | sort -u)"
fi

if [ -z "$NS_ACTUAL_LIST" ]; then
  echo "keine NS gefunden"
else
  echo "gefunden: $NS_ACTUAL_LIST"
  echo "$NS_ACTUAL_LIST" | awk '{print}' | grep -q "^${NS_EXPECTED_NORM}$"
  if [ $? -eq 0 ]; then
    echo " $NS_EXPECTED_NORM OK (in der Delegation)"
  else
    echo "$NS_EXPECTED_NORM fehlt in der Delegation"
  fi
fi

# 2) Vollständiger Trace (UDP) – bei Bedarf zusätzlich TCP
echo -n "[2] dig +trace... "
dig "$DOMAIN" +trace >/tmp/digtrace.txt 2>/dev/null
if grep -q "SERVFAIL" /tmp/digtrace.txt; then
  echo "SERVFAIL im Trace (UDP)!"
else
  echo "Trace sauber (UDP)"
fi

# 3) Direkte Abfragen beim erwarteten NS (A & AAAA, mit TCP-Fallback)
for T in A AAAA; do
  echo -n "[3] $T von $NS_EXPECTED_NORM... "
  IP_EXP="$(dig_try "$T" "$DOMAIN" "$NS_EXPECTED_NORM")"
  if [ -z "$IP_EXP" ]; then
    echo "keine Antwort"
  else
    # mehrere Zeilen (mehrere IPs) kompakt ausgeben
    one_line="$(echo "$IP_EXP" | paste -sd',' -)"
    echo "$one_line"
  fi
done

# 4) Lokaler Resolver (A & AAAA)
for T in A AAAA; do
  echo -n "[4] Lokaler Resolver ($T)... "
  IP_LOCAL="$(dig_try "$T" "$DOMAIN")"
  if [ -z "$IP_LOCAL" ]; then
    echo "keine Antwort"
  else
    echo "$(echo "$IP_LOCAL" | paste -sd',' -)"
  fi
done

# 5) Öffentliche Resolver (Google & Cloudflare) – A & AAAA
for RESOLVER in 8.8.8.8 1.1.1.1; do
  for T in A AAAA; do
    echo -n "[5] Resolver $RESOLVER ($T)... "
    IP_RES="$(dig_try "$T" "$DOMAIN" "$RESOLVER")"
    if [ -z "$IP_RES" ]; then
      echo "keine Antwort"
    else
      echo "$(echo "$IP_RES" | paste -sd',' -)"
    fi
  done
done

# 6) DNSSEC (Parent) – DS (UDP mit TCP-Fallback)
echo -n "[6] DS-Record bei .ch... "
DS_PARENT="$(dig_try DS "$DOMAIN" "a.nic.ch")"
if [ -z "$DS_PARENT" ]; then
  echo "Kein DS-Eintrag (DNSSEC aus)"
else
  echo "DS vorhanden → DNSSEC prüfen (muss zu den autoritativen NS passen)"
fi
Facebook

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert