Windowsで同一サブネット内に複数IPを利用するときに注意すること

2017.04.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

西澤です。今回はEC2ではなく、ほぼWindowsの話です。Windows Server 2003からWindows Server 2008に移行する際に遭遇した問題の知見が活きた機会があったので、特殊なケースなのですが改めてここでまとめておきたいと思います。

複数IP構成のルーティング

まずは、EC2 WindowsにアタッチしたENIに2つのプライベートIPを割り当て、それぞれにEIPを設定しておきます。

manage_ip_addresses_1

今回、その手順について詳しく説明はしませんが、Windows側でも静的にこの設定を施す必要がありますのでご注意ください。詳しくは、下記の公式ドキュメントをご覧ください。

それでは、このときのルーティングを確認してみましょう。

PS C:\> route print -4
===========================================================================
インターフェイス一覧
 12...02 e5 e5 c8 6c 83 ......AWS PV Network Device #0
  1...........................Software Loopback Interface 1
 13...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
 18...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0       10.200.1.1      10.200.1.54    266
       10.200.1.0    255.255.255.0            リンク上       10.200.1.54    266
      10.200.1.54  255.255.255.255            リンク上       10.200.1.54    266
      10.200.1.81  255.255.255.255            リンク上       10.200.1.54    266
     10.200.1.255  255.255.255.255            リンク上       10.200.1.54    266
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    306
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    306
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
  169.254.169.250  255.255.255.255       10.200.1.1      10.200.1.54     10
  169.254.169.251  255.255.255.255       10.200.1.1      10.200.1.54     10
  169.254.169.254  255.255.255.255       10.200.1.1      10.200.1.54     10
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    306
        224.0.0.0        240.0.0.0            リンク上       10.200.1.54    266
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
  255.255.255.255  255.255.255.255            リンク上       10.200.1.54    266
===========================================================================
固定ルート:
  ネットワーク アドレス          ネットマスク  ゲートウェイ アドレス  メトリック
          0.0.0.0          0.0.0.0       10.200.1.1     既定
          0.0.0.0          0.0.0.0       10.200.1.1     既定
===========================================================================

ゲートウェイへの通信に利用される発信元のIPは、"10.200.1.54"です。ということは、インターネットに通信する時に使われるEIPは、"52.32.185.160"ということになります。

PS C:\> PS C:\> Invoke-RestMethod "http://checkip.amazonaws.com"
52.32.185.160

通信元が変更されるパターン

今度はさらに3つ目のIPをENIに割り当てます。先ほどと異なるのは、割り当てられたプライベートIPのうち、4オクテット目の数字が最も小さくなるようにします。

manage_ip_addresses_2

Windows側の設定も先ほどと同様にもう1つのプライベートIPを追加しておきましょう。

windows_config

それでは、先ほどと同じようにルーティング情報を確認してみます。

PS C:\> route print -4
===========================================================================
インターフェイス一覧
 12...02 e5 e5 c8 6c 83 ......AWS PV Network Device #0
  1...........................Software Loopback Interface 1
 13...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
 18...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0       10.200.1.1      10.200.1.27    266
       10.200.1.0    255.255.255.0            リンク上       10.200.1.27    266
      10.200.1.27  255.255.255.255            リンク上       10.200.1.27    266
      10.200.1.54  255.255.255.255            リンク上       10.200.1.27    266
      10.200.1.81  255.255.255.255            リンク上       10.200.1.27    266
     10.200.1.255  255.255.255.255            リンク上       10.200.1.27    266
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    306
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    306
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
  169.254.169.250  255.255.255.255       10.200.1.1      10.200.1.27     10
  169.254.169.251  255.255.255.255       10.200.1.1      10.200.1.27     10
  169.254.169.254  255.255.255.255       10.200.1.1      10.200.1.27     10
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    306
        224.0.0.0        240.0.0.0            リンク上       10.200.1.27    266
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    306
  255.255.255.255  255.255.255.255            リンク上       10.200.1.27    266
===========================================================================
固定ルート:
  ネットワーク アドレス          ネットマスク  ゲートウェイ アドレス  メトリック
          0.0.0.0          0.0.0.0       10.200.1.1     既定
          0.0.0.0          0.0.0.0       10.200.1.1     既定
===========================================================================

デフォルトゲートウェイへの通信に利用される通信元IPが、"10.200.1.27"に変わってしまいました。インターネットに通信する時に使われるEIPは"54.69.74.245"に変わることになります。

PS C:\> Invoke-RestMethod checkip.amazonaws.com
54.69.74.245

今回は全てのプライベートIPに対してEIPを設定したので問題なかったのですが、今回通信元として利用されることになったプライベートIPである"10.200.1.27"に対応するEIPを指定しなければ、EC2インスタンスはインターネットと通信することができません。正確には、EIPへのインターネットからのアクセスは可能なのですが、EC2からインターネットに出ていくことができなくなってしまいます。

Inbound

Outbound

これはWindowsの仕様によるもので、 ゲートウェイに最も近いIPアドレスが通信元として選択されるという挙動となります。

異なるセグメントの場合 次のホップの IP アドレスと、上位ビットから順に評価し、一致するビット数が最も多い IP アドレスが選択されます。 この動作は Windows Server 2008 と同様です。

まとめ

そもそもEC2に静的な設定をすることもそうですし、置き換えが難しくなるような特殊な設定をお勧めするつもりは毛頭ありません。要件によってはこのような利用パターンもあるということで、限定的な注意事項としてご認識いただければと思います。

よろしくお願いいたします。