DNS Server – Algoritmi di ordinamento delle risposte

Capita spesso, in un server DNS, che per un singolo nome host si abbiano più indirizzi IP corrispondenti. In questa situazione il server DNS restituisce un elenco contenente tutti gli indirizzi associati al nome richiesto in fase di risoluzione.

Quando il DNS ha più record A per un singolo nome, esso applica due algoritmi di ordinamento distinti:

  1. ROUND ROBIN
  2. NETMASK ORDERING

Round Robin

Il primo algoritmo è abbastanza semplice, è un primitive load balancing che in maniera ciclica mette in testa alla risposta sempre un server diverso.
Ad esempio se la lista iniziale è A-B-C, il DNS risponderà con:

  • A-B-C
  • B-C-A
  • C-A-B
  • A-B-C
    ...etc...

NetMask Ordering

Il secondo algoritmo, serve per dare priorità alle risorse locali, mettendo in cima alla risposta gli indirizzi che appartengono alla stessa sottorete del client che fa la richiesta.

L’algoritmo utilizza una netmask fissa per individuare la "vicinanza" degli IP, senza tenere conto della netmask dell'IP del client.

Il server utilizza di default una netmask di classe C, che nel caso più semplice, fa si che se un IP della lista ha i primi tre ottetti uguali all'IP del client, allora viene messo in cima alla risposta.

Nel caso di più match positivi, la lista viene sottoposta ulteriormente al Round Robin, sempre però mantenendo il blocco di risorse locali in testa alla risposta.

Riassumendo, il DNS server applica in sequenza questi due algoritmi e ordina la risposta in questo modo:

  1. Risorse locali in Round Robin (se esistono)
  2. Round Robin degli altri record

Come detto, di default è applicata una netmask di classe C (255.255.255.0), ma esiste una chiave per modificare questo comportamento:

[HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters\LocalNetPriorityNetMask]
type: DWORD
Value: FF -> FFFFFF

Questi sono i valori più comuni:

FFFFFF = 255.0.0.0
FFFF = 255.255.0.0
FF = 255.255.255.0

ma si può settare anche un valore specifico in base alla propria configurazione di rete, utilizzando la logica negata per ricavare il valore della chiave partendo dalla netmask:

netmask (DEC)= 255.255.240.0
netmask (BIN)= 11111111.11111111.11110000.00000000
netmask (HEX)= FF.FF.F0.00

negando la netmask si ottiene il valore della chiave: 00.00.0F.FF

netmask (DEC)= 255.255.252.0
netmask (BIN)= 11111111.11111111.11111100.00000000
netmask (HEX)= FF.FF.FC.00

negando la netmask si ottiene il valore della chiave: 00.00.03.FF

E’ importante sottolineare che il NetMask Ordering non tiene conto delle subnet e dei siti configurati in Active Directory, ma solamente dell'IP del client che fa la richiesta.

Per maggiori informazioni è disponibile la seguente documentazione:

Gianluca Bertelli
Support Engineer
Microsoft Enterprise Platforms Support