systemadmin.es > DNS > Número máximo de resolvers (resolv.conf)

Número máximo de resolvers (resolv.conf)

He visto muchas veces la tendencia a ir añadiendo resolvers en el /etc/resolv.conf y acabar con una lista enorme. Debemos ser conscientes que existe un número máximo, y no es tan grande.

Consultando el man resolv.conf (CentOS) podemos leer:

nameserver: Name server IP address Internet address (in dot notation) of a name server that the resolver should query. Up to MAXNS (currently 3, see <resolv.h>) name servers may be listed, one per keyword. If there are multiple servers, the resolver library queries them in the order listed. If no nameserver entries are present, the default is to use the name server on the local machine. (The algorithm used is to try a name server, and if the query times out, try the next, until out of name servers, then repeat trying all the name servers until a maximum number of retries are made.)

Podemos comprobarlo mediante el grep del resolv.h:

# grep MAXNS /usr/include/resolv.h
# define MAXNS			3	/* max # name servers we'll track */
(...)

Lo he comprobado en CentOS 5, CentOS 6, Debian 7.2 wheezy y FreeBSD 9.2, en todos el número máximo es 3, por lo que no nos va a servir de nada ir añadiendo resolvers porque no se van a usar.

9 comments to “Número máximo de resolvers (resolv.conf)”

  1. Realmente son hasta 4 resolvers porque en Unix/C el cero se cuenta como número y es el comienzo de los mismos.

  2. @Juan Angulo Moreno: Tienes toda la razón, al ser un array como mucho va a usar 4 servidores. Lo he modificado en el post.

    Muchas gracias por la aportación!

  3. Hombre, en el momento en que quieres trabajar con tantos servidores DNS casi mejor montarse un BIND en local y ponérselos como forwarders, no?

  4. @KyleBOFH: Efectivamente, tendría mucho más sentido, pero muchas veces se van añadiendo “por si a caso”

  5. Lo que dice la página del man es correcto: el máximo es 3. Tenéis razón en que se reserva memoria para hasta 4 elementos, pero si miráis el código de la glibc, veréis que todos los bucles tienen esta estructura (archivos resolv/res_*.c):

    for (ns = 0;  ns < MAXNS;  ns++) ...
    

    con lo que solo se leen hasta MAXNS elementos del array, aunque se reserve memoria para MAXNS+1.

  6. No soy experto en C, pero según entiendo, array_name[3] nos da 3 posiciones, y los indices van de 0 a 2.

    Según entiendo, un sizeof(array_name)/sizeof(tipo de dato de los elementos) = 3 en este caso. (Que es la forma de hacer un len() en C)

    En el man resolv.conf en un Ubuntu, vemos esto:

    "... Up  to  MAXNS (currently 3, see ) name servers may be listed...".
    

    Tanto por código como por documentación, me parece que son 3, no 4.

    Una cosa mas. Intente compilar con gcc el siguiente codigo:

    #include 
    
    #define MAXNS 3
    
    double test[MAXNS] = {1000.0, 2.0, 3.4, 7.0};
    
    void main(){
    	printf("%f\n", test[3]);
    }
    

    Y obtuve el siguiente error:

    array_test.c:5:1: warning: excess elements in array initializer [enabled by default]
     double test[MAXNS] = {1000.0, 2.0, 3.4, 7.0};
     ^
    array_test.c:5:1: warning: (near initialization for ‘test’) [enabled by default]
    

    Si elimino un elemento, el código compila sin problema.

    Espero que aporte.

  7. Uf, tiene razón Tomás, lo que hace leer rápido. Si variable[MAXNS], se reserva para MAXNS elementos que van de los índices 0 a MAXNS-1, y no de 0 a MAXNS. En cualquier caso 3, como dice la página del manual.

  8. Sergio, ojo, que en mi caso es el man de un Ubuntu 13.10, supongo que de OS a OS puede llegar a cambiar.

  9. Sí, yo también me he liado. Son efectivamente 3 posiciones reservadas y usa esas tres

    Muchas gracias a todos por los comentarios!

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>