

現在環境がなく自分で試すことができないため質問させていただきます。

`hosts` ファイルで名前解決をするとき、複数のIPアドレスに同じホストを指定するとどのような順番で解決されるのでしょうか？  
例えば、

[code]

    1.1.1.1 A
    1.1.2.1 A
    
[/code]

だと解決順序はどうなるのでしょう？


CC BY-SA 4.0
2019-09-26T02:39:06.353
59279
2019-10-05T15:57:54.003
2019-09-27T05:34:51.390
3061
35970
question
hosts
hosts ファイルで同じホストに複数の IP アドレスを記述した場合の解決順序


単純に hosts の順番で答えると昇順(上から)になります。  
例えば hosts が下記の場合で ping や tracert を実行します。

  * hosts
[code]     127.0.0.1       A

    127.0.1.1       A
    127.0.0.2       A
    1.1.1.1         A
    1.1.2.1         A
    1.1.1.2         A
    
[/code]

  * ping -a A -n 1
[code]     C:\WINDOWS\system32>ping -a A -n 1

    
    A [1.1.1.1]に ping を送信しています 32 バイトのデータ:
    1.1.1.1 からの応答: バイト数 =32 時間 =4ms TTL=55
    
    1.1.1.1 の ping 統計:
        パケット数: 送信 = 1、受信 = 1、損失 = 0 (0% の損失)、
    ラウンド トリップの概算時間 (ミリ秒):
        最小 = 4ms、最大 = 4ms、平均 = 4ms
    
    C:\WINDOWS\system32>
    
[/code]

  * tracert A
[code]     C:\WINDOWS\system32>tracert A

    
    A [1.1.1.1] へのルートをトレースしています
    経由するホップ数は最大 30 です:
    
      1    <1 ms    <1 ms    <1 ms  hoge0
      2     2 ms    <1 ms    <1 ms  hoge1
          : 省略
     10    15 ms    14 ms    17 ms  hoge9
     11     4 ms     2 ms     2 ms  A [1.1.1.1]
    
    トレースを完了しました。
    
    C:\WINDOWS\system32>
    
[/code]

このhostsファイルの各行をコメントアウトしながらパターン試行すると、hosts
の順序や第1オクテット～第4オクテットのアドレスで動きが変わることが確認できると思います。

なお、nslookup はDNSサーバへの名前解決のみを行うのため、それ以外(hosts 等)は参照しません。

他の解決案としたら Windows Server 2016 とのことなので、 Windows DNS
機能を有効化しローカルで完結するDNS環境を構築してみてはと思います。  
Aレコードの定義で"ドメイン名:IPアドレス = 1:n"が実現できると考えます。


CC BY-SA 4.0
2019-09-26T13:18:45.433
59300
2019-09-26T13:18:45.433
35893
59279
answer


RFC 6724 で定義されています。ある Linux の `gai.conf`(5) には次のような記述があります。(RFC 3484 は RFC
6724 に置き換えられた古い版)

> getaddrinfo(3) の呼び出しでは、複数の答えが返る場合がある。RFC 3484
> によれば、これらの答えは、最も成功の可能性が高い答えがリストの先頭になるような順番に並び替えなければならない。RFC
> には、並び替えのアルゴリズムが書かれている。

概ね、次のような順番になります。

まず IPv6 > IPv4 の順になります。その中でそれぞれ次のような順位になります。

  1. ループバックアドレス
  2. 自ホストの NIC に割り当てた IP アドレス
  3. NIC のネットワークアドレス内
  4. その他

同じ順位のものはさらに「`hosts` の記述順」になるようですが、実装次第かなぁ。

なお、GNU libc (の `getaddrinfo`(3)) は `/etc/gai.conf`
ファイルで順番をカスタマイズすることが可能です。Windows の場合は `netsh` コマンドで `prefixpolicies`
を設定するそうですが、私は使ったことがないのでわかりません。

参考になりそうなページ:

  * RFC 6724 
    * <https://www.rfc-editor.org/rfc/rfc6724>
  * RFC 3484 の呪い 
    * <https://july-diary.hatenablog.com/entry/20140427/p1>
  * `dnsstubq.c` (`getaddrinfo`(3) (DNS スタブリゾルバー) に名前解決結果をそのまま表示するコマンドラインツールのソースコード) 
    * <https://gist.github.com/fumiyas/a462843421be93c8288f001f24e93045>
  * getaddrinfo:Geekなぺーじ (Windows での `getaddrinfo`(3) の使用例) 
    * <https://www.geekpage.jp/programming/winsock/getaddrinfo.php>

名前解決の結果については上記の通りですが、それをどのような優先順位で利用するか、複数利用するかどうかは実装次第です。一般的には
`getaddrinfo`(3) (あるいはそれに相当する API)
が返した通りの順位で1つだけ使うようですが、ランダム化する実装もあるかと思います。後者の例としては DNS の MX RR の話なので DNS
限定ですが、Postfix の `smtp_randomize_addresses=yes` 設定 (`postconf`(5) を参照のこと)。


CC BY-SA 4.0
2019-09-26T19:47:51.400
59307
2019-10-05T15:57:54.003
2021-10-07T07:34:52.683
-1
3061
59279
answer