Skip to main content

Avant le 17.1, le STCP résolvait les noms d'hôtes en interrogeant d'abord tout DNS configuré et ne recherchait le fichier local des hôtes que s'il n'y avait pas de réponse ou si les serveurs de noms donnaient une réponse négative.

À partir de la version 17.1, vous avez maintenant la possibilité de rechercher d'abord le fichier d'hôtes local, mais il y a certaines conditions. Tout d'abord, votre application doit être construite selon les règles POSIX sur un système 17.1. L'ensemble des commandes standard dans >system>stcp>command_library sont toutes construites de cette manière mais vous ne pouvez pas simplement installer 17.1 sans reconstruire vos applications et espérer utiliser cette fonctionnalité. Ensuite, vous devez installer le fichier de configuration Name Service Switch, nsswitch.conf, dans le répertoire >system>stcp. Une version par défaut du fichier se trouve dans le répertoire >system>stcp>templates.

Comme vous pouvez le voir sur la figure 1, le fichier nsswitch.conf semble contrôler toutes sortes de choses. Cependant, seules les entrées "hosts" et "networks" ont un effet sur le comportement du système. L'ordre des mots clés "dns" et "files" contrôle l'ordre de recherche. Si "files" vient en premier, le fichier "hosts" ou "networks" sera recherché avant d'interroger le DNS. Si "dns" vient en premier, le DNS sera interrogé avant de rechercher les fichiers. Si l'entrée "hosts" ou "networks" ne comprend qu'un seul des mots clés, seule la recherche correspondant à ce mot clé sera effectuée.

La raison principale de l'utilisation du fichier hosts au lieu d'une simple interrogation du DNS est la vitesse/récupération après sinistre et le contrôle. Comme le montre l'exemple 1, lorsque l'un des serveurs de noms ne répond pas, le temps de résolution du nom passe de 20 millisecondes à près de 2 secondes. Si aucun de vos serveurs de noms ne répond, le temps de résolution du nom peut être très long (exemple 2). En plaçant les noms critiques dans le fichier hosts et en effectuant d'abord une recherche dans le fichier hosts, vous n'avez pas à vous soucier du temps nécessaire à la résolution des noms (exemple 3).

Une autre raison de rechercher d'abord le fichier hôte est le contrôle local. Lorsque vous utilisez un DNS, vous renoncez au contrôle du processus de résolution du nom. Dans la plupart des cas, cela fonctionne sans problème, mais parfois un contrôle local est nécessaire. Par exemple, s'il devient nécessaire de bloquer temporairement ou définitivement l'accès à un hôte, vous pouvez le faire au niveau du pare-feu ou en redirigeant les demandes vers un hôte à problème vers une adresse différente en modifiant la base de données DNS ou le fichier hosts. Il peut ne pas être possible de modifier la base de données DNS et les modifications apportées au pare-feu peuvent prendre trop de temps, mais vous pouvez modifier votre propre fichier hosts. L'exemple 4 montre que l'accès à www.google.com est redirigé vers un hôte local.

L'inconvénient du fichier hosts est que la correspondance entre les noms d'hôtes et les adresses IP est statique. Comme le montre l'exemple 5, les serveurs de noms peuvent être configurés pour fournir différentes adresses IP afin de répartir la charge entre plusieurs serveurs d'applications. Si vous ajoutez une entrée dans le fichier hosts, cette entrée est statique et vous perdez le bénéfice de tout équilibrage de charge que le DNS pourrait fournir. En outre, vous devez maintenir manuellement le fichier hosts si/quand les adresses IP des hôtes sont modifiées.

Alors comment configurer le fichier nsswitch.conf. Les commentaires du fichier (figure 1) suggèrent de ne pas installer le fichier dans le répertoire >system>stcp avant que toutes vos applications aient été reconstruites pour l'utiliser. Cela évitera d'éventuels résultats divergents où l'ancienne application utilise le DNS obtenant une adresse alors que les nouvelles applications utilisent le fichier hosts obtenant une adresse différente (exemple 4). En outre, comme le DNS a toujours été interrogé en premier, il est tout à fait possible que certaines entrées d'un fichier hosts existant ne soient plus correctes. Une stratégie alternative consiste à installer le fichier avec l'entrée hosts définie sur "files dns" mais en s'assurant que la seule entrée dans le fichier hosts est localhost (exemple 6). Vous pouvez alors ajouter des adresses host /IP au fichier hosts si nécessaire avec un minimum de modifications, en gardant à l'esprit que toute ancienne application ne verra pas l'adresse du fichier hosts.

OK, et les réseaux ? Il a toujours été possible de donner un nom à un réseau en le plaçant dans le fichier >system>stcp>networks. Personnellement, je n'en ai jamais vu la nécessité, mais vous pourriez utiliser un nom lorsque vous ajoutez une route. Il est intéressant de noter que le nom n'est pas affiché lorsque vous imprimez des itinéraires (exemple 7). Vous pouvez également utiliser un nom lorsque vous utilisez l'argument -network dans la commande arp. Le fichier nsswitch.conf par défaut pour les réseaux recherche d'abord dans le fichier des réseaux, puis interroge le DNS. À moins que votre DNS ne soit effectivement configuré pour renvoyer des informations sur le nom du réseau, je vous suggère de supprimer le mot-clé dns de l'entrée "networks".

Un dernier point. J'ai inclus deux exemples de programmes. Le premier resolve.c utilise l'ancienne fonction de résolution de nom gethostbyname ; le second, new_resolve.c utilise la nouvelle fonction getaddrinfo. La fonction gethostbyname a été remplacée par la fonction standard POSIX getaddrinfo. Comme il s'agit de la norme POSIX, vous ne trouverez aucune documentation sur getaddrinfo dans Stratadoc ; cependant, il y a beaucoup de documentation sur le web, il suffit de googler getaddrinfo.

Exemples :

Dans les exemples suivants, les programmes resolve_17.0 et resolve sont basés sur le même code source. La seule différence est que resolve_17.0 a été compilé sur un système VOS 17.0 alors que resolve a été compilé sur un système 17.1. Les serveurs de noms 1.1.1.1, 1.1.1.2, et 1.1.1.3 sont des fictions et sont utilisés pour simuler un serveur de noms qui ne répond pas. J'ai également supprimé les numéros d'hôtes qui ne sont pas sur un réseau public.

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

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

nameserver 164.152.XXX.XXX
nameserver 134.111.XXX.XXX

prêt 08:07:13

resolve_17.0 ftp.stratus.com
ftp.stratus.com résolu à 192.52.248.14 en 20.615 ms
prêt 08:07:20

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

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

nameserver 1.1.1.1
nameserver 164.152.XXX.XXX
nameserver 134.111.XXX.XXX

prêt 08:07:30

resolve_17.0 ftp.stratus.com
ftp.stratus.com résolu à 192.52.248.14 en 1989.395 ms

prêt 08:07:38
Exemple 1 - changement d'heure lorsqu'un serveur de nom (1.1.1.1) ne répond pas

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

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

nameserver 1.1.1.1
serveur de noms 1.1.1.2
serveur de noms 1.1.1.3

prêt 13:11:31

resolve_17.0 ftp.stratus.com
ftp.stratus.com résolu à 192.52.248.14 en 14759.949 ms

prêt 13:12:13
Exemple 2 - délai de résolution d'un nom lorsqu'aucun serveur de noms ne répond

 

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

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

nameserver 1.1.1.1
nameserver 164.152.XXX.XXX
nameserver 134.111.XXX.XXX

prêt 08:18:10

d >system>stcp>nsswitch.conf -match hosts :

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

hôtes : fichiers dns

prêt 08:18:21

résoudre ftp.stratus.com
ftp.stratus.com résolu à 192.52.248.14 en 13.702 ms

prêt 08:18:31

résoudre www1.stratus.com
www1.stratus.com résolu à 134.111.1.84 en 227.798 ms

prêt 08:18:39
Exemple 3 - différence de temps entre la première recherche dans le fichier d'accueil et la recherche/absence d'une entrée

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

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

nameserver 164.152.XXX.XXX
nameserver 134.111.XXX.XXX

prêt 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

prêt 13:29:29

resolve_17.0 www.google.com
www.google.com a décidé de 74.125.226.115 en 180.099 ms
prêt 13:29:40

résoudre www.google.com
www.google.com a décidé de 127.0.0.1 à 13.458 ms

prêt 13:30:01
Exemple 4 - blocage de l'accès à www.google.com en changeant son adresse en localhost pour les nouvelles applications

résoudre www.yahoo.com
www.yahoo.com a décidé de 67.195.160.76 en 21.439 ms
prêt 13:35:56
résoudre www.yahoo.com
www.yahoo.com a décidé de 69.147.125.65 en 21.713 ms
prêt 13:35:56
résoudre www.yahoo.com
www.yahoo.com a décidé de 67.195.160.76 en 30.106 ms
prêt 13:35:57
résoudre www.yahoo.com
www.yahoo.com a décidé de 69.147.125.65 en 29.739 ms
prêt 13:35:58
résoudre www.yahoo.com
www.yahoo.com a décidé de 67.195.160.76 en 23.880 ms
prêt 13:35:58
résoudre www.yahoo.com
www.yahoo.com a décidé de 69.147.125.65 en 22.736 ms
prêt 13:35:58
Exemple 5 - Le DNS fournit plusieurs adresses IP

d >système>stcp>hôtes

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

#
# Exemple de fichier d'hôtes
#
# adresse IP nom alias # commentaire(s)
#
127.0.0.1 localhost loopback-host loopback lb # requis

prêt 08:32:51
Exemple 6 - fichier d'hôtes minimum

route ajouter noahs-test 164.152.XXX.XXX 5.255.255.0
prêt 13:52:54 

impression de l'itinéraire

Passerelle par défaut : 164.152.XXX.XXX

Passerelle d'adresse réseau Masque de sous-réseau Redirection de la vie
1.2.3.0           164.152.XXX.XXX 255.255.255.0

prêt 13:53:26

d networks -match noahs-test

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

noahs-test 1.2.3.0

prêt 13:53:48
Exemple 7 - ajout d'un réseau en utilisant un nom dans le tableau des réseaux

#
# Exemple nsswitch.conf(5) - fichier de configuration du commutateur de service de nom
#
# Ce fichier de configuration n'est utilisé que par les programmes qui ont été construits
# selon les règles POSIX dans la version 17.1 ou ultérieure.  Si cette configuration
# n'est pas présent, les recherches de nom d'hôte seront compatibles avec le
# les anciennes versions du logiciel DNS.  Pour éviter toute confusion, nous
# vous recommande de reporter l'utilisation de ce fichier de configuration jusqu'à ce que tous
# les applications ont été reconstruites en utilisant POSIX.
#
# Le logiciel DNS non-POSIX (et tous les logiciels DNS avant la publication
# 17.1) a résolu les hôtes en utilisant d'abord le DNS et ensuite le
# >system>stcp>hosts file.  Cela pose quelques problèmes mineurs :
#
#    1.  S'il y a une mauvaise entrée dans le fichier hosts, il n'obtiendra pas
# détecté jusqu'à ce que quelque chose fasse disparaître le DNS.  Ce
# pourrait entraîner une confusion au moment précis où on ne le souhaite pas.
#
#    2.  Il n'y a aucun moyen de passer outre un mauvais hôte qui revient du DNS.
#
#    3.  La plupart des autres implémentations recherchent d'abord le fichier hôte.
#
# Aucun d'entre eux n'est assez convaincant pour effectuer un changement incompatible
# au comportement par défaut ; cependant, vous pouvez changer l'ordre de recherche
# utiliser ce fichier pour éviter les problèmes ci-dessus.  Pour rechercher le fichier hosts
# d'abord, vous voulez :
#
# hôtes : fichiers dns
#
# de faire le DNS en premier et de rester 100% compatible avec le comportement de
# les versions précédentes de VOS, vous voulez :
#
# hôtes : fichiers dns
#
# Notez également que les logiciels non-POSIX et antérieurs à 17.1 n'ont jamais utilisé de dns pour
# recherche de réseaux.  C'est ce que fait le nouveau logiciel.  Par défaut, il fait ceci
# après avoir regardé dans le fichier >system>stcp>networks.  On peut configurer
# ce comportement aussi.  Il n'y a généralement pas beaucoup d'informations utiles qui
# revient du DNS pour les réseaux.  Si vous voulez désactiver les consultations DNS
# pour les réseaux, faites ceci :
#
# réseaux : fichiers
#
groupe : compat
group_compat : nis
hôtes : fichiers dns
réseaux : fichiers dns
passwd : compat
passwd_compat : nis
shells : fichiers
services : compat
services_compat : nis
protocoles : fichiers
rpc : fichiers
Figure 1 - Fichier nsswitch.conf par défaut trouvé dans >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 ();
}
Figure 2 - resolve.c utilise l'ancienne fonction 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);
}
Figure 3 - new_resolve.c utilise la nouvelle fonction getaddrinfo de la norme POSIX

 

2024 Stratus Technologies.