hosts ファイルで同じホストに複数の IP アドレスを記述した場合の解決順序


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

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

[code]

    1.1.1.1 A
    1.1.2.1 A
    
[/code]

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




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) を参照のこと)。

