17.1より前のバージョンでは、STCPはまず設定されたDNSに問い合わせ、ネームサーバーからの応答がない、または否定的な応答があった場合にのみ、ローカルのホストファイルを検索してホスト名を解決していました。
17.1 からはローカルの hosts ファイルを最初に検索できるようになりましたが、いくつかの条件があります。まず、アプリケーションは 17.1 システム上で POSIX ルールに基づいてビルドされている必要があります。システム >system>stcp>command_library にある標準のコマンドはすべてこの方法でビルドされていますが、アプリケーションを再構築せずに 17.1 をインストールしてこの機能を使うことはできません。次に、ネームサービススイッチの設定ファイル nsswitch.conf を >system>stcp ディレクトリにインストールする必要があります。このファイルのデフォルトバージョンは >system>stcp>templates ディレクトリにあります。
図1からわかるように、nsswitch.confファイルはあらゆる種類のものを制御しているように見えます。しかし、"hosts"と"network"のエントリだけがシステムの動作に影響を与えています。キーワード"dns"と"files"の順番が検索の順番を制御します。files" が最初に来た場合は、DNS を問い合わせる前に hosts または networks ファイルが検索されます。もし"dns"が先に来た場合は、ファイルを検索する前にDNSが照会されます。hosts"または"network"エントリにキーワードのうちの1つだけが含まれている場合は、そのキーワードに対応する検索のみが実行されます。
DNS を照会する代わりに hosts ファイルを使用する主な理由は、速度/災害復旧と制御です。例1が示すように、ネームサーバーの1つが応答しない場合、名前解決にかかる時間は20ミリ秒から2秒近くになります。ネームサーバのどれも応答しない場合、名前解決にかかる時間は非常に長くなります(例2)。hosts ファイルに重要な名前を入れて、最初に hosts ファイルを検索することで、名前解決にかかる時間を気にする必要はありません (例 3)。
ホストファイルを最初に検索するもう一つの理由は、ローカル制御です。DNS を使うと、名前解決プロセスの制御を放棄することになります。ほとんどの場合は問題なく動作しますが、時にはローカル制御が必要になることもあります。例えば、ホストへのアクセスを一時的または恒久的にブロックする必要が出てきた場合、 ファイアウォールでそれを行うか、問題のあるホストへのリクエストを DNS データベースや hosts ファイルを変更して別のアドレスにリダイレクトします。 DNS データベースを変更することはできないかもしれませんし、 ファイアウォールの変更には時間がかかりすぎるかもしれませんが、hosts ファイルを変更することはできます。例4では、www.google.com へのアクセスがローカルホストにリダイレクトされています。
hosts ファイルの欠点は、ホスト名と IP アドレスのマッピングが静的であることです。例5が示すように、ネームサーバは複数のアプリケーションサーバ間で負荷を分散するために異なるIPアドレスを提供するように設定することができます。hosts ファイルにエントリを追加した場合、そのエントリは静的なものであり、DNS が提供する可能性のあるロードバランシングの利点を失うことになります。さらに、ホストの IP アドレスが変更された場合は、hosts ファイルを手動で管理しなければなりません。
では、どのようにして nsswitch.conf ファイルを設定すればよいのでしょうか。ファイルのコメント (図1) は、すべてのアプリケーションが再構築されるまでは、このファイルを >system>stcp ディレクトリにインストールしないことを提案しています。これにより、古いアプリケーションがDNSを使用して1つのアドレスを取得している間に、新しいアプリケーションがhostsファイルを使用して異なるアドレスを取得している(例4)というような発散的な結果になる可能性を防ぐことができます。 さらに、DNS は常に最初に照会されているので、既存の hosts ファイルの中に正しくないエントリがある可能性があります。別の方法としては、hosts エントリを "files dns" に設定してファイルをインストールしますが、hosts ファイルのエントリが localhost のみであることを確認してください (例 6)。必要に応じて、最小限の編集でhostsファイルにホスト/IPアドレスを追加することができますが、古いアプリケーションにはホストファイルのアドレスが表示されないことに注意してください。
では、ネットワークについてはどうでしょうか?ネットワークに名前を付けるには、>system>stcp>networksファイルに記述します。個人的には必要性を感じたことはありませんが、ルートを追加するときに名前を使うことはできます。興味深いのは、ルートを印刷するときに名前が表示されないことです(例7)。arpコマンドで-network引数を使うときにも名前を使うことができます。ネットワーク用のデフォルトの nsswitch.conf ファイルは、最初にネットワークファイルを検索してから DNS を照会します。実際にネットワーク名情報を返すように DNS を設定していない限り、私の提案は networks エントリから dns キーワードを削除することです。
最後にもう一つ。2 つのプログラム例を挙げておきます。最初のresolve.cは古い名前解決関数 gethostbyname を使用し、2 番目のnew_resolve.cは新しい関数 getaddrinfo を使用しています。gethostbyname関数はPOSIX標準関数getaddrinfoに置き換えられています。これは POSIX 標準なので、getaddrinfo についてのドキュメントはStratadoc にはありませんが、ウェブ上には非常に多くのドキュメントがあります。
例。
以下の例では、resolve_17.0 と resolve プログラムは同じソースコードに基づいています。唯一の違いは、resolve が 17.1 システムでコンパイルされているのに対し、 resolve_17.0 は VOS 17.0 システムでコンパイルされていることである。ネームサーバ1.1.1.1.1、1.1.1.2、1.1.1.3はフィクションであり、応答しないネームサーバをシミュレートするために使用されています。また、パブリックネットワーク上にないホストのホスト番号もX'ed outしています。
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>system>stcp>resolv.conf 11-05-24 08:07:13 mst ネームサーバー 164.152.XXX.XXX ネームサーバ 134.111.XXX.XXX 用意ができました 08:07:13 resolve_17.0 ftp.stratus.com ftp.stratus.com は 192.52.248.14 に解決しました。 20.615エムエス 用意ができました 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 ネームサーバー 1.1.1.1.1 ネームサーバー 164.152.XXX.XXX ネームサーバ 134.111.XXX.XXX 用意ができました 08:07:30 resolve_17.0 ftp.stratus.com ftp.stratus.com は 192.52.248.14 に解決しました。 1989.395エムエス 準備ができました 08:07:38 |
例1 - ネームサーバー(1.1.1.1)が応答しない場合の時間の変化 |
d >system>stcp>resolv.conf -match nameserver
%phx_vos#m16_mas>system>stcp>resolv.conf 11-05-23 13:11:31 mst
ネームサーバー 1.1.1.1.1
ネームサーバー 1.1.1.1.2
ネームサーバー 1.1.1.1.3
用意ができました 13:11:31
resolve_17.0 ftp.stratus.com
ftp.stratus.com は 192.52.248.14 に解決しました。 14759.949エムエス
準備完了 13:12:13
|
例2 - ネームサーバーが応答しない場合の名前解決時間 |
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>system>stcp>resolv.conf 11-05-24 08:18:10 mst ネームサーバー 1.1.1.1.1 ネームサーバー 164.152.XXX.XXX ネームサーバ 134.111.XXX.XXX 用意ができました 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: ファイル DNS 用意ができました 08:18:21 ftp.stratus.com を解決する ftp.stratus.com は 192.52.248.14 に解決しました。 13.702エムエス 用意ができました 08:18:31 resolve www1.stratus.com www1.stratus.com は 134.111.1.84 に解決しました。 227.798エムエス 準備ができました 08:18:39 |
例3 - 最初にhostsファイルを検索したときと、エントリを見つけたときと見つけられなかったときの時間の差 |
d >system>stcp>resolv.conf -match nameserver %phx_vos#m16_mas>system>stcp>resolv.conf 11-05-23 13:28:51 mst ネームサーバー 164.152.XXX.XXX ネームサーバ 134.111.XXX.XXX 用意ができました 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.0.1 www.google.com google.com google 用意ができました 13:29:29 resolve_17.0 www.google.com www.google.com 解決済み 74.125.226.115 in 180.099エムエス 用意ができました 13:29:40 解決 www.google.com www.google.com 解決済み 127.0.0.0.1 in 13.458エムエス 準備完了 13:30:01 |
例 4 - 新しいアプリケーションのためにアドレスを localhost に変更して www.google.com へのアクセスをブロックする |
解決 www.yahoo.com www.yahoo.com 決議 67.195.160.7621.439ミリ秒で 準備完了 13:35:56 解決 www.yahoo.com www.yahoo.com 決議 69.147.125.6521.713 msで 準備完了 13:35:56 解決 www.yahoo.com www.yahoo.com 決議 67.195.160.7630.106ミリ秒 準備完了 13:35:57 解決 www.yahoo.com www.yahoo.com 決議 69.147.125.6529.739 msで 準備完了 13:35:58 解決 www.yahoo.com www.yahoo.com 決議 67.195.160.7623.880msで 準備完了 13:35:58 解決 www.yahoo.com www.yahoo.com 決議 69.147.125.6522.736ミリ秒で 準備ができました 13:35:58 |
例5 - DNSが複数のIPアドレスを提供する |
d >system>stcp>hosts %phx_vos#m16_mas>system>stcp>hosts 11-05-24 08:32:51 mst # # サンプルホストファイル # # IPアドレス名のエイリアス # コメント # 127.0.0.0.1 localhost loopback-host loopback lb # required 用意ができました 08:32:51 |
例 6 - 最小ホストファイル |
ルート加算 ノアテスト164.152.XXX.XXX 5.255.255.0 準備完了 13:52:54 ルート印字 デフォルトゲートウェイ:164.152.XXX.XXX ネットワークアドレス ゲートウェイアドレス サブネットマスク リダイレクトライフ 1.2.3.0 164.152.XXX.XXX 255.255.255.255.0 用意ができました 13:53:26 d ネットワーク -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 用意ができました 13:53:48 |
例 7 - ネットワークテーブルの名前を使用したネットワークの追加 |
# # Sample nsswitch.conf(5) - name サービススイッチ設定ファイル # # この設定ファイルはビルドされたプログラムでのみ使用されます リリース 17.1 以降の POSIX ルールの下では、 #。 この設定が # ファイルが存在しない場合、ホスト名検索は # DNSソフトウェアの古いバージョンを使用しています。 混乱を避けるために # この設定ファイルの使用は、すべての設定が完了するまで延期することをお勧めします。 # アプリケーションはPOSIXを使って再構築されました。 # # 非POSIX DNSソフトウェア(およびリリース前のすべてのDNSソフトウェア) # 17.1) は、まず DNS を使用してホストを解決し、次に # >system>stcp>hosts ファイル。 これにはいくつかの小さな問題があります。 # # 1. hosts ファイルに不正なエントリがあると 何かがDNSを無効にするまでは # 検出されません。 これは # could result in confusion in exactly when one doesn't want it. # # 2. DNSから戻ってきた悪いホストを上書きする方法はありません。 # # 3. 他のほとんどの実装ではhostsファイルを最初に検索します。 # # どれも互換性のない変更をするほどの説得力はありません # しかし, 検索順序を変更することもできます. # 上記の問題を回避するためにこのファイルを使用します。 hosts ファイルを検索するには # first, you want. # # hosts: files dns # # の動作と100%の互換性を保つために # VOSの以前のリリースでは、あなたが欲しいのです。 # # hosts: dnsファイル # # また、POSIXではないソフトウェアや17.1以前のソフトウェアではDNSを使用しないことに注意してください #ネットワークを探している 新しいソフトウェアはこれを行います デフォルトではこれを行います # システム>stcp>ネットワークファイルを参照してください。 設定できるのは # この行動も 通常はあまり有益な情報はありませんが ネットワーク用のDNSから#が返ってきます。 DNSルックアップをオフにしたい場合は # for networks, do this. # # ネットワーク: ファイル # グループ: コンパット group_compat: nis hosts: ファイル DNS ネットワーク: ファイル DNS passwd: compat passwd_compat: nis シェル: ファイル サービス: コンパット services_compat: nis プロトコル: ファイル rpc: ファイル |
図1 - デフォルトの nsswitch.conf ファイルは >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 (); } |
図 2 - resolve.c は古い 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); } |
図3 - new_resolve.c は新しい POSIX 標準の getaddrinfo 関数を使用しています。 |