Il est bon de savoir ce que disent les RFC sur le sujet, et nous avons déjà une bonne réponse faisant autorité à ce sujet, mais à des fins pratiques, je trouve les conseils du professeur Daniel J. Bernstein, PhD, auteur de DJBDNS, très divertissants.
http://cr.yp.to/djbdns/tcp.html#why (2003-01-16)
Quand les requêtes TCP sont-elles envoyées?
Si vous êtes dans l'une des situations suivantes, vous devez configurer votre serveur DNS pour répondre aux requêtes TCP:
- Vous souhaitez publier des jeux d'enregistrements supérieurs à 512 octets. (C'est presque toujours une erreur.)
- Vous souhaitez autoriser les transferts de zone sortants, par exemple vers un serveur tiers.
- Un serveur parent refuse de vous déléguer un nom jusqu'à ce que vous configuriez le service TCP.
Si vous n'êtes dans aucune de ces situations, vous n'avez pas besoin de fournir de service TCP et vous ne devez pas le configurer. DNS-over-TCP est beaucoup plus lent que DNS-over-UDP et est intrinsèquement beaucoup plus vulnérable aux attaques par déni de service. (Cela s'applique également à BIND.)
Notez qu'il omet une mention explicite de DNSSEC; la raison en est que, selon DJB, DNSSEC relève de la catégorie "toujours une erreur". Voir https://cr.yp.to/djbdns/forgery.html pour plus de détails. DJB a une norme alternative, appelée DNSCurve - http://dnscurve.org/ - qui a déjà été adoptée indépendamment par certains fournisseurs (comme OpenDNS). D'intérêt: /security/45770/if-dnssec-is-so-questionable-why-is-it-ahead-of-dnscurve-in-adoption .
Notez que si la documentation ci-dessus sur la configuration de DJBDNS est une indication de ses fonctionnalités, il semble qu'elle ne supporte que AXFR pour TCP. Comme de nombreux fournisseurs utilisent encore DJBDNS, il est donc peu probable qu'ils prennent en charge DNS sur TCP sans efforts supplémentaires.
PS Notez que DJB pratique en fait ce qu'il prêche. Ses propres serveurs, (1), exécutent DNSCurve, (2), ne répondent pas correctement à TCP. Seul le +notcp
réussirait (ce qui est par défaut):
% 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
, alors qu'un +tcp
échouerait (apparemment avec un message d'erreur différent, selon lequel de ses serveurs sera sélectionné):
% 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