É bom saber o que os RFCs dizem sobre o assunto, e já temos uma boa resposta autorizada sobre isso, mas, para fins práticos, acho bastante divertido o conselho do Prof. Daniel J. Bernstein, PhD, autor do DJBDNS.
http://cr.yp.to/djbdns/tcp.html#why (2003-01-16)
Quando as consultas TCP são enviadas?
Se você estiver em uma das seguintes situações, precisará configurar o servidor DNS para responder a consultas TCP:
- Você deseja publicar conjuntos de registros maiores que 512 bytes. (Isso quase sempre é um erro.)
- Você deseja permitir transferências de zona de saída, por exemplo, para um servidor de terceiros.
- Um servidor pai se recusa a delegar um nome para você até você configurar o serviço TCP.
Se você não estiver em nenhuma dessas situações, não precisará fornecer o serviço TCP e não deverá configurá-lo. O DNS sobre TCP é muito mais lento que o DNS sobre UDP e é inerentemente muito mais vulnerável a ataques de negação de serviço. (Isso também se aplica ao BIND.)
Observe que ele omite uma menção explícita ao DNSSEC; o motivo é que, de acordo com a DJB, o DNSSEC se enquadra na categoria "sempre um erro". Consulte https://cr.yp.to/djbdns/forgery.html para obter mais detalhes. O DJB possui um padrão alternativo, chamado DNSCurve - http://dnscurve.org/ - que já foi adotado independentemente por alguns provedores (como o OpenDNS). De interesse: /security/45770/if-dnssec-is-so-questionable-why-is-it-ahead-of-dnscurve-in-adoption .
Observe que, se a documentação acima na configuração do DJBDNS for uma indicação de seus recursos, parece que ele suporta apenas o AXFR para TCP. Como muitos provedores ainda usam o DJBDNS, é improvável que eles ofereçam suporte ao DNS sobre TCP sem esforços extras.
PS Observe que, de fato, o DJB pratica o que ele prega. Seus próprios servidores, (1), executam DNSCurve, (2), não respondem adequadamente ao TCP. Somente o +notcp
seria bem-sucedido (que é o padrão):
% 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
, enquanto um +tcp
falharia (aparentemente com uma mensagem de erro diferente, dependendo de qual servidor dele é selecionado):
% 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