マルチホーム環境にて API により IPv4 アドレスが返される順番について

NIC が複数インストールされたマルチホーム環境で自分自身のホスト名の IP アドレスを取得するために、名前解決を行う場合、各 NIC に割り当てられた IP アドレスが返されます。例えば自身の IPv4 アドレスに対して Ping を実施する場合、自ホストの名前解決を行って IPv4 アドレスを取得しますが、マルチホーム環境の場合複数のアドレスが返ることになります。名前解決をプログラムから行う場合、現行 OS 向けに新規開発を行う場合は getaddrinfo 関数を利用しますが、過去に開発されたレガシーアプリケーションでは gethostbyname 関数を利用しているケースもあると思います。何れの関数を利用した場合においても、IPv4 アドレスを取得する順番を制御したいと要望を持つ開発者は多くいると思います。API はどのような順番で IPv4 アドレスを返しており、そして返される順番をどのようにすれば制御できるか以下にまとめました。

1. API が返す IPv4 アドレスの順番

gethostbyname 関数や getaddrinfo 関数といった関数の内部的な処理において、返す IPv4 アドレスの順番を意識した実装は実はしていません。このため、MSDN の解説などにも IP アドレスが返される順番については言及していません。当然アドレスの情報を取得するために OS  が持っているリソースから IPv4 アドレス情報を取得していますが、このリソースが何であるかは決まっているわけではなく、OS のバージョンによって異なる場合もあります。

2. マルチホーム環境にて IPv4 アドレスが返される順番を制御する方法

Windows 7 / Windows Server 2008 R2 までの OS では NIC のバインド順を変更することにより間接的に API が返す IPv4 アドレスを制御することができます。バインド順上位のものから順番に返されます。Windows 8 / Windows Server 2012 以降の OS では NIC のメトリックを変更することで間接的に制御できます (gethostbyname 関数が返す IPv4 アドレスの順番には対応していません)。メトリック値が低いものから順番に返されます。

バインド順およびメトリックを変更する方法は以下のとおりになります。

ネットワーク アダプタのバインドの順序を変更する方法 (Windows 7 / Windows Server 2008 R2 以前)

  1. [ファイル名を指定して実行] から ncpa.cpl と入力し、[OK] をクリックします。
  2. ネットワーク接続ウィンドウに、使用可能な接続が表示されます。
  3. [詳細設定] メニューの [詳細設定] をクリックし、[アダプタとバインド] タブをクリックします。
    *[詳細設定] メニューが表示されない場合は、Alt キーを押してください。
  4. [接続] で、一覧の上の方に移動する接続を選択します。矢印ボタンを使用して接続を移動します。

インターフェイス メトリックを変更する方法 (Windows 8 / Windows Server 2012 以降)

  1. [ファイル名を指定して実行] から ncpa.cpl と入力し、[OK] をクリックします。
  2. ネットワーク接続ウィンドウに、使用可能な接続が表示されます。
  3. メトリックを変更するネットワークアダプタを右クリックし、[プロパティ] をクリックし、[全般] タブをクリックします。
  4. [この接続は次の項目を使用します] ボックスの一覧で、[インターネット プロトコル バージョン 4 (TCP/IPv4)] をクリックし、[プロパティ] をクリックします。
  5. ダイアログボックスの [全般] タブをクリックし、[詳細設定] をクリックします。
  6. [IP 設定] タブで、[自動メトリック] チェック ボックスをオフにし、[インターフェイス メトリック] ボックスに値を入力します。