È bello sapere cosa dicono gli RFC sull'argomento e abbiamo già una buona risposta autorevole al riguardo, ma per scopi pratici trovo abbastanza divertente il consiglio del Prof. Daniel J. Bernstein, PhD, autore di DJBDNS.
http://cr.yp.to/djbdns/tcp.html#why (2003-01-16)
Quando vengono inviate le query TCP?
Se ti trovi in una delle seguenti situazioni, devi configurare il tuo server DNS per rispondere alle query TCP:
- Si desidera pubblicare set di record di dimensioni superiori a 512 byte. (Questo è quasi sempre un errore.)
- Si desidera consentire i trasferimenti di zona in uscita, ad esempio a un server di terze parti.
- Un server di appartenenza rifiuta di delegarti un nome fino a quando non imposti il servizio TCP.
Se non ci si trova in nessuna di queste situazioni, non è necessario fornire il servizio TCP e non è necessario configurarlo. DNS-over-TCP è molto più lento di DNS-over-UDP ed è intrinsecamente molto più vulnerabile agli attacchi denial-of-service. (Questo vale anche per BIND.)
Si noti che omette una menzione esplicita di DNSSEC; il motivo è che, secondo DJB, DNSSEC rientra nella categoria "sempre un errore". Vedi https://cr.yp.to/djbdns/forgery.html per maggiori dettagli. DJB ha uno standard alternativo, chiamato DNSCurve - http://dnscurve.org/ - che è già stato adottato in modo indipendente da alcuni provider (come OpenDNS). Di interesse: /security/45770/if-dnssec-is-so-questionable-why-is-it-ahead-of-dnscurve-in-adoption .
Si noti che se la documentazione di cui sopra sulla configurazione di DJBDNS è indicativa delle sue caratteristiche, sembra che supporti solo AXFR per TCP. Poiché molti provider utilizzano ancora DJBDNS, è improbabile che supportino DNS su TCP senza sforzi aggiuntivi.
PS Nota che DJB, in effetti, pratica ciò che predica. I suoi server, (1), eseguono DNSCurve, (2), non rispondono correttamente a TCP. Solo il +notcp
successo (che è predefinito):
% dig +trace @ordns.he.net +notcp cr.yp.to | tail
yp.to. 86400 IN NS uz5dz39x8xk8wyq3dzn7vpt670qmvzx0zd9zg4ldwldkv6kx9ft090.ns.yp.to.
yp.to. 86400 IN NS uz5jmyqz3gz2bhnuzg0rr0cml9u8pntyhn2jhtqn04yt3sm5h235c1.yp.to.
;; Received 300 bytes from 216.74.32.100#53(tonic.to) in 151 ms
cr.yp.to. 600 IN A 131.155.70.11
cr.yp.to. 600 IN A 131.155.70.13
yp.to. 3600 IN NS uz5jmyqz3gz2bhnuzg0rr0cml9u8pntyhn2jhtqn04yt3sm5h235c1.yp.to.
yp.to. 3600 IN NS uz5dz39x8xk8wyq3dzn7vpt670qmvzx0zd9zg4ldwldkv6kx9ft090.yp.to.
;; Received 244 bytes from 131.155.70.13#53(uz5jmyqz3gz2bhnuzg0rr0cml9u8pntyhn2jhtqn04yt3sm5h235c1.yp.to) in 14 ms
, mentre a +tcp
fallirebbe (apparentemente con un messaggio di errore diverso, a seconda di quale dei suoi server viene selezionato):
% dig +trace @ordns.he.net +tcp cr.yp.to | tail
yp.to. 86400 IN NS uz5hjgptn63q5qlch6xlrw63tf6vhvvu6mjwn0s31buw1lhmlk14kd.ns.yp.to.
;; Received 300 bytes from 216.74.32.100#53(tonic.to) in 150 ms
;; Connection to 131.155.71.143#53(uz5dz39x8xk8wyq3dzn7vpt670qmvzx0zd9zg4ldwldkv6kx9ft090.ns.yp.to) for cr.yp.to failed: connection refused.
;; communications error to 131.155.70.13#53: end of file
;; Connection to 131.155.71.143#53(uz5dz39x8xk8wyq3dzn7vpt670qmvzx0zd9zg4ldwldkv6kx9ft090.ns.yp.to) for cr.yp.to failed: connection refused.
;; communications error to 131.155.70.13#53: end of file
;; Connection to 131.155.71.143#53(uz5dz39x8xk8wyq3dzn7vpt670qmvzx0zd9zg4ldwldkv6kx9ft090.ns.yp.to) for cr.yp.to failed: connection refused.
;; communications error to 131.193.32.147#53: end of file
;; connection timed out; no servers could be reached