11024 Letture

DNS: uno script per controllare se un nome a dominio viene risolto correttamente

Presentiamo un semplice script VBS che consente di evitare di impartire diverse volte il comando nslookup da Windows per verificare se il nome a dominio del proprio sito web venga correttamente risolto dai principali nameserver italiani e stranieri.

In questo articolo abbiamo pubblicato una breve guida sul funzionamento dei server DNS spiegando quando può essere utile sostituirli e come verificarne le performance.

Se si gestisce un sito web può essere utile verificare, periodicamente, che i principali server DNS dei vari provider Internet risolvano correttamente il proprio nome a dominio. E' importante insomma controllare che all'indirizzo www.nomedelsito.it sia associato l'indirizzo IP corretto.
Avere a disposizione uno script capace di automatizzare l'intera procedura di controllo può essere importante, anche nei casi in cui – dopo aver cambiato provider o comunque fornitore dei servizi hosting/housing – si voglia esaminare la corretta propagazione del nuovo indirizzo.

Lo script che vi proponiamo può essere utilizzato semplicemnte copiandolo all'interno di un file di testo quindi rinominando tale file con l'estensione .vbs:


' ////// INIZIO DATI DA MODIFICARE //////////////////////////
strDominio="www.nomedelsito.xx"
strIP="127.0.0.1"
strDNS=array("151.99.125.1","151.99.125.2","151.99.125.3","212.216.112.112","151.99.0.100",_
	"193.70.192.100","195.210.91.100","212.245.158.66",_
	"8.8.8.8","8.8.4.4","208.67.222.222","208.67.220.220","198.153.192.1","198.153.194.1","156.154.70.22","156.154.71.22")
' ////// FINE DATI DA MODIFICARE ////////////////////////////

strReport=""
stringa="Server:"
lungh_array=ubound(strDNS)
Set objShell = CreateObject("WScript.Shell")

For i=0 to lungh_array
	strCommand = "nslookup "& strDominio &" "& strDNS(i)
	Set objExecObject = objShell.Exec(strCommand)

	Do While Not objExecObject.StdOut.AtEndOfStream
		strResults = objExecObject.StdOut.ReadAll()
	Loop
	
	if instr(strResults, strIP)=0 then
		strReport=strReport&strDNS(i)
		posnomeserver=instr(strResults, stringa)
		if posnomeserver>0 then
			posnomeserver=posnomeserver+len(stringa)
			acapo=instr(posnomeserver,strResults,vbcrlf)
			nomeserver=trim(mid(strResults,posnomeserver,acapo-posnomeserver))
			strReport=strReport&" ("&nomeserver&")"
		end if
		strReport=strReport&vbcrlf
	end if
Next

if strReport="" then
	WScript.Echo "Verificati "& lungh_array+1 &" nameservers."& vbcrlf &"Tutti i server DNS hanno risposto nel modo atteso risolvendo correttamente "& strDominio &" in "& strIP &"."
else
	strReport="Verificati "& lungh_array+1 &" nameservers."& vbcrlf &"I seguenti server DNS hanno risposto in modo inatteso:"& vbcrlf &strReport& vbcrlf &"Il nome a dominio "& strDominio &" non è stato risolto in "& strIP &"."
	WScript.Echo strReport
end if

Il funzionamento dello script è di immediata comprensione. Le uniche variazioni che debbono essere apportate al codice dello script consistono nella modifica dei valori delle variabili strDominio, strIP ed eventualmente dell'array strDNS.
La prima deve essere inizializzata specificando il nome a dominio oggetto della verifica mentre a strIP deve essere assegnato (sostituire 127.0.0.1) l'IP corretto ossia l'indirizzo corretto che i nameserver dovrebbero restituire in risposta ad ogni interrogazione sul nome a dominio indicato.


L'array strDNS è già inizializzato e, come si vede, abbiamo già provveduto ad indicare numerosi DNS pubblici di alcuni provider italiani e non. Ovviamente, è possibile estendere la lista dei nameserver o rimuovere quelli che non interessano secondo le proprie necessità.

Nel nostro caso, dopo aver correttamente impostato le prime due variabili, salvato lo script e fatto doppio clic sul file VBS, abbiamo ottenuto il seguente messaggio:


Qualora uno o più DNS non dovessero risolvere, nel modo atteso, l'indirizzo mnemonico specificato (es.: www.ilsoftware.it), lo script VBS mostrerebbe un messaggio simile al seguente:


Il ciclo for (riga 14) si occupa di invocare, per ciascun DNS indicato nell'array strDNS, il comando nslookup.
Quanto restituito dal comando nslookup viene inserito nella variabile strResults.

I successivi due if (righe 22-32) si occupano, innanzi tutto di verificare se l'IP indicato nella variabile strIP sia presente nella risposta di nslookup (riga 22) quindi provvedono ad estrarre il nome del server DNS (righe 24-29).
Nella variabile strReport vengono annotati gli eventuali DNS che dovessero rispondere in maniera non corretta.

Lo script VBS è ovviamente migliorabile permettendo, se lo si desidera, l'inserimento da finestra di dialogo dei valori delle prime due variabili e descrivendo il messaggio d'errore eventualmente restituito dai vari nameservers.


  1. Avatar
    Michele Nasi
    02/12/2011 13:18:35
    Ti assicuro che lo script funziona perfettamente (come puoi vedere anche dalle immagini pubblicate nell'articolo). L'ho sviluppato e lo sto usando quasi quotidianamente per esigenze personali. Da riga di comando non riesci a lanciare un semplice nslookup http://www.google.it 151.99.0.100 ? E' esattamente ciò che viene fatto iterativamente da codice e che, da riga di comando, si è sempre fatto per anni.
  2. Avatar
    rguru
    02/12/2011 12:53:43
    Eh, ma lo script non funziona. Il comando nslookup che crei nel codice, poi, di fatto, non funziona se copiato ed incollato nella riga di comando. Ho dato un'occhiata alla documentazione di nslookup sul sito MS ed apparentemente non si può settare il server DNS da interroga utilizzando la modalità non-interattiva. La soluzione sarebbe quella di creare il processo, agganciare la STDIN e passargli manualmente il comando "server IP_DEL_SERVER " e poi un secondo rigo con il nome del dominio.
DNS: uno script per controllare se un nome a dominio viene risolto correttamente - IlSoftware.it