Zum Hauptinhalt springen

Vor 17.1 löste STCP Host-Namen auf, indem es zuerst alle konfigurierten DNS abfragte und nur dann, wenn es keine oder eine negative Antwort von den Nameservern gab, in der lokalen Hosts-Datei suchte.

Ab 17.1 haben Sie nun die Möglichkeit, zuerst die lokale Hosts-Datei zu durchsuchen, aber es gibt einige Bedingungen. Erstens muss Ihre Anwendung unter POSIX-Regeln auf einem 17.1-System erstellt werden. Die Standardbefehle in >system>stcp>command_library sind alle auf diese Weise erstellt, aber Sie können nicht einfach 17.1 installieren, ohne Ihre Anwendungen neu zu erstellen, und erwarten, dass Sie diese Funktion nutzen können. Zweitens müssen Sie die Konfigurationsdatei für den Name Service Switch, nsswitch.conf, im Verzeichnis >system>stcp installieren. Eine Standardversion der Datei finden Sie im Verzeichnis >system>stcp>templates.

Wie Sie aus Abbildung 1 ersehen können, scheint die Datei nsswitch.conf alles Mögliche zu steuern. Allerdings haben nur die Einträge "hosts" und "networks" einen Einfluss auf das Systemverhalten. Die Reihenfolge der Schlüsselwörter "dns" und "files" steuert die Suchreihenfolge. Steht "files" an erster Stelle, wird die hosts- oder networks-Datei durchsucht, bevor das DNS abgefragt wird. Steht "dns" an erster Stelle, wird das DNS vor der Suche in den Dateien abgefragt. Wenn der Eintrag "hosts" oder "networks" nur eines der Schlüsselwörter enthält, wird nur die Suche nach diesem Schlüsselwort durchgeführt.

Der Hauptgrund für die Verwendung der Hosts-Datei anstelle einer einfachen Abfrage des DNS ist die Geschwindigkeit bzw. die Wiederherstellung im Katastrophenfall und die Kontrolle. Wie Beispiel 1 zeigt, steigt die Zeit für die Namensauflösung von 20 Millisekunden auf fast 2 Sekunden, wenn einer der Namensserver nicht antwortet. Wenn keiner Ihrer Nameserver antwortet, kann die Zeit für die Namensauflösung sehr lang sein(Beispiel 2). Wenn Sie kritische Namen in der Hosts-Datei ablegen und die Hosts-Datei zuerst durchsuchen, müssen Sie sich keine Sorgen über die Zeit machen, die für die Namensauflösung benötigt wird(Beispiel 3).

Ein weiterer Grund, zuerst die hosts-Datei zu durchsuchen, ist die lokale Kontrolle. Wenn Sie ein DNS verwenden, geben Sie die Kontrolle über den Namensauflösungsprozess ab. In den meisten Fällen funktioniert dies ohne Probleme, aber manchmal ist eine lokale Kontrolle erforderlich. Wenn es beispielsweise notwendig wird, den Zugriff auf einen Host vorübergehend oder dauerhaft zu blockieren, können Sie dies an der Firewall tun oder Anfragen an einen problematischen Host auf eine andere Adresse umleiten, indem Sie die DNS-Datenbank oder die Hosts-Datei ändern. Möglicherweise ist es nicht möglich, die DNS-Datenbank zu ändern, und Änderungen an der Firewall können zu lange dauern, aber Sie können Ihre eigene hosts-Datei ändern. Beispiel 4 zeigt, dass der Zugriff auf www.google.com auf den lokalen Host umgeleitet wird.

Der Nachteil der hosts-Datei ist, dass die Zuordnung zwischen Hostnamen und IP-Adressen statisch ist. Wie Beispiel 5 zeigt, können Namenserver so konfiguriert werden, dass sie verschiedene IP-Adressen bereitstellen, um die Last auf mehrere Anwendungsserver zu verteilen. Wenn Sie einen Eintrag in der Hosts-Datei hinzufügen, ist dieser Eintrag statisch und Sie verlieren den Vorteil des Lastausgleichs, den das DNS bieten könnte. Außerdem müssen Sie die hosts-Datei manuell pflegen, wenn die IP-Adressen der Hosts geändert werden.

Wie sollten Sie also die Datei nsswitch.conf konfigurieren? Die Kommentare in der Datei(Abbildung 1) schlagen vor, die Datei erst dann in das Verzeichnis >system>stcp zu installieren, wenn alle Anwendungen neu erstellt wurden, um sie zu verwenden. Dadurch wird verhindert, dass die alte Anwendung DNS verwendet und eine Adresse erhält, während neue Anwendungen die hosts-Datei verwenden und eine andere Adresse erhalten(Beispiel 4). Da der DNS immer zuerst abgefragt wurde, ist es außerdem gut möglich, dass in einer vorhandenen hosts-Datei Einträge vorhanden sind, die nicht mehr korrekt sind. Eine alternative Strategie besteht darin, die Datei so zu installieren, dass der hosts-Eintrag auf "files dns" gesetzt ist, aber darauf zu achten, dass der einzige Eintrag in der hosts-Datei localhost ist(Beispiel 6). Anschließend können Sie der Datei hosts bei Bedarf mit einem Minimum an Bearbeitungsaufwand Host-IP-Adressen hinzufügen, wobei zu bedenken ist, dass alte Anwendungen die Adresse der Datei hosts nicht sehen werden.

OK, was ist mit Netzwerken? Es war schon immer möglich, einem Netzwerk einen Namen zu geben, indem man es in der Datei >system>stcp>networks ablegt. Ich persönlich habe noch nie die Notwendigkeit gesehen, aber man kann einen Namen verwenden, wenn man eine Route hinzufügt. Interessanterweise wird der Name nicht angezeigt, wenn Sie Routen drucken(Beispiel 7). Sie können auch einen Namen verwenden, wenn Sie das Argument -network im Befehl arp benutzen. Die Standarddatei nsswitch.conf für Netzwerke durchsucht zuerst die Datei networks und fragt dann den DNS ab. Wenn Sie Ihr DNS nicht so konfiguriert haben, dass es Netzwerknamen zurückgibt, empfehle ich Ihnen, das Schlüsselwort dns aus dem Eintrag networks zu entfernen.

Ein letzter Punkt. Ich habe zwei Beispielprogramme beigefügt. Das erste, resolve.c, verwendet die alte Namensauflösungsfunktion gethostbyname; das zweite, new_resolve.c, verwendet die neue Funktion getaddrinfo. Die Funktion gethostbyname ist durch die POSIX-Standardfunktion getaddrinfo ersetzt worden. Da es sich um den POSIX-Standard handelt, werden Sie in Stratadoc keine Dokumentation über getaddrinfo finden; es gibt jedoch eine Menge Dokumentation im Web, googeln Sie einfach getaddrinfo.

Beispiele:

In den folgenden Beispielen basieren die Programme resolve_17.0 und resolve auf demselben Quellcode. Der einzige Unterschied ist, dass resolve_17.0 auf einem VOS 17.0 System kompiliert wurde, während resolve auf einem 17.1 System kompiliert wurde. Die Nameserver 1.1.1.1, 1.1.1.2 und 1.1.1.3 sind fiktiv und werden verwendet, um einen Nameserver zu simulieren, der nicht antwortet. Ich habe auch die Hostnummern von Hosts, die sich nicht in einem öffentlichen Netzwerk befinden, mit X markiert.

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

bereit 08:07:13

auflösen_17.0 ftp.stratus.com
ftp.stratus.com aufgelöst nach 192.52.248.14 in 20.615 ms
bereit 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

bereit 08:07:30

auflösen_17.0 ftp.stratus.com
ftp.stratus.com aufgelöst nach 192.52.248.14 in 1989.395 ms

bereit 08:07:38
Beispiel 1 - Änderung der Zeit, wenn ein Namensserver (1.1.1.1) nicht antwortet

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

bereit 13:11:31

auflösen_17.0 ftp.stratus.com
ftp.stratus.com aufgelöst nach 192.52.248.14 in 14759.949 ms

bereit 13:12:13
Beispiel 2 - Zeit für die Auflösung eines Namens, wenn keine Nameserver antworten

 

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

bereit 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: Dateien dns

bereit 08:18:21

auflösen ftp.stratus.com
ftp.stratus.com aufgelöst nach 192.52.248.14 in 13.702 ms

bereit 08:18:31

auflösen www1.stratus.com
www1.stratus.com wird aufgelöst nach 134.111.1.84 in 227.798 ms

bereit 08:18:39
Beispiel 3 - Zeitunterschied beim ersten Durchsuchen der Hosts-Datei und beim Finden/Nichtfinden eines Eintrags

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

bereit 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

bereit 13:29:29

auflösen_17.0 www.google.com
www.google.com aufgelöst nach 74.125.226.115 in 180.099 ms
fertig 13:29:40

auflösen www.google.com
www.google.com aufgelöst nach 127.0.0.1 auf 13.458 ms

bereit 13:30:01
Beispiel 4 - Sperrung des Zugriffs auf www.google.com durch Änderung der Adresse in localhost für neue Anwendungen

www.yahoo.com auflösen
www.yahoo.com wird aufgelöst zu 67.195.160.76 in 21.439 ms
bereit 13:35:56
auflösen www.yahoo.com
www.yahoo.com aufgelöst in 69.147.125.65 in 21.713 ms
bereit 13:35:56
auflösen www.yahoo.com
www.yahoo.com aufgelöst in 67.195.160.76 in 30.106 ms
bereit 13:35:57
auflösen www.yahoo.com
www.yahoo.com aufgelöst in 69.147.125.65 in 29,739 ms
bereit 13:35:58
auflösen www.yahoo.com
www.yahoo.com aufgelöst in 67.195.160.76 in 23.880 ms
bereit 13:35:58
auflösen www.yahoo.com
www.yahoo.com aufgelöst in 69.147.125.65 in 22.736 ms
bereit 13:35:58
Beispiel 5 - DNS liefert mehrere IP-Adressen

d >system>stcp>hosts

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

#
Beispiel Hosts-Datei
#
# IP-Adresse Name Alias # Kommentar(e)
#
127.0.0.1 localhost loopback-host loopback lb # erforderlich

bereit 08:32:51
Beispiel 6 - minimale hosts-Datei

route add noahs-test 164.152.XXX.XXX 5.255.255.0
bereit 13:52:54 

Route drucken

Standard-Gateway: 164.152.XXX.XXX

Netzwerkadresse Gateway-Adresse Subnetzmaske Umleitung Leben
1.2.3.0           164.152.XXX.XXX 255.255.255.0

bereit 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

bereit 13:53:48
Beispiel 7 - Hinzufügen eines Netzes anhand eines Namens in der Netztabelle

#
# Beispiel nsswitch.conf(5) - Konfigurationsdatei für den Namensdienstschalter
#
# Diese Konfigurationsdatei wird nur von Programmen verwendet, die
# unter POSIX-Regeln in Version 17.1 oder später erstellt wurden.  Wenn diese Konfigurations
# Datei nicht vorhanden ist, sind Hostnamen-Lookups kompatibel mit den
# älteren Versionen der DNS-Software.  Um Verwirrung zu vermeiden, empfehlen wir
# empfehlen wir, die Verwendung dieser Konfigurationsdatei zu verschieben, bis alle
Anwendungen unter Verwendung von POSIX neu # erstellt wurden.
#
Die Nicht-POSIX-DNS-Software (und alle DNS-Software vor der Version
17.1) löste Hosts auf, indem sie zuerst DNS und dann den Befehl
# >system>stcp>hosts-Datei.  Dies hat ein paar kleinere Probleme:
#
#    1.  Wenn es einen fehlerhaften Eintrag in der Hosts-Datei gibt, wird er nicht # erkannt.
# entdeckt, bis etwas DNS zum Verschwinden bringt.  Dies
# könnte genau dann zu Verwirrung führen, wenn man es nicht will.
#
#    2.  Es gibt keine Möglichkeit, einen schlechten Host, der von DNS zurückkommt, zu überschreiben.
#
#    3.  Die meisten anderen Implementierungen durchsuchen zuerst die Hosts-Datei.
#
# Keiner dieser Punkte ist zwingend genug, um eine inkompatible Änderung
# zum Standardverhalten zu machen; allerdings können Sie die Suchreihenfolge
# mit dieser Datei ändern, um die oben genannten Probleme zu vermeiden.  Um die hosts-Datei zu durchsuchen
# wollen Sie zuerst:
#
# hosts: files dns
#
# um DNS zuerst zu machen und 100% kompatibel mit dem Verhalten von
# früheren Versionen von VOS zu bleiben, wollen Sie:
#
# hosts: dns files
#
# Beachten Sie auch, dass die Nicht-POSIX- und Vor-17.1-Software nie dns zum
# Netzwerke nachzuschlagen.  Die neue Software tut dies.  Standardmäßig tut sie dies
# nach einem Blick in die Datei >system>stcp>networks.  Man kann
# dieses Verhalten auch konfigurieren.  Normalerweise gibt es nicht viele nützliche Informationen, die
Informationen, die von DNS für Netzwerke zurück # kommen.  Wenn Sie DNS-Lookups für Netzwerke abschalten wollen
für Netzwerke deaktivieren wollen, tun Sie dies:
#
# networks: files
#
gruppe: compat
gruppe_kompat: nis
hosts: dateien dns
netzwerke: dateien dns
passwd: compat
passwd_compat: nis
shells: dateien
dienste: compat
dienste_compat: nis
protokolle: dateien
rpc: dateien
Abbildung 1 - Standarddatei nsswitch.conf, zu finden unter >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 ();
}
Abbildung 2 - resolve.c verwendet die alte Funktion 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);
}
Abbildung 3 - new_resolve.c verwendet die neue POSIX-Standardfunktion getaddrinfo

 

© 2024 Stratus Technologies.