Ir al contenido principal

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»