Le query DNS su porta TCP

Fin dalla notte dei tempi abbiamo preso per assodato che le query rivolte verso un server DNS sono dirette sulla porta UDP 53. Poi, sappiamo che il trasferimento dei file di zona tra server DNS, invece, viaggiano sulla porta 53 TCP.
In realtà manca qualcosa.

Il protocollo UDP porta un problema: visto che l’header non ha tutte le caratteristiche del TCP, sarebbe impossibile “unire” due o più pacchetti UDP, per cui è evidente che nasce un limite oggettivo sulla dimensione della risposta ad una query UDP che normalmente è settata a 512 Bytes.

Potrebbe accadere, però che una query debba avere un risultato più grande dei comuni 512 Bytes: ad esempio la crescente diffusione del protocollo DNSSEC oppure alcuni record TXT o SRV particolarmente grandi. Cosa fare?

L’rfc del DNS ci viene in soccorso con un escamotage semplice ed efficace: nel caso in cui il risultato di una query sia di dimensione maggiore dei canonici 512 Bytes, è possibile rispondere alla query con un record vuoto ma settando il bit TC dell’header a 1. Così facendo, si istruisce il client DNS a riproporre la query sulla porta 53 TCP in modo che sia possibile concatenare più pacchetti.

Questa modalità in un primo tempo è stata pesantemente criticata, tanto è vero che nell’rfc è ben specificato che un server DNS deve rispondere alle richieste UDP e può (facoltativo) rispondere alle richieste TCP. La critica nasce dal fatto che l’overhead del protocollo TCP rispetto all’UDP è maggiore e quindi tutto l’insieme server/rete viene stressato maggiormente.

Col passare del tempo, però, la potenza dei server è aumentata, così come la disponibilità di banda, per cui le iniziali critiche all’utilizzo del protocollo TCP al posto dell’UDP diventano poco influenti e si iniziano a valutare i benefici che questo cambiamento porterebbe. Il più evidente è che è più facile arginare un attacco di tipo DDOS su porta TCP e, visto il continuo aumento di questo tipo di attacco, la cosa è da tenere in considerazione.

Al momento, i più diffusi demoni DNS (Bind e PowerDNS) non consentono di “rigirare” tutte le query da UDP a TCP, è necessario creare un demone DNS ad hoc. Per la cronaca CloudFlare ha già provveduto a implementare questa funzionalità sui suoi server DNS e il servizio AlwaysResolve ha pianificato questa funzionalità nella prossima release.