Passa al contenuto principale

Prima della versione 17.1, STCP risolveva i nomi host interrogando prima qualsiasi DNS configurato e solo in caso di mancata risposta o risposta negativa da parte dei server dei nomi effettuava una ricerca nel file host locale.

A partire dalla versione 17.1 è ora possibile effettuare prima la ricerca nel file hosts locale, ma a determinate condizioni. Innanzitutto, l'applicazione deve essere compilata secondo le regole POSIX su un sistema 17.1. Il set standard di comandi in >system>stcp>command_library è interamente compilato in questo modo, ma non è possibile installare semplicemente la versione 17.1 senza ricompilare le applicazioni e aspettarsi di poter utilizzare questa funzione. In secondo luogo, è necessario installare il file di configurazione Name Service Switch, nsswitch.conf, nella directory >system>stcp. Una versione predefinita del file è disponibile nella directory >system>stcp>templates.

Come si può vedere dalla figura 1, il file nsswitch.conf sembra controllare ogni genere di cose. Tuttavia, solo le voci "hosts" e "networks" hanno un effetto sul comportamento del sistema. L'ordine delle parole chiave "dns" e "files" controlla l'ordine di ricerca. Se "files" viene prima, il file hosts o networks verrà cercato prima di interrogare il DNS. Se "dns" viene prima, il DNS verrà interrogato prima di cercare i file. Se la voce "hosts" o "networks" include solo una delle parole chiave, verrà eseguita solo la ricerca corrispondente a quella parola chiave.

Il motivo principale per cui si utilizza il file hosts invece di interrogare semplicemente il DNS è la velocità/il ripristino di emergenza e il controllo. Come mostra l'esempio 1, quando uno dei server dei nomi non risponde, il tempo di risoluzione del nome passa da 20 millisecondi a quasi 2 secondi. Se nessuno dei server dei nomi risponde, il tempo di risoluzione del nome può essere molto lungo (esempio 2). Inserendo i nomi critici nel file hosts e cercando prima nel file hosts, non dovrete preoccuparvi del tempo necessario per risolvere i nomi (esempio 3).

Un altro motivo per cercare prima nel file hosts è il controllo locale. Quando si utilizza un DNS, si rinuncia al controllo del processo di risoluzione dei nomi. Nella maggior parte dei casi questo funziona senza problemi, ma a volte è necessario il controllo locale. Ad esempio, se diventa necessario bloccare temporaneamente o permanentemente l'accesso a un host, è possibile farlo tramite il firewall o reindirizzando le richieste a un host problematico a un indirizzo diverso, modificando il database DNS o il file hosts.  Potrebbe non essere possibile modificare il database DNS e le modifiche al firewall potrebbero richiedere troppo tempo, ma è possibile modificare il proprio file hosts. L'esempio 4 mostra che l'accesso a www.google.com viene reindirizzato all'host locale.

Lo svantaggio del file hosts è che la mappatura tra nomi host e indirizzi IP è statica. Come mostra l'esempio 5, i server dei nomi possono essere configurati per fornire indirizzi IP diversi al fine di distribuire il carico tra più server applicativi. Se si aggiunge una voce nel file hosts, tale voce è statica e si perde il vantaggio del bilanciamento del carico che il DNS potrebbe fornire. Inoltre, è necessario mantenere manualmente il file hosts se/quando gli indirizzi IP degli host vengono modificati.

Come configurare il file nsswitch.conf. I commenti nel file (figura 1) suggeriscono di non installare il file nella directory >system>stcp fino a quando tutte le applicazioni non sono state ricostruite per utilizzarlo. Ciò impedirà possibili risultati divergenti in cui la vecchia applicazione utilizza il DNS ottenendo un indirizzo mentre le nuove applicazioni utilizzano il file hosts ottenendo un indirizzo diverso (esempio 4).  Inoltre, poiché il DNS è sempre stato interrogato per primo, è possibile che alcune voci nel file hosts esistente non siano più corrette. Una strategia alternativa consiste nell'installare il file con la voce hosts impostata su "files dns", ma assicurandosi che l'unica voce nel file hosts sia localhost (esempio 6). È quindi possibile aggiungere indirizzi host/IP al file hosts secondo necessità con una modifica minima, tenendo presente che qualsiasi vecchia applicazione non vedrà l'indirizzo del file host.

OK, e per quanto riguarda le reti? È sempre stato possibile assegnare un nome a una rete inserendolo nel file >system>stcp>networks. Personalmente, non ne ho mai visto la necessità, ma è possibile utilizzare un nome quando si aggiunge una route. È interessante notare che il nome non viene visualizzato quando si stampano le route (esempio 7). È anche possibile utilizzare un nome quando si utilizza l'argomento -network nel comando arp. Il file nsswitch.conf predefinito per le reti cerca prima nel file networks e poi interroga il DNS. A meno che non si abbia effettivamente configurato il DNS per restituire le informazioni sul nome della rete, il mio suggerimento è di rimuovere la parola chiave dns dalla voce networks.

Un ultimo punto. Ho incluso due programmi di esempio. Il primo , resolve.c, utilizza la vecchia funzione di risoluzione dei nomi gethostbyname; il secondo, new_resolve.c, utilizza la nuova funzione getaddrinfo. La funzione gethostbyname è stata sostituita dalla funzione standard POSIX getaddrinfo. Trattandosi di uno standard POSIX, non troverete alcuna documentazione su getaddrinfo in Stratadoc; tuttavia, è disponibile una grande quantità di documentazione sul web, basta cercare getaddrinfo su Google.

Esempi:

Negli esempi seguenti, i programmi resolve_17.0 e resolve si basano sullo stesso codice sorgente. L'unica differenza è che resolve_17.0 è stato compilato su un sistema VOS 17.0, mentre resolve è stato compilato su un sistema 17.1. I server dei nomi 1.1.1.1, 1.1.1.2 e 1.1.1.3 sono fittizi e vengono utilizzati per simulare un server dei nomi che non risponde. Ho anche cancellato con una X i numeri degli host che non si trovano su una rete pubblica.

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

pronto  08:07:13

resolve_17.0 ftp.stratus.com
ftp.stratus.com risolto in 192.52.248.14 in 20.615 ms
pronto  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

pronto  08:07:30

resolve_17.0 ftp.stratus.com
ftp.stratus.com risolto in 192.52.248.14 in 1989.395 ms

pronto  08:07:38
Esempio 1 – variazione nel tempo quando un server dei nomi (1.1.1.1) non risponde

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  
nameserver      1.1.1.2
nameserver      1.1.1.3

pronto  13:11:31

resolve_17.0 ftp.stratus.com
ftp.stratus.com risolto in 192.52.248.14 in 14759.949 ms

pronto  13:12:13
Esempio 2 – tempo necessario per risolvere un nome quando nessun server dei nomi risponde

 

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

pronto  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

hosts: files dns

pronto  08:18:21

risolvi ftp.stratus.com
ftp.stratus.com risolto in 192.52.248.14 in 13.702 ms

pronto  08:18:31

risolvi www1.stratus.com
www1.stratus.com risolto in 134.111.1.84 in 227,798 ms

pronto  08:18:39
Esempio 3 – differenza di tempo tra la ricerca iniziale nel file hosts e il ritrovamento/mancato ritrovamento di una voce

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

pronto  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

pronto  13:29:29

resolve_17.0 www.google.com
www.google.com risolto in 74.125.226.115 in 180.099 ms
pronto  13:29:40

risolvi www.google.com
www.google.com risolto in 127.0.0.1 in 13.458 ms  

pronto  13:30:01
Esempio 4 – Blocco dell'accesso a www.google.com modificando il suo indirizzo in localhost per le nuove applicazioni

risolvere www.yahoo.com 
www.yahoo.com risolto in 67.195.160.76 in 21,439 ms
pronto  13:35:56
risolvi www.yahoo.com
www.yahoo.com risolto in 69.147.125.65 in 21,713 ms
pronto  13:35:56
risolvere www.yahoo.com
www.yahoo.com risolto in 67.195.160.76 in 30,106 ms  
pronto  13:35:57  
risolvi www.yahoo.com  
www.yahoo.com risolto in 69.147.125.65 in 29,739 ms
pronto  13:35:58
risolvi www.yahoo.com
www.yahoo.com risolto in 67.195.160.76 in 23,880 ms
pronto  13:35:58
risolvi www.yahoo.com
www.yahoo.com risolto in 69.147.125.65 in 22,736 ms  
pronto  13:35:58
Esempio 5 – Il DNS fornisce più indirizzi IP

d >system>stcp>hosts

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

#
#       File hosts di esempio
#
# Indirizzo IP    nome            alias                   # commenti
#
127.0.0.1       localhost loopback-host loopback lb     # richiesto

pronto  08:32:51
Esempio 6 – file hosts minimo

aggiungi percorso noahs-test 164.152.XXX.XXX 5.255.255.0
pronto  13:52:54

stampa percorso

Gateway predefinito: 164.152.XXX.XXX

Indirizzo di rete   Indirizzo gateway   Maschera di sottorete     Reindirizzamento      Durata
1.2.3.0           164.152.XXX.XXX   255.255.255.0

pronto  13:53:26

d reti -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

pronto  13:53:48
Esempio 7 – aggiunta di una rete utilizzando un nome nella tabella delle reti

#
# Esempio di nsswitch.conf(5) - file di configurazione del servizio di commutazione dei nomi
#
# Questo file di configurazione è utilizzato solo dai programmi che sono stati compilati
# secondo le regole POSIX nella versione 17.1 o successive.  Se questo file di configurazione
# non è presente, la ricerca dei nomi host sarà compatibile con le
# versioni precedenti del software DNS.  Per evitare confusione, si
# consiglia di rimandare l'uso di questo file di configurazione fino a quando tutte le
# applicazioni non saranno state ricompilate utilizzando POSIX.
#
# Il software DNS non POSIX (e tutto il software DNS precedente alla versione
# 17.1) risolveva gli host utilizzando prima il DNS e poi il file
# >system>stcp>hosts.  Ciò comporta un paio di piccoli problemi:
#
#    1.  Se nel file hosts è presente una voce errata, questa non verrà rilevata
#        fino a quando qualcosa non causerà la scomparsa del DNS.  Ciò
#        potrebbe causare confusione proprio quando non lo si desidera.
#
#    2.  Non c'è modo di ignorare un host errato proveniente dal DNS.
#
#    3.  La maggior parte delle altre implementazioni cerca prima nel file hosts.
#
# Nessuno di questi è abbastanza convincente da apportare una modifica incompatibile
# al comportamento predefinito; tuttavia, è possibile cambiare l'ordine di ricerca
# utilizzando questo file per evitare i problemi sopra indicati.  Per cercare prima nel file hosts
#, è necessario:
#
#              hosts: files dns
#
# Per eseguire prima il DNS e rimanere compatibili al 100% con il comportamento delle
# versioni precedenti di VOS, è necessario:
#
#              hosts: dns files
#
# Inoltre, si noti che il software non POSIX e precedente alla versione 17.1 non ha mai utilizzato il DNS per
# la ricerca delle reti.  Il nuovo software lo fa.  Per impostazione predefinita, lo fa
# dopo aver cercato nel file >system>stcp>networks.  È possibile configurare
# anche questo comportamento.  Di solito non ci sono molte informazioni utili che
# provengono dal DNS per le reti.  Se si desidera disattivare le ricerche DNS
# per le reti, procedere come segue:
#
#              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 – File nsswitch.conf predefinito presente in >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 – resolve.c utilizza la vecchia funzione 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 – new_resolve.c utilizza la nuova funzione standard POSIX getaddrinfo