Come cercare in modo efficiente nella cache DNS su Linux utilizzando uno script Bash per professionisti IT

Nell’attuale panorama IT, una gestione efficiente della rete è fondamentale. Un componente chiave di questa gestione è il caching del DNS (Domain Name System), che può migliorare in modo significativo le prestazioni della rete riducendo il tempo necessario per risolvere i nomi di dominio.

Per i professionisti dell’IT, in particolare per quelli che gestiscono più sistemi, la comprensione e l’utilizzo delle informazioni sulla cache DNS sono fondamentali. In questo articolo analizzeremo uno script Bash progettato per cercare nella cache DNS sui sistemi Linux, e forniremo una descrizione dettagliata del suo funzionamento, dei casi d’uso e delle best practice per l’implementazione.

Background

La cache DNS memorizza i risultati delle query DNS localmente su un dispositivo, consentendo di rispondere più rapidamente alle richieste successive per gli stessi nomi di dominio. Mentre i server in genere non hanno servizi di cache DNS abilitati per impostazione predefinita, alcuni ambienti desktop come GNOME o KDE spesso li hanno, e utilizzano servizi come systemd-resolved o dnsmasq.

Questo è stato progettato per aiutare i professionisti IT e i Managed Service Provider (MSP) a cercare e recuperare le voci della cache DNS sui sistemi Linux. La possibilità di cercare tra le voci della cache DNS può essere fondamentale per la risoluzione di problemi di rete, per indagare su potenziali incidenti di sicurezza o semplicemente per ottimizzare le prestazioni della rete.

Fornendo un modo sistematico per accedere a queste voci e filtrarle, lo script per cercare nella cache DNS su Linux aiuta a semplificare le attività che altrimenti richiederebbero metodi più complessi o lunghi.

Lo script per cercare nella cache DNS su Linux:

#!/usr/bin/env bash

# Description: Find DNS Cache entries on a Linux system. Supports systemd-resolved and dnsmasq(requires log-facility to be configured).
#
# Servers usually do not have a DNS cache service installed by default.
# systemd-resolved is commonly installed along with most Desktop Environments, such as GNOME and KDE.
#
# Release Notes: Initial Release
#   By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://ninjastage2.wpengine.com/terms-of-use.
#   Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
#   Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
#   Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
#   Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
#   Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
#   Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
#   EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).

# A comma separated list of keywords to search for in the DNS cache. Example: "google,comcast,cloudflare"
keywords_to_search=$1
# A multiline custom field to save the DNS cache entries.
multiline_custom_field=$2

# Check if the multilineCustomField is set
if [[ -n "${multilineCustomField}" && "${multilineCustomField}" != "null" ]]; then
    multiline_custom_field=$multilineCustomField
fi

# Check if the keywordsToSearch is set
if [[ -n "${keywordsToSearch}" && "${keywordsToSearch}" != "null" ]]; then
    keywords_to_search=$keywordsToSearch
fi

# Check if the keywords_to_search is set
if [[ -z "${keywords_to_search}" ]]; then
    echo "[Info] keywords_to_search is not set."
    exit 1
else
    # Split the keywords_to_search into an array
    OLDIFS=$IFS
    IFS=',' read -r -a keywords <<<"${keywords_to_search}"
    IFS=$OLDIFS
    # Trim trailing and leading whitespace from each keyword
    keywords=("${keywords[@]/ /}")

fi

# Check if the multiline_custom_field is set
if [[ -z "${multiline_custom_field}" ]]; then
    echo "[Info] multilineCustomField is not set."
fi

# Check if ninjarmm-cli command exists in the default path
ninjarmm_cli="/opt/NinjaRMMAgent/programdata/ninjarmm-cli"
if [[ -z $ninjarmm_cli ]]; then
    echo "[Error] The ninjarmm-cli command does not exist in the default path. Please ensure the NinjaRMM agent is installed before running this script."
    exit 1
else
    # ninjarmm-cli command exists in the default path
    echo -n
fi

# Check that we are running as root
if [[ $EUID -ne 0 ]]; then
    echo "[Error] This script must be run as root."
    exit 1
fi

# Check for which dns cache service is installed
if [ "$(command -v resolvectl)" ]; then
    # resolvectl is installed
    dns_cache_service="resolvectl"
elif [ "$(command -v dnsmasq)" ]; then
    # dnsmasq is installed
    dns_cache_service="dnsmasq"
else
    # no dns cache service is installed
    echo "[Error] No DNS cache service is installed on this system that this script supports."
    echo ""
    echo "[Info] Supported DNS cache services: systemd-resolved, dnsmasq"
    echo "[Info] systemd-resolved commonly installed along with a Desktop Environment."
    echo "[Info] Servers usually do not have a DNS cache service installed by default."
    echo ""
    echo "[Info] Installing a DNS cache is not recommended on servers."
    exit 1
fi

# Check if the dns_cache_service is resolvectl
if [[ "${dns_cache_service}" == "resolvectl" ]]; then
    systemdVersion=$(systemctl --version | head -1 | awk '{ print $2}')
    if [ "$systemdVersion" -lt 254 ]; then
        echo "[Error] The version of systemd is less than 254. The resolvectl show-cache command is not available. Currently system version is ${systemdVersion}."
        exit 1
    fi
    # Get the DNS cache entries from resolvectl
    # https://github.com/systemd/systemd/pull/28012
    if ! dns_cache=$(resolvectl show-cache 2>/dev/null); then
        # Check if the systemd-resolved service is active
        if [[ $(systemctl is-active systemd-resolved) != "active" ]]; then
            echo "[Warn] The systemd-resolved service is not active."
        # Check /etc/resolv.conf that the nameserver is set to the default IP address 127.0.0.53 for systemd-resolved to work
        elif ! grep -q "^nameserver 127.0.0.53" /etc/resolv.conf; then
            echo "[Warn] The nameserver in /etc/resolv.conf is not set to an IP address 127.0.0.53 ."
            echo "[Info] The nameserver in /etc/resolv.conf should be set to an IP address 127.0.0.53 for systemd-resolved to work."
        else
            echo "[Warn] Failed to get the DNS cache entries. Is systemd-resolved installed, configured, and running?"
        fi
        echo ""
        echo "[Info] Supported DNS cache services: systemd-resolved, dnsmasq"
        echo "[Info] systemd-resolved commonly installed along with a Desktop Environment."
        echo "[Info] Servers usually do not have a DNS cache service installed by default."
        echo ""
        echo "[Info] Installing a DNS cache is not recommended on servers."
        exit 0
    fi

    dns_cache_entries=""
    # Get the DNS cache entries from resolvectl based on the keywords provided
    for keyword in "${keywords[@]}"; do
        # Example DNS cache entry:
        # consto.com IN A 123.123.123.123
        # consto.com IN AAAA 2001:0db8:85a3:0000:0000:8a2e:0370:7334
        dns_cache_entries+="DNS Cache Records Matching: ${keyword}"
        dns_cache_entries+=$'\n' # newline
        dns_cache_entries+=$(echo "$dns_cache" | grep -i -E "${keyword}")
        dns_cache_entries+=$'\n' # newline
    done
    # Print the DNS cache entries
    echo "" # newline
    echo "$dns_cache_entries"
# Check if the dns_cache_service is dnsmasq
elif [[ "${dns_cache_service}" == "dnsmasq" ]]; then
    if [ -f "/etc/dnsmasq.conf" ]; then
        echo "[Info] dnsmasq configuration file exists."
    else
        echo "[Warn] The dnsmasq configuration file does not exist and is likely not installed or configured."
        echo ""
        echo "[Info] Supported DNS cache services: systemd-resolved, dnsmasq"
        echo "[Info] systemd-resolved commonly installed along with a Desktop Environment."
        echo "[Info] Servers usually do not have a DNS cache service installed by default."
        echo ""
        echo "[Info] Installing a DNS cache is not recommended on servers."
        exit 0
    fi
    # Check that log-queries is enabled in the dnsmasq configuration file
    if ! grep -q "log-queries" /etc/dnsmasq.conf; then
        echo "[Warn] The 'log-queries' option is not enabled in the dnsmasq configuration file."
        echo ""
        echo "[Info] Supported DNS cache services: systemd-resolved, dnsmasq"
        echo "[Info] systemd-resolved commonly installed along with a Desktop Environment."
        echo "[Info] Servers usually do not have a DNS cache service installed by default."
        echo ""
        echo "[Info] Installing a DNS cache is not recommended on servers."
        exit 0
    fi
    # Get the log-facility from the dnsmasq configuration file
    log_facility=$(grep -E "^log-facility" /etc/dnsmasq.conf | awk '{print $2}')
    if [[ -z "${log_facility}" ]]; then
        echo "[Warn] The 'log-facility' option is not set in the dnsmasq configuration file."
        echo ""
        echo "[Info] Supported DNS cache services: systemd-resolved, dnsmasq"
        echo "[Info] systemd-resolved commonly installed along with a Desktop Environment."
        echo "[Info] Servers usually do not have a DNS cache service installed by default."
        echo ""
        echo "[Info] Installing a DNS cache is not recommended on servers."
        exit 0
    fi
    # Check that log_facility is a valid file
    if [[ ! -f "${log_facility}" ]]; then
        echo "[Error] The log facility file '${log_facility}' does not exist."
        echo ""
        echo "[Info] Supported DNS cache services: systemd-resolved, dnsmasq"
        echo "[Info] systemd-resolved commonly installed along with a Desktop Environment."
        echo "[Info] Servers usually do not have a DNS cache service installed by default."
        echo ""
        echo "[Info] Installing a DNS cache is not recommended on servers."
        exit 1
    fi
    # Get the DNS cache entries from log_facility
    # Example log_facility file:
    # Jan  1 00:00:00 dnsmasq[12345]: query[A] example.com from
    for keyword in "${keywords[@]}"; do
        # Get the DNS cache entries from the log_facility file
        # The awk command parses the log_facility file and extracts the time, query, and host
        if ! dns_cache_entries=$(grep -i -E "${keyword}" "${log_facility}" | awk 'BEGIN {OFS = ",";}$5 == "query[A]" {time = mktime(sprintf("%04d %02d %02d %s\n",strftime("%Y", systime()),(match("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3,$2,gensub(":", " ", "g", $3)));query = $6;host = $8;print time, host, query;}'); then
            echo "[Error] Failed to get the DNS cache entries."
            echo "$dns_cache_entries"
            echo ""
            echo "[Info] Supported DNS cache services: systemd-resolved, dnsmasq"
            echo "[Info] systemd-resolved commonly installed along with a Desktop Environment."
            echo "[Info] Servers usually do not have a DNS cache service installed by default."
            echo ""
            echo "[Info] Installing a DNS cache is not recommended on servers."
            exit 1
        fi
    done
    echo "$dns_cache_entries"
fi

# Set the multiline_custom_field
if [[ -n "$multiline_custom_field" ]]; then
    if [[ -x "$ninjarmm_cli" ]]; then
        if hideOutput=$(echo "$dns_cache_entries" | "$ninjarmm_cli" set --stdin "$multiline_custom_field" 2>&1); then
            echo "[Info] Successfully set custom field: $multiline_custom_field"
        else
            echo "[Error] Failed to set custom field: $multiline_custom_field. Custom Field does not exist or does not have write permissions."
            exit 1
        fi
    else
        echo "[Error] NinjaRMM CLI not found or not executable"
        exit 1
    fi
fi

 

Analisi dettagliata

Lo script per cercare nella cache DNS su Linux è strutturato per gestire diversi servizi di cache DNS (systemd-resolved e dnsmasq) che potrebbero essere presenti su un sistema Linux. Ecco una spiegazione passo per passo del funzionamento dello script:

1. Impostazione dei parametri:

  • Lo script per cercare nella cache DNS su Linux inizia accettando due parametri: keywords_to_search e multiline_custom_field.
  • keywords_to_search è un elenco separato da virgole di parole chiave che lo script utilizzerà per cercare tra le voci della cache DNS. Lo script controlla se questi parametri sono impostati e li inizializza di conseguenza.

2. Controllo dell’ambiente:

  • Controlla se è disponibile il comando ninjarmm-cli, necessario allo script per interagire con la piattaforma NinjaOne.
  • Verifica se lo script per cercare nella cache DNS su Linux viene eseguito con privilegi di root, poiché l’accesso root è necessario per interrogare le cache DNS.

3. Rilevamento del servizio di cache DNS:

  • Lo script per cercare nella cache DNS su Linux rileva se systemd-resolved o dnsmasq sono installati e attivi sul sistema. Se non viene trovato nessuno dei due servizi, lo script termina con un messaggio di errore appropriato, informando l’utente che non è installato alcun servizio di cache DNS supportato.

4. Gestione di systemd-resolved:

  • Se viene rilevato systemd-resolved, lo script per cercare nella cache DNS su Linux controlla la versione di systemd per verificare che supporti il comando show-cache (introdotto nella versione 254).
  • Lo script per cercare nella cache DNS su Linux interroga quindi la cache DNS utilizzando resolvectl show-cache e filtra i risultati in base alle parole chiave fornite.

5. Gestione di dnsmasq:

  • Se viene rilevato dnsmasq, lo script per cercare nella cache DNS su Linux verifica la presenza e la configurazione del file dnsmasq.conf, assicurandosi che la registrazione delle query DNS sia abilitata.
  • Cerca quindi nel file di log specificato in dnsmasq.conf le query DNS che corrispondono alle parole chiave fornite.

6. Gestione dell’output:

  • Lo script per cercare nella cache DNS su Linux raccoglie e formatta le voci della cache DNS che corrispondono alle parole chiave.
  • Se viene fornito il parametro multiline_custom_field, lo script per cercare nella cache DNS su Linux tenta di impostare questo campo in NinjaOne utilizzando il comando ninjarmm-cli.

Casi d’uso potenziali

Immagina uno scenario in cui un professionista IT è incaricato di indagare su attività di rete sospette. Nota schemi di traffico insoliti e sospetta che alcuni domini vengano interrogati frequentemente.

Utilizzando questo script, può cercare nella cache DNS su Linux parole chiave specifiche (ad esempio, nomi di dominio sospetti) e recuperare le voci pertinenti in modo rapido. Queste informazioni possono essere utilizzate per bloccare questi domini, regolare le impostazioni del firewall o svolgere ulteriori indagini.

Un altro scenario potrebbe riguardare l’ottimizzazione delle prestazioni della rete. Un MSP che gestisce più reti di clienti potrebbe utilizzare questo script per identificare i domini a cui si accede di frequente nella cache di vari sistemi.

Analizzando queste voci della cache, l’MSP potrebbe consigliare di impostare server DNS locali o criteri di caching per ridurre la latenza e migliorare l’esperienza degli utenti.

Confronti

Sebbene esistano altri metodi per cercare le voci della cache DNS sui sistemi Linux, come l’ispezione manuale dei file di log o l’uso di strumenti come grep in combinazione con i log di sistema, questo script per cercare nella cache DNS su Linux offre un approccio più snello e automatizzato.

Non solo rileva il servizio di caching DNS appropriato, ma gestisce anche i potenziali problemi di configurazione, ed è quindi un’opzione più facile da usare, soprattutto per chi gestisce più sistemi.

Domande frequenti

  • Cosa succede se non è installato alcun servizio di cache DNS? Lo script per cercare nella cache DNS su Linux terminerà e fornirà un messaggio che indica che non è installato alcun servizio di cache DNS supportato, raccomandando di non installarne uno sui server.
  • Questo script può essere usato sui server? Sebbene sia tecnicamente possibile, in genere non è consigliabile eseguire servizi di cache DNS sui server, come evidenziato dai messaggi di output dello script per cercare nella cache DNS su Linux.
  • Perché devo disporre dei privilegi di root per eseguire questo script? L’accesso alle voci della cache DNS richiede in genere permessi elevati, motivo per cui lo script verifica l’accesso di root.

Implicazioni

La possibilità di cercare e analizzare le voci della cache DNS ha implicazioni significative per la sicurezza e le prestazioni della rete. Identificando e reagendo rapidamente a query di dominio insolite o dannose, i professionisti IT possono ridurre i rischi delle potenziali minacce prima che queste ultime si aggravino. Inoltre, l’analisi regolare della cache DNS può aiutare a ottimizzare le configurazioni di rete, migliorando l’efficienza complessiva.

Raccomandazioni

Quando utilizzi questo script per cercare nella cache DNS su Linux, assicurati di:

  • Eseguirlo con i privilegi di root per evitare problemi di permessi.
  • Verificare che systemd-resolved o dnsmasq siano configurati correttamente sul sistema.
  • Aggiornare regolarmente il sistema per garantire la compatibilità con le funzioni più recenti (per esempio, systemd versione 254 o superiore).
  • Utilizzare parole chiave significative e pertinenti per filtrare efficacemente le voci della cache DNS.

Considerazioni finali

Questo script per cercare nella cache DNS su Linux è uno strumento potente per i professionisti IT, soprattutto se integrato con la piattaforma di gestione NinjaOne. Automatizzando il processo di recupero e analisi delle voci della cache DNS, consente una gestione della rete e un monitoraggio della sicurezza più efficienti. L’efficiente suite di strumenti di NinjaOne può migliorare ulteriormente l’utilità di questo script, fornendo soluzioni complete per le attività di gestione IT.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più su NinjaOne Endpoint Management, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.