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