Antes de la versión 17.1, STCP resolvía los nombres de host consultando primero cualquier servidor DNS configurado y solo si no obtenía respuesta o recibía una respuesta negativa de los servidores de nombres, buscaba en el archivo de hosts local.
A partir de la versión 17.1, ahora tienes la opción de buscar primero en el archivo de hosts local, pero hay algunas condiciones. En primer lugar, tu aplicación debe haberse compilado siguiendo las normas POSIX en un sistema 17.1. El conjunto estándar de comandos de >system>stcp>command_library se ha compilado de esta forma, pero no basta con instalar la versión 17.1 sin recompilar tus aplicaciones para poder utilizar esta función. En segundo lugar, debe instalar el archivo de configuración del conmutador de servicio de nombres, nsswitch.conf, en el directorio >system>stcp. En el directorio >system>stcp>templates se encuentra una versión predeterminada del archivo.
Como se puede ver en la figura 1, el archivo nsswitch.conf parece controlar todo tipo de aspectos. Sin embargo, solo las entradas «hosts» y «networks» influyen en el comportamiento del sistema. El orden de las palabras clave «dns» y «files» controla el orden de búsqueda. Si «files» aparece primero, se buscará en el archivo hosts o networks antes de consultar el DNS. Si «dns» aparece primero, se consultará el DNS antes de buscar en los archivos. Si la entrada «hosts» o «networks» incluye solo una de las palabras clave, solo se realizará la búsqueda correspondiente a esa palabra clave.
La razón principal para utilizar el archivo hosts en lugar de limitarse a consultar el DNS es la velocidad, la recuperación ante desastres y el control. Como muestra el ejemplo 1, cuando uno de los servidores de nombres no responde, el tiempo de resolución de nombres pasa de 20 milisegundos a casi 2 segundos. Si ninguno de tus servidores de nombres responde, el tiempo de resolución de nombres puede ser muy largo (ejemplo 2). Al incluir los nombres críticos en el archivo hosts y buscar primero en él, no hay que preocuparse por el tiempo que tarda en resolverse el nombre (ejemplo 3).
Otra razón para consultar primero el archivo hosts es el control local. Al utilizar un DNS, se cede el control del proceso de resolución de nombres. En la mayoría de los casos esto funciona sin problemas, pero a veces se requiere control local. Por ejemplo, si es necesario bloquear de forma temporal o permanente el acceso a un host, se puede hacer desde el cortafuegos o redirigiendo las solicitudes dirigidas a un host problemático a una dirección diferente, modificando la base de datos del DNS o el archivo hosts. Puede que no sea posible modificar la base de datos del DNS y que los cambios en el cortafuegos tarden demasiado, pero sí puedes modificar tu propio archivo hosts. El ejemplo 4 muestra que el acceso a www.google.com se redirige al host local.
El inconveniente del archivo hosts es que la correspondencia entre los nombres de host y las direcciones IP es estática. Como muestra el ejemplo 5, los servidores de nombres se pueden configurar para proporcionar diferentes direcciones IP con el fin de distribuir la carga entre varios servidores de aplicaciones. Si se añade una entrada en el archivo hosts, dicha entrada es estática y se pierde la ventaja del equilibrio de carga que podría ofrecer el DNS. Además, es necesario actualizar manualmente el archivo hosts cada vez que se modifiquen las direcciones IP de los hosts.
Entonces, ¿cómo se debe configurar el archivo nsswitch.conf? Los comentarios del archivo (figura 1) sugieren que no se instale el archivo en el directorio >system>stcp hasta que todas las aplicaciones se hayan recompilado para utilizarlo. Esto evitará posibles resultados divergentes en los que las aplicaciones antiguas, al utilizar el DNS, obtengan una dirección, mientras que las nuevas, al utilizar el archivo hosts, obtengan una dirección diferente (ejemplo 4). Además, dado que siempre se ha consultado primero el DNS, es muy posible que haya entradas en un archivo hosts existente que ya no sean correctas. Una estrategia alternativa es instalar el archivo con la entrada de hosts configurada como «files dns», pero asegurándose de que la única entrada en el archivo hosts sea localhost (ejemplo 6). A continuación, puede añadir direcciones de host/IP al archivo hosts según sea necesario con un mínimo de edición, teniendo en cuenta que ninguna aplicación antigua verá la dirección del archivo hosts.
Bien, ¿y qué hay de las redes? Siempre ha sido posible asignar un nombre a una red incluyéndola en el archivo >system>stcp>networks. Personalmente, nunca he visto la necesidad, pero se puede utilizar un nombre al añadir una ruta. Curiosamente, el nombre no se muestra al imprimir las rutas (ejemplo 7). También se puede utilizar un nombre al emplear el argumento -network en el comando arp. El archivo nsswitch.conf predeterminado para redes busca primero en el archivo networks y luego consulta el DNS. A menos que tengas tu DNS configurado para devolver información sobre el nombre de la red, mi sugerencia es eliminar la palabra clave dns de la entrada networks.
Una última cosa. He incluido dos programas de ejemplo. El primero , resolve.c, utiliza la antigua función de resolución de nombres gethostbyname; el segundo, new_resolve.c, utiliza la nueva función getaddrinfo. La función gethostbyname ha sido sustituida por la función estándar POSIX getaddrinfo. Al tratarse del estándar POSIX, no encontrarás ninguna documentación sobre getaddrinfo en Stratadoc; sin embargo, hay mucha documentación en la web, solo tienes que buscar «getaddrinfo» en Google.
Ejemplos:
En los siguientes ejemplos, los programas resolve_17.0 y resolve se basan en el mismo código fuente. La única diferencia es que resolve_17.0 se compiló en un sistema VOS 17.0, mientras que resolve se compiló en un sistema 17.1. Los servidores de nombres 1.1.1.1, 1.1.1.2 y 1.1.1.3 son ficticios y se utilizan para simular un servidor de nombres que no responde. También he tachado con una «X» los números de host de los hosts que no se encuentran en una red pública.
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>system>stcp>resolv.conf 24-05-11 08:07:13 mst nameserver 164.152.XXX.XXX servidor de nombres 134.111.XXX.XXX listo 08:07:13 resolve_17.0 ftp.stratus.com ftp.stratus.com resuelto a 192.52.248.14 en 20,615 ms listo 08:07:20 d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>system>stcp>resolv.conf 24-05-11 08:07:30 mst servidor de nombres 1.1.1.1 servidor de nombres 164.152.XXX.XXX servidor de nombres 134.111.XXX.XXX listo 08:07:30 resolve_17.0 ftp.stratus.com ftp.stratus.com resuelto a 192.52.248.14 en 1989,395 ms listo 08:07:38 |
| Ejemplo 1: cambio de hora cuando un servidor de nombres (1.1.1.1) no responde |
d >system>stcp>resolv.conf -match nameserver
%phx_vos#m16_mas>system>stcp>resolv.conf 23-05-11 13:11:31 mst
nameserver 1.1.1.1
nameserver 1.1.1.2
servidor de nombres 1.1.1.3
listo 13:11:31
resolve_17.0 ftp.stratus.com
ftp.stratus.com resuelto a 192.52.248.14 en 14759,949 ms
listo 13:12:13
|
| Ejemplo 2: tiempo de resolución de un nombre cuando ningún servidor de nombres responde |
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>system>stcp>resolv.conf 24-05-11 08:18:10 mst nameserver 1.1.1.1 nameserver 164.152.XXX.XXX servidor de nombres 134.111.XXX.XXX listo 08:18:10 d >system>stcp>nsswitch.conf -match hosts: %phx_vos#m16_mas>system>stcp>nsswitch.conf 24-05-11 08:18:21 mst hosts: files dns listo 08:18:21 resolver ftp.stratus.com ftp.stratus.com resuelto a 192.52.248.14 en 13,702 ms listo 08:18:31 resolver www1.stratus.com www1.stratus.com resuelto a 134.111.1.84 en 227,798 ms listo 08:18:39 |
| Ejemplo 3: diferencia de tiempo entre buscar primero en el archivo hosts y encontrar o no una entrada |
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>system>stcp>resolv.conf 23/05/11 13:28:51 mst nameserver 164.152.XXX.XXX nameserver 134.111.XXX.XXX listo 13:28:51 d %phx_vos#m16_mas>system>stcp>hosts -match google %phx_vos#m16_mas>system>stcp>hosts 23-05-11 13:29:29 mst 127.0.0.1 www.google.com google.com google listo 13:29:29 resolve_17.0 www.google.com www.google.com resuelto a 74.125.226.115 en 180,099 ms listo 13:29:40 resolver www.google.com www.google.com resuelto a 127.0.0.1 en 13,458 ms listo 13:30:01 |
| Ejemplo 4: bloquear el acceso a www.google.com cambiando su dirección a localhost para las nuevas aplicaciones |
Resolver www.yahoo.com www.yahoo.com resuelto como 67.195.160.76 en 21,439 ms listo 13:35:56 resolver www.yahoo.com www.yahoo.com resuelto a 69.147.125.65 en 21,713 ms listo 13:35:56 resolver www.yahoo.com www.yahoo.com resuelto a 67.195.160.76 en 30,106 ms listo 13:35:57 resolver www.yahoo.com www.yahoo.com resuelto como 69.147.125.65 en 29,739 ms listo 13:35:58 resolver www.yahoo.com www.yahoo.com resuelto a 67.195.160.76 en 23,880 ms listo 13:35:58 resolver www.yahoo.com www.yahoo.com resuelto a 69.147.125.65 en 22,736 ms listo 13:35:58 |
| Ejemplo 5: el DNS proporciona varias direcciones IP |
d >system>stcp>hosts %phx_vos#m16_mas>system>stcp>hosts 24-05-11 08:32:51 mst # # Archivo de hosts de ejemplo # # Dirección IP nombre alias # comentario(s) # 127.0.0.1 localhost loopback-host loopback lb # obligatorio listo 08:32:51 |
| Ejemplo 6: archivo hosts mínimo |
añadir ruta noahs-test 164.152.XXX.XXX 5.255.255.0 listo 13:52:54 imprimir ruta Puerta de enlace predeterminada: 164.152.XXX.XXX Dirección de red Dirección de puerta de enlace Máscara de subred Redirección Vida 1.2.3.0 164.152.XXX.XXX 255.255.255.0 listo 13:53:26 redes -coincidencia noahs-test %phx_vos#m16_mas>system.17.1>stcp>networks 23-05-11 13:53:48 mst noahs-test 1.2.3.0 listo 13:53:48 |
| Ejemplo 7: añadir una red utilizando un nombre de la tabla de redes |
# # Ejemplo de nsswitch.conf(5): archivo de configuración del conmutador de servicios de nombres # # Este archivo de configuración solo lo utilizan los programas que se han compilado # según las normas POSIX en la versión 17.1 o posteriores. Si este archivo de configuración # no está presente, las búsquedas de nombres de host serán compatibles con las # versiones anteriores del software DNS. Para evitar confusiones, le recomendamos que posponga el uso de este archivo de configuración hasta que todas las aplicaciones se hayan recompilado utilizando POSIX. # # El software DNS no POSIX (y todo el software DNS anterior a la versión 17.1) resolvía los hosts utilizando primero el DNS y luego el archivo hosts del sistema. Esto presenta un par de problemas menores: # # 1. Si hay una entrada errónea en el archivo hosts, no se detectará # hasta que algo provoque que el DNS deje de funcionar. Esto # podría provocar confusión justo cuando menos se desea. # # 2. No hay forma de anular un host erróneo que devuelve el DNS. # # 3. La mayoría de las demás implementaciones buscan primero en el archivo hosts. # # Ninguna de estas razones es lo suficientemente convincente como para realizar un cambio incompatible con el comportamiento predeterminado; sin embargo, puede cambiar el orden de búsqueda utilizando este archivo para evitar los problemas mencionados anteriormente. Para buscar primero en el archivo hosts, debe escribir: # hosts: files dns # # Para realizar la búsqueda en el DNS primero y mantener la compatibilidad al 100 % con el comportamiento de # versiones anteriores de VOS, debe utilizar: # # hosts: dns files # # Además, tenga en cuenta que el software no POSIX y anterior a la versión 17.1 nunca utilizó el DNS para # buscar redes. El nuevo software sí lo hace. Por defecto, lo hace esto: # después de buscar en el archivo >system>stcp>networks. También se puede configurar # este comportamiento. Normalmente no hay mucha información útil que # se obtenga del DNS para las redes. Si desea desactivar las búsquedas DNS # para las redes, haga lo siguiente: # # networks: files # group: compat group_compat: nis hosts: files dns networks: files dns passwd: compat passwd_compat: nis shells: files services: compat services_compat: nis protocols: files rpc: files |
| Figura 1: archivo nsswitch.conf predeterminado ubicado en >system>stcp>templates |
#define _POSIX_C_SOURCE 200112L
#include <netdb.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main (argc, argv)
int argc;
char *argv [];
{
struct hostent *hInfo; /* used to hold host information
including IP address after
resolving hostname */
long long jJiffy1; /* starting jiffy time */
long long jJiffy2; /* ending jiffy time */
extern void s$read_jiffy_clock(long long *);
double milliseconds; /* ms between jJiffy2 & jJiffy1 */
/* process arguments. If we don't have exactly the right number of
arguments print out a usage message, a version message and exit */
if (argc != 2)
{
printf ("Usage:ntresolve hostnamen");
exit (0);
}
/* Take a timestamp, resolve the name and take another timestamp */
s$read_jiffy_clock (&jJiffy1);
hInfo = gethostbyname (argv [1]);
s$read_jiffy_clock (&jJiffy2);
milliseconds = (jJiffy2 - jJiffy1) / 65.536;
if (hInfo == NULL)
printf ("nCould not resolve the address of %s - %3.3f msn",
argv [1], milliseconds);
else
{
printf ("%s resolved to %s in %3.3f msn", argv [1],
inet_ntoa (*(struct in_addr *)(hInfo -> h_addr_list [0])),
milliseconds);
}
endhostent ();
}
|
| Figura 2: el archivo «resolve.c» utiliza la antigua función «gethostbyname» |
#define _POSIX_C_SOURCE 200112L
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <stdio.h>
int main (argc, argv)
int argc;
char *argv [];
{
struct addrinfo *addressInfo; /* used to hold host information */
struct sockaddr_in *sin; /* template to extract addr info */
int error;
long long jJiffy1; /* starting jiffy time */
long long jJiffy2; /* ending jiffy time */
extern void s$read_jiffy_clock(long long *);
double milliseconds; /* ms between jJiffy2 & jJiffy1 */
char szIP [16]; /* holds printable IP address */
/* process arguments. If we don't have exactly the right number of
arguments print out a usage message, a version message and exit */
if (argc != 2)
{
printf ("Usage:ntresolve hostnamen");
exit (0);
}
/* Take a timestamp, resolve the name and take another timestamp */
s$read_jiffy_clock (&jJiffy1);
error = getaddrinfo (argv [1], NULL, NULL, &addressInfo);
s$read_jiffy_clock (&jJiffy2);
milliseconds = (jJiffy2 - jJiffy1) / 65.536;
if (error != 0)
printf ("nCould not resolve the address of %s - %3.3f msn",
argv [1], milliseconds);
else
{
if (inet_ntop (AF_INET,
&(((struct sockaddr_in *)(addressInfo->ai_addr))->
sin_addr.S_un.S_addr), szIP, 16) == NULL)
printf ("Could not convert address %xn",
(((struct sockaddr_in *)(addressInfo->ai_addr))->
sin_addr.S_un.S_addr));
else
printf ("%s resolved to %s in %3.3f msn",
argv [1], szIP, milliseconds);
}
freeaddrinfo (addressInfo);
}
|
| Figura 3: el archivo «new_resolve.c» utiliza la nueva función estándar POSIX «getaddrinfo» |
