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 |
