Skip to content

dns-lookup.sh

Niveau : Débutant

Résolution DNS avancée avec plusieurs types de requêtes.


Description

Ce script effectue des requêtes DNS détaillées : - Résolution A, AAAA, MX, NS, TXT, CNAME - Interrogation de serveurs DNS spécifiques - Reverse DNS lookup - Vérification de propagation


Prérequis

  • Système : Linux (RHEL/Debian)
  • Permissions : Utilisateur standard (pas de sudo requis)
  • Dépendances : dig, nslookup

Cas d'Usage

  • Diagnostic DNS : Résolution rapide de problèmes de connectivité liés au DNS
  • Validation de propagation : Vérification de la propagation DNS après changement de zone
  • Troubleshooting email : Analyse des enregistrements MX pour problèmes d'envoi mail
  • Audit de zone : Vérification complète de la configuration DNS d'un domaine

Script

#!/bin/bash
#===============================================================================
# Script Name: dns-lookup.sh
# Description: Advanced DNS lookup
# Author: ShellBook
# Version: 1.0
#===============================================================================

set -euo pipefail

# Colors
readonly GREEN='\033[0;32m'
readonly CYAN='\033[0;36m'
readonly YELLOW='\033[1;33m'
readonly RED='\033[0;31m'
readonly NC='\033[0m'

# Configuration
DNS_SERVER=""
RECORD_TYPE="all"

usage() {
    cat << EOF
Usage: $(basename "$0") [OPTIONS] DOMAIN

Résolution DNS avancée.

Arguments:
    DOMAIN          Domaine à résoudre

Options:
    -t, --type TYPE     Type d'enregistrement (A, AAAA, MX, NS, TXT, CNAME, SOA, PTR, all)
    -s, --server DNS    Server DNS à utiliser
    -r, --reverse IP    Reverse DNS lookup
    -p, --propagation   Vérifier la propagation DNS
    -h, --help          Show this help

Examples:
    $(basename "$0") google.com                    # Tous les enregistrements
    $(basename "$0") -t MX gmail.com               # Enregistrements MX
    $(basename "$0") -s 8.8.8.8 example.com        # Server DNS spécifique
    $(basename "$0") -r 8.8.8.8                    # Reverse lookup
    $(basename "$0") -p example.com                # Propagation
EOF
}

print_header() {
    echo -e "\n${CYAN}═══════════════════════════════════════════════════════════${NC}"
    echo -e "${GREEN}  $1${NC}"
    echo -e "${CYAN}═══════════════════════════════════════════════════════════${NC}"
}

print_section() {
    echo -e "\n${YELLOW}$1${NC}"
}

query_dns() {
    local domain=$1
    local type=$2
    local server=${3:-}

    local cmd="dig +short"
    [[ -n "$server" ]] && cmd="$cmd @$server"
    cmd="$cmd $domain $type"

    eval "$cmd" 2>/dev/null
}

query_dns_full() {
    local domain=$1
    local type=$2
    local server=${3:-}

    local cmd="dig +noall +answer"
    [[ -n "$server" ]] && cmd="$cmd @$server"
    cmd="$cmd $domain $type"

    eval "$cmd" 2>/dev/null
}

lookup_a() {
    local domain=$1
    print_section "A Records (IPv4)"

    local result=$(query_dns "$domain" "A" "$DNS_SERVER")
    if [[ -n "$result" ]]; then
        echo "$result" | while read -r ip; do
            echo -e "  ${GREEN}${NC} $ip"
        done
    else
        echo -e "  ${RED}${NC} Aucun enregistrement A"
    fi
}

lookup_aaaa() {
    local domain=$1
    print_section "AAAA Records (IPv6)"

    local result=$(query_dns "$domain" "AAAA" "$DNS_SERVER")
    if [[ -n "$result" ]]; then
        echo "$result" | while read -r ip; do
            echo -e "  ${GREEN}${NC} $ip"
        done
    else
        echo -e "  ${YELLOW}${NC} Aucun enregistrement AAAA"
    fi
}

lookup_mx() {
    local domain=$1
    print_section "MX Records (Mail)"

    local result=$(query_dns "$domain" "MX" "$DNS_SERVER")
    if [[ -n "$result" ]]; then
        echo "$result" | sort -n | while read -r line; do
            local priority=$(echo "$line" | awk '{print $1}')
            local server=$(echo "$line" | awk '{print $2}')
            echo -e "  ${GREEN}${NC} [$priority] $server"
        done
    else
        echo -e "  ${YELLOW}${NC} Aucun enregistrement MX"
    fi
}

lookup_ns() {
    local domain=$1
    print_section "NS Records (Name Servers)"

    local result=$(query_dns "$domain" "NS" "$DNS_SERVER")
    if [[ -n "$result" ]]; then
        echo "$result" | while read -r ns; do
            local ns_ip=$(query_dns "$ns" "A")
            echo -e "  ${GREEN}${NC} $ns (${ns_ip:-N/A})"
        done
    else
        echo -e "  ${RED}${NC} Aucun enregistrement NS"
    fi
}

lookup_txt() {
    local domain=$1
    print_section "TXT Records"

    local result=$(query_dns "$domain" "TXT" "$DNS_SERVER")
    if [[ -n "$result" ]]; then
        echo "$result" | while read -r txt; do
            # Tronquer si trop long
            if [[ ${#txt} -gt 80 ]]; then
                echo -e "  ${GREEN}${NC} ${txt:0:77}..."
            else
                echo -e "  ${GREEN}${NC} $txt"
            fi
        done
    else
        echo -e "  ${YELLOW}${NC} Aucun enregistrement TXT"
    fi
}

lookup_cname() {
    local domain=$1
    print_section "CNAME Record"

    local result=$(query_dns "$domain" "CNAME" "$DNS_SERVER")
    if [[ -n "$result" ]]; then
        echo -e "  ${GREEN}${NC} $result"
    else
        echo -e "  ${YELLOW}${NC} Pas de CNAME (enregistrement direct)"
    fi
}

lookup_soa() {
    local domain=$1
    print_section "SOA Record"

    local result=$(query_dns_full "$domain" "SOA" "$DNS_SERVER")
    if [[ -n "$result" ]]; then
        echo "$result" | awk '{
            printf "  Primary NS: %s\n", $5
            printf "  Admin: %s\n", $6
            printf "  Serial: %s\n", $7
            printf "  Refresh: %s\n", $8
            printf "  Retry: %s\n", $9
            printf "  Expire: %s\n", $10
            printf "  TTL: %s\n", $11
        }'
    else
        echo -e "  ${RED}${NC} Aucun enregistrement SOA"
    fi
}

reverse_lookup() {
    local ip=$1
    print_header "REVERSE DNS LOOKUP: $ip"

    local result=$(query_dns "$ip" "PTR" "$DNS_SERVER" 2>/dev/null || dig +short -x "$ip" 2>/dev/null)
    if [[ -n "$result" ]]; then
        echo -e "\n  ${GREEN}${NC} $ip -> $result"
    else
        echo -e "\n  ${RED}${NC} Pas de PTR pour $ip"
    fi
}

check_propagation() {
    local domain=$1
    print_header "DNS PROPAGATION: $domain"

    local dns_servers=(
        "8.8.8.8:Google"
        "1.1.1.1:Cloudflare"
        "9.9.9.9:Quad9"
        "208.67.222.222:OpenDNS"
        "8.26.56.26:Comodo"
    )

    echo ""
    printf "  %-20s %-15s %s\n" "DNS SERVER" "PROVIDER" "RESULT"
    printf "  %-20s %-15s %s\n" "----------" "--------" "------"

    for entry in "${dns_servers[@]}"; do
        local server=${entry%%:*}
        local name=${entry##*:}

        local result=$(query_dns "$domain" "A" "$server")
        if [[ -n "$result" ]]; then
            result=$(echo "$result" | head -1)
            echo -e "  ${GREEN}${NC} $server    $name    $result"
        else
            echo -e "  ${RED}${NC} $server    $name    N/A"
        fi
    done
}

main() {
    local domain=""
    local reverse_ip=""
    local propagation=false

    # Parse arguments
    while [[ $# -gt 0 ]]; do
        case $1 in
            -t|--type)
                RECORD_TYPE="$2"
                shift 2
                ;;
            -s|--server)
                DNS_SERVER="$2"
                shift 2
                ;;
            -r|--reverse)
                reverse_ip="$2"
                shift 2
                ;;
            -p|--propagation)
                propagation=true
                shift
                ;;
            -h|--help)
                usage
                exit 0
                ;;
            -*)
                echo "Unknown option: $1"
                usage
                exit 1
                ;;
            *)
                domain="$1"
                shift
                ;;
        esac
    done

    # Reverse lookup
    if [[ -n "$reverse_ip" ]]; then
        reverse_lookup "$reverse_ip"
        exit 0
    fi

    # Propagation check
    if [[ "$propagation" == "true" ]]; then
        if [[ -z "$domain" ]]; then
            echo "Error: Domaine requis pour vérification propagation"
            exit 1
        fi
        check_propagation "$domain"
        exit 0
    fi

    # Validation
    if [[ -z "$domain" ]]; then
        echo "Error: Domaine requis"
        usage
        exit 1
    fi

    # Header
    print_header "DNS LOOKUP: $domain"
    [[ -n "$DNS_SERVER" ]] && echo -e "  Using DNS Server: $DNS_SERVER"

    # Lookup par type
    case "${RECORD_TYPE,,}" in
        a)      lookup_a "$domain" ;;
        aaaa)   lookup_aaaa "$domain" ;;
        mx)     lookup_mx "$domain" ;;
        ns)     lookup_ns "$domain" ;;
        txt)    lookup_txt "$domain" ;;
        cname)  lookup_cname "$domain" ;;
        soa)    lookup_soa "$domain" ;;
        all|*)
            lookup_a "$domain"
            lookup_aaaa "$domain"
            lookup_cname "$domain"
            lookup_mx "$domain"
            lookup_ns "$domain"
            lookup_txt "$domain"
            lookup_soa "$domain"
            ;;
    esac

    echo ""
}

main "$@"

Usage

# Rendre exécutable
chmod +x dns-lookup.sh

# Tous les enregistrements
./dns-lookup.sh google.com

# Type spécifique
./dns-lookup.sh -t MX gmail.com
./dns-lookup.sh -t A example.com

# Server DNS spécifique
./dns-lookup.sh -s 8.8.8.8 example.com

# Reverse lookup
./dns-lookup.sh -r 8.8.8.8

# Check la propagation
./dns-lookup.sh -p example.com

Sortie Exemple

═══════════════════════════════════════════════════════════
  DNS LOOKUP: github.com
═══════════════════════════════════════════════════════════

▶ A Records (IPv4)
  ✓ 140.82.112.4

▶ AAAA Records (IPv6)
  ○ Aucun enregistrement AAAA

▶ CNAME Record
  ○ Pas de CNAME (enregistrement direct)

▶ MX Records (Mail)
  ✓ [1] aspmx.l.google.com.
  ✓ [5] alt1.aspmx.l.google.com.
  ✓ [5] alt2.aspmx.l.google.com.

▶ NS Records (Name Servers)
  ✓ dns1.p08.nsone.net. (198.51.44.8)
  ✓ dns2.p08.nsone.net. (198.51.45.8)
  ✓ ns-1283.awsdns-32.org. (205.251.197.3)
  ✓ ns-1707.awsdns-21.co.uk. (205.251.198.171)

▶ TXT Records
  ✓ "v=spf1 include:_spf.google.com include:servers.mcsv.net ~all"
  ✓ "MS=ms58704441"

▶ SOA Record
  Primary NS: dns1.p08.nsone.net.
  Admin: hostmaster.nsone.net.
  Serial: 1705317600
  Refresh: 43200
  Retry: 7200
  Expire: 1209600
  TTL: 3600

Voir Aussi