Ir al contenido principal

Antes de la 17.1, el STCP resolvía los nombres de host consultando primero cualquier DNS configurado y sólo si no había respuesta o si la respuesta de los servidores de nombres era negativa, buscaba en el archivo de hosts locales.

A partir de 17.1 tienes la opción de buscar primero el archivo de hosts locales, pero hay algunas condiciones. Primero, tu aplicación tiene que ser construida bajo las reglas POSIX en un sistema 17.1. El conjunto estándar de comandos en >sistema>stcp>biblioteca_de_comandos está construido de esta manera pero no puede simplemente instalar 17.1 sin reconstruir sus aplicaciones y esperar usar esta característica. En segundo lugar debe instalar el Name Service Switch, nsswitch.conf, archivo de configuración en el directorio >system>stcp. Una versión por defecto del archivo se puede encontrar en el directorio >system>stcp>templates.

Como pueden ver en la figura 1, el archivo nsswitch.conf parece controlar todo tipo de cosas. Sin embargo, sólo las entradas de "hosts" y "redes" tienen algún efecto en el comportamiento del sistema. El orden de las palabras clave "dns" y "archivos" controlan el orden de búsqueda. Si "archivos" viene primero, el archivo de hosts o redes será buscado antes de consultar el DNS. Si "dns" viene primero, entonces el DNS será consultado antes de buscar los archivos. Si la entrada "hosts" o "redes" incluye sólo una de las palabras clave, entonces sólo se realizará la búsqueda correspondiente a esa palabra clave.

La razón principal para usar el archivo de hosts en lugar de sólo consultar el DNS es la velocidad/recuperación de desastres y el control. Como muestra el ejemplo 1, cuando uno de los servidores de nombres no responde, el tiempo de resolución del nombre pasa de 20 milisegundos a casi 2 segundos. Si ninguno de los servidores de nombres está respondiendo, el tiempo de resolución del nombre puede ser muy largo (ejemplo 2). Al colocar los nombres críticos en el archivo de hosts y buscar primero en el archivo de hosts, no hay que preocuparse por el tiempo que se tarda en resolver los nombres (ejemplo 3).

Otra razón para buscar primero el archivo de hosts es el control local. Cuando se utiliza un DNS se renuncia al control del proceso de resolución de nombres. En la mayoría de las condiciones esto funciona sin problemas, pero a veces se requiere un control local. Por ejemplo, si es necesario bloquear temporal o permanentemente el acceso a un host, puede hacerlo en el cortafuegos o redirigiendo las solicitudes a un host problemático a una dirección diferente cambiando la base de datos DNS o el archivo de hosts. Es posible que no sea posible cambiar la base de datos DNS y que los cambios en el firewall lleven demasiado tiempo, pero puede cambiar su propio archivo de hosts. En el ejemplo 4 se muestra que el acceso a www.google.com se redirige al host local.

La desventaja del archivo de hosts es que el mapeo entre los nombres de los hosts y las direcciones IP es estático. Como muestra el ejemplo 5, los servidores de nombres pueden ser configurados para proporcionar diferentes direcciones IP para repartir la carga entre varios servidores de aplicaciones. Si se añade una entrada en el archivo de hosts, esa entrada es estática y se pierde el beneficio de cualquier equilibrio de carga que el DNS pueda proporcionar. Además, debe mantener manualmente el archivo de hosts si/cuando se cambian las direcciones IP de los hosts.

Entonces, ¿cómo debería configurar el archivo nsswitch.conf. Los comentarios en el archivo (figura 1) sugieren que no instale el archivo en el directorio >system>stcp hasta que todas sus aplicaciones hayan sido reconstruidas para usarlo. Esto evitará posibles resultados divergentes en los que la antigua aplicación utiliza el DNS obteniendo una dirección mientras que las nuevas aplicaciones utilizan el archivo de hosts obteniendo una dirección diferente (ejemplo 4). Además, como el DNS siempre ha sido consultado primero, es muy posible que haya entradas en un archivo de 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 de hosts es localhost (ejemplo 6). A continuación, puede agregar las direcciones de host /IP al archivo de hosts según sea necesario con un mínimo de edición, teniendo en cuenta que cualquier aplicación antigua no verá la dirección del archivo de host.

Bien, ¿qué hay de las redes? Siempre ha sido posible dar un nombre a una red colocándola en el archivo >sistema>stcp>redes. Personalmente, nunca he visto la necesidad pero se podría usar un nombre al añadir una ruta. Curiosamente, el nombre no se muestra cuando se imprimen las rutas (ejemplo 7). También puedes usar un nombre cuando usas el argumento -network en el comando arp. El archivo nsswitch.conf por defecto para redes busca primero el archivo de redes y luego consulta el DNS. A menos que realmente tenga su DNS configurado para devolver la información del nombre de la red, mi sugerencia es eliminar la palabra clave dns de la entrada de redes.

Un último punto. He incluido dos programas de ejemplo. El primero resuelve.c usa la antigua función de resolución de nombres gethostbyname; el segundo, new_resolve.c usa la nueva función getaddrinfo. La función gethostbyname ha sido reemplazada por la función estándar POSIX getaddrinfo. Debido a que es el estándar POSIX no encontrarás ninguna documentación sobre getaddrinfo en Stratadoc; sin embargo hay una gran cantidad de documentación en la web, sólo tienes que ir a google getaddrinfo.

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 fue compilado en un sistema VOS 17.0 mientras que resolve fue compilado 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 usan para simular un servidor de nombres que no responde. También he sacado los números de hosts que no están en una red pública.

d >sistema>stcp>resolv.conf -match nameserver

%phx_vos#m16_mas>system>stcp>resolv.conf 11-05-24 08:07:13 mst

servidor de nombres 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 >sistema>stcp>resolv.conf -match nameserver

%phx_vos#m16_mas>system>stcp>resolv.conf 11-05-24 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 en el tiempo cuando un servidor de nombres (1.1.1.1) no responde

d >sistema>stcp>resolv.conf -match nameserver

%phx_vos#m16_mas>system>stcp>resolv.conf 11-05-23 13:11:31 mst

servidor de nombres 1.1.1.1
servidor de nombres 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 para resolver un nombre cuando no responden los servidores de nombres

 

d >sistema>stcp>resolv.conf -match nameserver

%phx_vos#m16_mas>system>stcp>resolv.conf 11-05-24 08:18:10 mst

servidor de nombres 1.1.1.1
servidor de nombres 164.152.XXX.XXX
servidor de nombres 134.111.XXX.XXX

listo 08:18:10

d >sistema>stcp>nsswitch.conf -conjunto de anfitriones:

%phx_vos#m16_mas>system>stcp>nsswitch.conf 11-05-24 08:18:21 mst

hosts: archivos 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 resolvió a 134.111.1.84 en 227.798 ms

listo 08:18:39
Ejemplo 3 - diferencia de tiempo cuando se busca el archivo de hosts primero y se encuentra/no se encuentra una entrada

d >sistema>stcp>resolv.conf -match nameserver

%phx_vos#m16_mas>system>stcp>resolv.conf 11-05-23 13:28:51 mst

servidor de nombres 164.152.XXX.XXX
servidor de nombres 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 11-05-23 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 resolvió 74.125.226.115 en 180.099 ms
listo 13:29:40

resolver www.google.com
www.google.com resolvió 127.0.0.1 en 13.458 ms

listo 13:30:01
Ejemplo 4 - bloqueando el acceso a www.google.com cambiando su dirección a localhost para nuevas aplicaciones

resolver www.yahoo.com
www.yahoo.com resolvió 67.195.160.76 en 21.439 ms
listo 13:35:56
resolver www.yahoo.com
www.yahoo.com resolvió 69.147.125.65 en 21.713 ms
listo 13:35:56
resolver www.yahoo.com
www.yahoo.com resolvió 67.195.160.76 en 30.106 ms
listo 13:35:57
resolver www.yahoo.com
www.yahoo.com resolvió 69.147.125.65 en 29.739 ms
listo 13:35:58
resolver www.yahoo.com
www.yahoo.com resolvió 67.195.160.76 en 23.880 ms
listo 13:35:58
resolver www.yahoo.com
www.yahoo.com resolvió 69.147.125.65 en 22.736 ms
listo 13:35:58
Ejemplo 5 - El DNS proporciona múltiples direcciones IP

d >sistema>stcp>hosts

%phx_vos#m16_mas>system>stcp>hosts 11-05-24 08:32:51 mst

#
# Archivo de muestra de los anfitriones
#
# Dirección IP nombre alias # comentario(s)
#
127.0.0.1 localhost loopback-host loopback lb # requerido

listo 08:32:51
Ejemplo 6 - archivo de hosts mínimo

ruta añadir noahs-test 164.152.XXX.XXX 5.255.255.0
ready 13:52:54 

ruta de impresión

Pasarela por defecto: 164.152.XXX.XXX

Dirección de la red Dirección de la puerta de enlace Máscara de subred Redirigir la vida
1.2.3.0           164.152.XXX.XXX 255.255.255.0

listo 13:53:26

redes d - prueba de noahs del partido

%phx_vos#m16_mas>system.17.1>stcp>networks 11-05-23 13:53:48 mst

prueba de noahs 1.2.3.0

listo 13:53:48
Ejemplo 7 - añadir una red usando un nombre en la tabla de redes

#
# Muestra nsswitch.conf(5) - archivo de configuración del interruptor de servicio de nombres
#
# Este archivo de configuración sólo es usado por programas que han sido construidos
# bajo las reglas de POSIX en la versión 17.1 o posterior.  Si esta configuración
# El archivo no está presente, las búsquedas de nombres de host serán compatibles con el
# Versiones antiguas del software del DNS.  Para evitar confusiones, nosotros
# Recomiendo que difiera el uso de este archivo de configuración hasta que todos
# Las aplicaciones han sido reconstruidas usando POSIX.
#
# El software del DNS no POSIX (y todo el software del DNS anterior al lanzamiento
# 17.1) resolvió los hosts usando primero el DNS y luego usando el
# >sistema>stcp>hosts file.  Esto tiene un par de problemas menores:
#
#    1.  Si hay una mala entrada en el archivo de los anfitriones, no conseguirá
# detectado hasta que algo hace que el DNS desaparezca.  Este
# podría resultar en confusión exactamente cuando uno no lo quiere.
#
#    2.  No hay forma de anular un mal anfitrión que regresa del DNS.
#
#    3.  La mayoría de las otras implementaciones buscan primero el archivo del host.
#
# Ninguno de estos son lo suficientemente convincentes para hacer un cambio incompatible
# al comportamiento por defecto; sin embargo, puede cambiar el orden de búsqueda
# usando este archivo para evitar los problemas anteriores.  Para buscar en el archivo de hosts
# Primero, tú quieres:
#
# hosts: archivos dns
#
# para hacer el DNS primero y permanecer 100% compatible con el comportamiento de
# Lanzamientos anteriores de VOS, que quieres:
#
# hosts: archivos dns
#
# También, note que el software no-POSIX y pre 17.1 nunca usó dns para
# buscando en las redes.  El nuevo software lo hace.  Por defecto, hace esto
# después de mirar en el archivo >sistema>stcp>networks.  Se puede configurar
# este comportamiento, también.  Normalmente no hay mucha información útil que
# vuelve del DNS para las redes.  Si quieres desactivar las búsquedas de DNS
# para las cadenas, haz esto:
#
# redes: archivos
#
grupo: compat
group_compat: nis
hosts: archivos dns
redes: archivos dns
contraseña: compat
passwd_compat: nis
conchas: archivos
servicios: compat
services_compat: nis
protocolos: archivos
rpc: archivos
Figura 1 - archivo nsswitch.conf por defecto encontrado en >sistema>stcp>plantillas

#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 - resolve.c utiliza la antigua función de nombre de pila

#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 - new_resolve.c usa la nueva función POSIX standard getaddrinfo