Forcer les requêtes DNS du redirecteur en mode TCP

9

J'ai installé un serveur DNS sur SLES10 (lie actuellement 9.6) sur un serveur multi-hébergé. Ce serveur peut être interrogé à partir de tous les réseaux internes et fournit des réponses pour tous les réseaux internes. Nous avons deux zones DNS "maîtres" distinctes. Chacune de ces zones est desservie par un certain nombre de serveurs Windows-DNS faisant autorité.

Maintenant, mon serveur linux est un serveur DNS secondaire pour l'une de ces zones (zone interne privée) et agit en tant que transitaire pour l'autre zone (zone interne publique).

Jusqu'à récemment, cette configuration fonctionnait sans problème. Maintenant, je reçois - lors de l'interrogation de la zone interne publique (par exemple par la hostcommande sur un client Linux) le message d'erreur

;; Troncature, nouvelle tentative en mode TCP

un wirehark-dump a révélé la cause de ceci: la première requête sort en mode UDP, la réponse ne rentre pas dans UDP (en raison de la longue liste de NS faisant autorité), puis elle est réessayée en mode TCP, fournissant la bonne réponse.

Maintenant, la question: Puis-je configurer ma liaison pour interroger les redirecteurs en mode TCP sans essayer d'abord UDP?

Mise à jour: Essayer ma main sur l'art ASCII ...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client|
                  +------+   +------+
Nils
la source
un petit diagramme de ceci serait utile - j'ai du mal à déterminer quel serveur est lequel de votre description.
Alnitak
un peu mieux, même si on ne sait toujours pas exactement quels hôtes vous exécutez cette hostcommande et quelle requête est envoyée.
Alnitak
Les clients demandent via SLES10 les entrées de la zone publique interne. La zone privée interne ne souffre pas - car il n'y a que 2 entrées NS là-bas.
Nils
et les clients ne sont que de simples résolveurs de talons?
Alnitak
vous suggérons d'ajouter minimal-responses: yesà la configuration BIND sur SLES 10 - cela peut réduire les tailles de réponse. Dans tous les cas, la plupart des requêtes normales ne dépasseront pas la limite de 512 octets.
Alnitak

Réponses:

8

Tout d'abord, je n'appellerais pas cela une erreur, juste un message d'information.

Deuxièmement, les serveurs DNS répondront toujours aux requêtes UDP (au moins BIND, je ne trouve pas d'options pour désactiver UDP) et les clients essaieront toujours (?) D'abord d'envoyer une requête UDP (par exemple, il n'y a pas d'options dans resolv.conf pour changer cela ni dans la JVM) - s'ils tiennent dans un paquet UDP (les requêtes le font généralement)

Si vous avez un cas d'utilisation spécifique, vous pouvez spécifier d'utiliser TCP, par exemple dans le script shell, utilisez 'dig + tcp' ou 'host -T' pour la résolution, et vous pouvez utiliser les appels système 'sethostent / gethostbyname / endhostent' (voir man page) pour forcer TCP dans les autres cas.

Si vous voulez vraiment essayer de bloquer UDP, la seule option que je peux voir est avec une règle iptable, mais je ne suis pas sûr que cette configuration fonctionnerait. Je m'attends à ce que la résolution DNS échoue tout simplement.

Dan Andreatta
la source
il y a nominalement un avantage de performance à savoir a priori que la requête UDP échouera, et à essayer d'abord TCP. Voir RFC 5966 pour une discussion à ce sujet.
Alnitak
@Alnitak et moi aimerions bénéficier de cet avantage.
Nils
1
@Nils nous devons donc comprendre pourquoi EDNS ne fonctionne apparemment pas ...
Alnitak
Je n'ai pas de cas d'utilisation particulier - les clients utiliseront leur bibliothèque de résolveurs - mais chaque demande et chaque réponse passeront deux fois sur le réseau - je n'aime pas ça.
Nils
@Nils, le problème est que le client décide UDP / TCP, mais le serveur connaît la taille de la réponse.
Dan Andreatta
4

Votre serveur BIND doit utiliser EDNS (voir RFC 2671) pour autoriser les paquets UDP de plus de 512 octets.

options {
    edns-udp-size 4096;
    max-udp-size 4096;
};

Cela devrait permettre à votre grand ensemble NS d'être récupéré sur UDP, sans nécessiter la surcharge d'une connexion TCP pour d'autres requêtes plus petites.

Notez cependant qu'il s'agit en fait des valeurs par défaut. Si EDNS n'est pas utilisé, soit quelque chose le bloque, soit les serveurs recevant les options EDNS ne le prennent pas en charge.

Notez également que hostne prend pas en charge EDNS. Il est parfaitement possible que vos requêtes de redirecteur -> serveur utilisent déjà EDNS, et vous ne pouvez tout simplement pas le voir lorsque vous essayez avec votre client local.

Essayez dig +bufsize=4096 @server hostname Aau lieu d'utiliser host.

Alnitak
la source
Qui devrait utiliser cela? A la fois mon serveur et mes redirecteurs de la zone "public interne"?
Nils
Quel est le sens d'envoyer la liste complète des NS dans la réponse de toute façon?
Nils
@Nils le protocole DNS nécessite que l'ensemble complet des entrées correspondant au même tuple (QNAME, QTYPE et QCLASS) soit indivisible (alias un "RRset")
Alnitak
pouvez-vous s'il vous plaît me diriger vers le RFC concernant ce RRset?
Nils
1
L'hôte Actaully utilise la bibliothèque de résolveurs standard et sur mon poste de travail, il prend en charge EDNS0. Pour tester si la demande spécifie EDNS0, exécutez 'tcpdump -x port 53' et le vidage hexadécimal devrait contenir (vers la fin, dans la section supplémentaire) la séquence 0029 1000 0000 8000 0000, qui est la représentation binaire de l'OPT RR.
Dan Andreatta