Prima della 17.1 STCP risolveva i nomi host interrogando prima i DNS configurati e solo in assenza di risposta o in caso di risposta negativa da parte dei server dei nomi cercava il file host locale.
A partire da 17.1 avete ora la possibilità di cercare prima il file host locale, ma ci sono alcune condizioni. Per prima cosa, la vostra applicazione deve essere costruita secondo le regole POSIX su un sistema 17.1. L'insieme standard dei comandi in >sistema>stcp>biblioteca_comandi sono tutti costruiti in questo modo, ma non si può semplicemente installare 17.1 senza ricostruire le applicazioni e aspettarsi di usare questa caratteristica. In secondo luogo è necessario installare il Name Service Switch, nsswitch.conf, file di configurazione nella directory >system>stcp. Una versione predefinita del file può essere trovata nella directory >system>stcp>templates.
Come si può vedere dalla figura 1 il file nsswitch.conf appare per controllare ogni sorta di cose. Tuttavia, solo le voci "host" e "reti" hanno un effetto sul comportamento del sistema. L'ordine delle parole chiave "dns" e "files" controlla l'ordine di ricerca. Se "files" viene prima "files", il file host o di rete viene cercato prima di interrogare il DNS. Se "dns" viene prima "dns", allora il DNS sarà interrogato prima di cercare i file. Se la voce "host" o "reti" include solo una delle parole chiave, allora verrà eseguita solo la ricerca corrispondente a quella parola chiave.
La ragione principale per utilizzare il file host invece di limitarsi a interrogare il DNS è il recupero e il controllo della velocità/disaster recovery. Come l'esempio 1 mostra quando uno dei server di nomi non risponde, il tempo di risoluzione del nome passa da 20 millisecondi a quasi 2 secondi. Se nessuno dei vostri server di nomi risponde, il tempo di risoluzione dei nomi può essere molto lungo (esempio 2). Inserendo i nomi critici nel file host e cercando prima nel file host non dovete preoccuparvi del tempo necessario per risolvere i nomi (esempio 3).
Un altro motivo per cercare prima il file host è il controllo locale. Quando si usa 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 un controllo locale. Ad esempio, se diventa necessario bloccare temporaneamente o permanentemente l'accesso ad un host è possibile farlo presso il firewall o reindirizzando le richieste ad un host problematico ad un indirizzo diverso cambiando il database DNS o il file host. Potrebbe non essere possibile modificare il database DNS e le modifiche al firewall potrebbero richiedere troppo tempo, ma è possibile modificare il proprio file host. L'esempio 4 mostra che l'accesso a www.google.com viene reindirizzato all'host locale.
Il lato negativo del file host è che la mappatura tra i nomi host e gli indirizzi IP è statica. Come l'esempio 5 mostra che i server dei nomi possono essere configurati per fornire diversi indirizzi IP per distribuire il carico tra più server di applicazioni. Se si aggiunge una voce nel file host quella voce è statica e si perde il beneficio di qualsiasi bilanciamento del carico che il DNS potrebbe fornire. Inoltre è necessario mantenere manualmente il file host se e quando gli indirizzi IP dell'host vengono modificati.
Quindi come si dovrebbe 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. Questo eviterà possibili risultati divergenti quando la vecchia applicazione utilizza il DNS ottenendo un indirizzo, mentre le nuove applicazioni utilizzano il file host ottenendo un indirizzo diverso (esempio 4). Inoltre, poiché il DNS è sempre stato interrogato per primo, è possibile che ci siano voci in un file host esistente che non sono più corrette. Una strategia alternativa è quella di installare il file con la voce host impostata su "files dns" ma assicurarsi che l'unica voce nel file host sia localhost (esempio 6). È quindi possibile aggiungere indirizzi host /IP al file host, se necessario, con un minimo di modifiche, tenendo presente che qualsiasi vecchia applicazione non vedrà l'indirizzo del file host.
Ok, e le reti? E' sempre stato possibile dare un nome a una rete inserendola nel file >sistema>stcp>reti. Personalmente, non ne ho mai visto la necessità, ma si potrebbe usare un nome quando si aggiunge un percorso. È interessante notare che il nome non viene visualizzato quando si stampano le rotte (esempio 7). Si può anche usare un nome quando si usa l'argomento -network nel comando arp. Il file predefinito nsswitch.conf per le reti cerca prima il file di rete e poi interroga il DNS. A meno che non abbiate effettivamente configurato il vostro DNS per restituire le informazioni sul nome della rete, il mio suggerimento è di rimuovere la parola chiave dns dalla voce reti.
Un ultimo punto. Ho incluso due programmi di esempio. Il primo resolve.c usa la vecchia funzione di risoluzione del nome gethostbyname; il secondo, new_resolve.c usa la nuova funzione getaddrinfo. La funzione gethostbyname è stata sostituita dalla funzione standard POSIX getaddrinfo. Poiché è lo standard POSIX non troverete alcuna documentazione su getaddrinfo in Stratadoc; tuttavia c'è una grande quantità di documentazione sul web, basta cercare su google getaddrinfo.
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 di nomi 1.1.1.1.1, 1.1.1.1.2 e 1.1.1.3 sono fittizi e vengono utilizzati per simulare un server di nomi che non risponde. Ho anche X'editato i numeri di host di host che non sono su una rete pubblica.
d >sistema>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>sistema>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 a 192.52.248.14 in 20.615 ms pronto 08:07:20 d >sistema>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>sistema>stcp>resolv.conf 11-05-24 08:07:30 mst nameserver 1.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 a 192.52.248.14 in 1989.395 ms pronto 08:07:38 |
Esempio 1 - cambiamento nel tempo quando un server di nomi (1.1.1.1.1) non risponde |
d >sistema>stcp>resolv.conf -match nameserver
%phx_vos#m16_mas>sistema>stcp>resolv.conf 11-05-23 13:11:31 mst
nameserver 1.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 a 192.52.248.14 in 14759.949 ms
pronto 13:12:13
|
Esempio 2 - tempo per risolvere un nome quando nessun server di nomi risponde |
d >sistema>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>sistema>stcp>resolv.conf 11-05-24 08:18:10 mst nameserver 1.1.1.1.1 nameserver 164.152.XXX.XXX nameserver 134.111.XXX.XXX pronto 08:18:10 d >sistema>stcp>nsswitch.conf -match host: %phx_vos#m16_mas>sistema>stcp>nsswitch.conf 11-05-24 08:18:21 mst host: file dns pronto 08:18:21 risolvere ftp.stratus.com ftp.stratus.com risolto a 192.52.248.14 in 13.702 ms pronto 08:18:31 resolve www1.stratus.com www1.stratus.com risolto a 134.111.1.84 in 227.798 ms pronto 08:18:39 |
Esempio 3 - differenza di tempo nella ricerca del file host e nel trovare/non trovare una voce |
d >sistema>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>sistema>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>sistema>sistema>stcp>hosts -match google %phx_vos#m16_mas>sistema>stcp>hosts 11-05-23 13:29:29 mst 127.0.0.0.1 www.google.com google.com google.com google pronto 13:29:29 resolve_17.0 www.google.com www.google.com ha deciso di 74.125.226.115 in 180.099 ms pronto 13:29:40 risolvete www.google.com www.google.com ha deciso di 127.0.0.0.1 in 13.458 ms pronto 13:30:01 |
Esempio 4 - bloccare l'accesso a www.google.com cambiando il suo indirizzo in localhost per nuove applicazioni |
decidere www.yahoo.com www.yahoo.com ha deciso di 67.195.160.76 in 21.439 ms pronto 13:35:56 decidere www.yahoo.com www.yahoo.com ha deciso di 69.147.125.65 in 21.713 ms pronto 13:35:56 decidere www.yahoo.com www.yahoo.com ha deciso di 67.195.160.76 in 30.106 ms pronto 13:35:57 decidere www.yahoo.com www.yahoo.com ha deciso di 69.147.125.65 in 29.739 ms pronto 13:35:58 decidere www.yahoo.com www.yahoo.com ha deciso di 67.195.160.76 in 23.880 ms pronto 13:35:58 decidere www.yahoo.com www.yahoo.com ha deciso di 69.147.125.65 in 22.736 ms pronto 13:35:58 |
Esempio 5 - DNS fornisce più indirizzi IP |
d >sistema>stcp>ospite %phx_vos#m16_mas>sistema>stcp>hosts 11-05-24 08:32:51 mst # # Esempio di file host # # Nome dell'indirizzo IP, alias del nome, commento(i) # 127.0.0.0.1 localhost loopback-host loopback lb # richiesto pronto 08:32:51 |
Esempio 6 - file host minimo |
percorso aggiungere noahs-test 164.152.XXX.XXX 5.255.255.0 pronto 13:52:54 stampa del percorso Gateway predefinito: 164.152.XXX.XXX Indirizzo di rete Indirizzo del gateway Indirizzo della sottorete Maschera di sottorete Redirect Life 1.2.3.0 164.152.XXX.XXX 255.255.255.255.0 pronto 13:53:26 d reti -match noahs-test %phx_vos#m16_mas>sistema>sistema.17.1>reti>stcp>reti 11-05-23 13:53:48 mst noahs-test 1.2.3.0 pronto 13:53:48 |
Esempio 7 - aggiunta di una rete con un nome nella tabella delle reti |
# # Esempio nsswitch.conf(5) - file di configurazione dell'interruttore di servizio del nome # # Questo file di configurazione è usato solo da programmi che sono stati costruiti # secondo le regole POSIX nella versione 17.1 o successive. Se questa configurazione # non è presente, la ricerca del nome dell'host sarà compatibile con il file # versioni precedenti del software DNS. Per evitare confusione, noi # consigliamo di rimandare l'utilizzo di questo file di configurazione fino a quando tutti # Le applicazioni sono state ricostruite utilizzando POSIX. # # Il software DNS non-POSIX (e tutto il software DNS prima del rilascio # 17.1) risolti gli host utilizzando prima il DNS e poi l'opzione >sistema>stcp>hosts file. Questo ha un paio di problemi minori: # # 1. Se c'è una voce errata nel file host, non otterrà # rilevato fino a quando qualcosa non fa scomparire il DNS. Questo # potrebbe causare confusione proprio quando non si vuole. # # 2. Non c'è modo di scavalcare un cattivo ospite che torna dal DNS. # # 3. La maggior parte delle altre implementazioni cerca prima il file host. # # Nessuno di questi è abbastanza convincente per fare un cambiamento incompatibile. # # al comportamento predefinito; tuttavia, è possibile cambiare l'ordine di ricerca # usando questo file per evitare i problemi di cui sopra. Per cercare il file host # Prima di tutto, vuoi... # # # host: file dns # # per fare DNS per primo e rimanere compatibile al 100% con il comportamento di # le precedenti uscite di VOS, volete: # # host: file dns # # Inoltre, si noti che il software non-POSIX e il software pre 17.1 non hanno mai utilizzato dns per # cercando reti... # Il nuovo software lo fa. Per impostazione predefinita, fa questo # dopo aver guardato nel file >sistema>stcp>reti. Si può configurare # anche questo comportamento. # Di solito non ci sono molte informazioni utili che # torna dal DNS per le reti. Se si desidera disattivare le ricerche DNS # per le reti, fai questo. # # # reti: file # gruppo: compat group_compat: nis host: file dns reti: file dns password: compat passwd_compat: nis conchiglie: file servizi: compat servizi_compat: nis protocolli: file rpc: file |
Figura 1 - file predefinito nsswitch.conf trovato in >sistema>stcp>template |
#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 standard |