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.
3. June 2014 at 12:02 pm :
Realmente son hasta 4 resolvers porque en Unix/C el cero se cuenta como número y es el comienzo de los mismos.
3. June 2014 at 12:32 pm :
@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. June 2014 at 12:56 pm :
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?
3. June 2014 at 1:33 pm :
@KyleBOFH: Efectivamente, tendría mucho más sentido, pero muchas veces se van añadiendo “por si a caso”
3. June 2014 at 2:43 pm :
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):
con lo que solo se leen hasta MAXNS elementos del array, aunque se reserve memoria para MAXNS+1.
3. June 2014 at 2:51 pm :
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:
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:
Y obtuve el siguiente error:
Si elimino un elemento, el código compila sin problema.
Espero que aporte.
3. June 2014 at 3:07 pm :
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.
3. June 2014 at 3:13 pm :
Sergio, ojo, que en mi caso es el man de un Ubuntu 13.10, supongo que de OS a OS puede llegar a cambiar.
3. June 2014 at 3:27 pm :
Sí, yo también me he liado. Son efectivamente 3 posiciones reservadas y usa esas tres
Muchas gracias a todos por los comentarios!