He configurado un servidor DNS en SLES10 (actualmente bind 9.6) en un servidor multi-homed. Este servidor se puede consultar desde todas las redes internas y ofrece respuestas para todas las redes internas. Tenemos dos zonas DNS "maestras" separadas. Cada una de estas zonas está siendo servida por varios servidores autorizados de DNS de Windows.
Ahora mi servidor Linux es un servidor DNS secundario para una de estas zonas (zona interna privada) y actúa como reenviador para la otra zona (zona interna pública).
Hasta hace poco, esta configuración funcionaba sin problemas. Ahora recibo, al consultar la zona interna pública (por ejemplo, mediante el host
comando en un cliente de Linux), el mensaje de error
;; Truncado, reintentando en modo TCP
un vaciado de wirehark reveló la causa de esto: la primera consulta sale en modo UDP, la respuesta no encaja en UDP (debido a la larga lista de NS autoritativo), luego se vuelve a intentar en modo TCP, entregando la respuesta correcta.
Ahora la pregunta: ¿puedo configurar mi enlace para consultar los reenviadores en modo TCP sin intentar UDP primero?
Actualización: Probar mi mano en ASCII-art ...
+--------------+ +--------------+ +-----------------+
| W2K8R2 DNS | | SLES 10 DNS | | W2K8R2 DNS |
| Zone private +---+ All internal +---+ Zone public |
| internal 2x | | Zones | | internal 30+ x |
+--------------+ +-+----------+-+ +-----------------+
| |
+--+---+ +--+---+
|Client| |Client|
+------+ +------+
host
comando y qué consulta se está enviando.minimal-responses: yes
a la configuración BIND en SLES 10, ya que puede reducir los tamaños de respuesta. En cualquier caso, la mayoría de las consultas normales no excederán el límite de 512 bytes.Respuestas:
Primero, no llamaría a eso un error, solo un mensaje informativo.
En segundo lugar, los servidores DNS siempre responderán consultas UDP (al menos BIND, no puedo encontrar opciones para deshabilitar UDP) y los clientes siempre (?) Intentarán enviar una consulta UDP primero (por ejemplo, no hay opciones en resolv.conf para cambiar eso ni en la JVM) - si encajan en un paquete UDP (las solicitudes generalmente lo hacen)
Si tiene un caso de uso específico, puede especificar el uso de TCP, por ejemplo, en el script de shell use 'dig + tcp' o 'host -T' para la resolución, y puede usar las llamadas del sistema 'sethostent / gethostbyname / endhostent' (vea man página) para forzar TCP en otros casos.
Si realmente quiere intentar bloquear UDP, la única opción que puedo ver es con una regla iptable, pero no estoy seguro de que esa configuración funcione. Espero que la resolución de DNS simplemente falle.
fuente
Su servidor BIND debe estar utilizando EDNS (consulte RFC 2671) para permitir paquetes UDP de más de 512 bytes.
Esto debería permitir que su gran conjunto NS se recupere a través de UDP, sin requerir la sobrecarga de una conexión TCP para otras consultas más pequeñas.
Sin embargo, tenga en cuenta que estos son en realidad los valores predeterminados. Si no se usa EDNS, algo lo está bloqueando o los servidores que reciben las opciones de EDNS no lo admiten.
Además, tenga en cuenta que
host
no es compatible con EDNS. Es perfectamente posible que su reenviador -> las consultas del servidor ya estén utilizando EDNS, y simplemente no puede verlo cuando intenta con su cliente local.Prueba en
dig +bufsize=4096 @server hostname A
lugar de usarhost
.fuente