WindowsのNICの選び方の罠

PCに複数のNICが刺さっておりNICごとに別の役割をもたせたい。
そんな時にひっそりと襲ってくるWindowsの罠。

# 前提
![Untitled(1).png](https://qiita-image-store.s3.amazonaws.com/0/199750/bff95a12-336f-5431-af78-4e56b502a052.png)

HyperVをホストする[^1]2台のサーバーがあり、HyperVおよびゲストマシンへのアクセス用にNIC(192.168.11.\*)、データ共有用に別のNIC(10.20.30.\*)がそれぞれ別のネットワークにつながっている。
(ストレージ用のネットワークは独立しており、ホスト用ネットワークから侵入することはできない。)

サーバー間では定期的に大きなファイルを転送しあっているためトラフィックを分離したい。

||HyperV1|HyperV2|
|:----:|:----:|:----:|
|ホスト名|castor|pollux|
|eth0.name|vEthernet(ExternalShared)|vEthernet(ExternalShared)|
|eth0.addr|192.168.11.231|192.168.11.232|
|eth0.fqdn|castor.hyperv.local|pollux.hyperv.local|
|eth1.name|StorageNetwork|StorageNetwork|
|eth1.addr|10.20.30.10|10.20.30.20|
|eth1.fqdn|castor.hyperv.storage|pollux.hyperv.storage|

お互いはそれぞれのネットワークごとに別々のFQDNを持ちHOSTSファイルで管理している。

```bash:hosts
10.20.30.10	castor.hyperv.storage
10.20.30.20	pollux.hyperv.storage

192.168.11.231 castor.hyperv.local
192.168.11.232 pollux.hyperv.local
```

ストレージ側サブネットへのアクセスには固定ルートを割り振っている。

```powershell
C:\Users\Administrator>route print /4
===========================================================================
インターフェイス一覧
  7...00 25 90 2d 80 a9 ......Intel(R) 82576 Gigabit Dual Port Network Connection
  6...00 25 90 2d 80 a8 ......Hyper-V Virtual Ethernet Adapter
  1...........................Software Loopback Interface 1
  3...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
 11...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
 17...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #3
===========================================================================

IPv4 ルート テーブル
===========================================================================
アクティブ ルート:
ネットワーク宛先        ネットマスク          ゲートウェイ       インターフェイス  メトリック
          0.0.0.0          0.0.0.0     192.168.11.1   192.168.11.231    291
       10.20.30.0    255.255.255.0            リンク上       10.20.30.10    291
       10.20.30.0    255.255.255.0       10.20.30.1      10.20.30.10     36
      10.20.30.10  255.255.255.255            リンク上       10.20.30.10    291
     10.20.30.255  255.255.255.255            リンク上       10.20.30.10    291
        127.0.0.0        255.0.0.0            リンク上         127.0.0.1    331
        127.0.0.1  255.255.255.255            リンク上         127.0.0.1    331
  127.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
     192.168.11.0    255.255.255.0            リンク上    192.168.11.231    291
   192.168.11.231  255.255.255.255            リンク上    192.168.11.231    291
   192.168.11.255  255.255.255.255            リンク上    192.168.11.231    291
        224.0.0.0        240.0.0.0            リンク上         127.0.0.1    331
        224.0.0.0        240.0.0.0            リンク上       10.20.30.10    291
        224.0.0.0        240.0.0.0            リンク上    192.168.11.231    291
  255.255.255.255  255.255.255.255            リンク上         127.0.0.1    331
  255.255.255.255  255.255.255.255            リンク上       10.20.30.10    291
  255.255.255.255  255.255.255.255            リンク上    192.168.11.231    291
===========================================================================
固定ルート:
  ネットワーク アドレス          ネットマスク  ゲートウェイ アドレス  メトリック
          0.0.0.0          0.0.0.0     192.168.11.1     既定
          0.0.0.0          0.0.0.0     192.168.11.1     既定
       10.20.30.0    255.255.255.0       10.20.30.1       1
===========================================================================
```

[^1]: Hypervは今回ほとんど関係ない

# 実験方法
ホスト2側に共有ディレクトリを作成する。
ホスト1からエクスプローラー越しにファイルをコピーしリソースモニタでトラフィックを観測する。
hostsを変更する場合`ipconfig /flushdns`でDNSキャッシュをクリアする。

# (1)とりあえず実験

## NETBIOS名でコピー
![スクリーンショット (99).png](https://qiita-image-store.s3.amazonaws.com/0/199750/951763d2-873c-17ec-8eb2-0dacb9f588bc.png)

##ホスト側IPアドレスでコピー
![スクリーンショット (101).png](https://qiita-image-store.s3.amazonaws.com/0/199750/352bc1ce-07c0-32d9-3f24-81ae4466a215.png)

##ホスト側fqdnでコピー
![スクリーンショット (100).png](https://qiita-image-store.s3.amazonaws.com/0/199750/e7b5d15b-8692-c8d3-a01a-eb3846abe3ec.png)

##ストレージ側IPアドレスでコピー
![スクリーンショット (98).png](https://qiita-image-store.s3.amazonaws.com/0/199750/6f4d5284-6b09-daba-7401-46d825609931.png)

## ストレージ側fqdnでコピー
![スクリーンショット (97).png](https://qiita-image-store.s3.amazonaws.com/0/199750/8f92cc32-fe37-f0ba-a0c9-0c04c737694c.png)

## (1)のまとめ

|  | 予測 | 実際 | 結果 |
|:-:|:-:|:-:|:-:|
| NETBIOS  | eth0[^2]  | eth0  | ○  |
| ホストIP  | eth0  | eth0  | ○  |
| ホストfqdn  | eth0  | eth0  | ○ |
| ストレージIP | eth1  | eth0  | X  |
| ストレージfqdn | eth1  | eth0  | X  |

eth0つよい
[^2]: デフォルトゲートウェイの優先接続先がくるのかなと

# (2)fqdnを変えて実験

ストレージ側のホスト名に`-LB`を付けて分ける。

```bash:hosts
10.20.30.10	castor-LB.hyperv.storage
10.20.30.20	pollux-LB.hyperv.storage

192.168.11.231 castor.hyperv.local
192.168.11.232 pollux.hyperv.local
```

##ストレージ側IPアドレスでコピー
![スクリーンショット (103).png](https://qiita-image-store.s3.amazonaws.com/0/199750/b69b84d8-fb07-6539-99e7-fd01e254550d.png)

## ストレージ側fqdnでコピー
![スクリーンショット (102).png](https://qiita-image-store.s3.amazonaws.com/0/199750/7062a74e-bf09-3146-280c-7584ec3d34d6.png)

## (2)のまとめ

|  | 予測 | 実際 | 結果 |
|:-:|:-:|:-:|:-:|
| ストレージIP | eth1  | eth0  | X  |
| ストレージfqdn | eth1  | eth1  | ○  |

IPで直接開いてるのに違うIFが使われるの納得がいかん!

# (3)HOSTSにNETBIOS名のエリアスを付加

ストレージ側のホスト名に`-LB`を付けて分ける。

```bash:hosts
10.20.30.10	castor-LB , castor-LB.hyperv.storage
10.20.30.20	pollux-LB , pollux-LB.hyperv.storage

192.168.11.231	castor , castor.hyperv.local
192.168.11.232	pollux , pollux.hyperv.local
```
##ストレージ側IPアドレスでコピー
![スクリーンショット (104).png](https://qiita-image-store.s3.amazonaws.com/0/199750/f7fe3f30-866c-e495-91ae-b1b7864e02b3.png)

##ストレージ側NETBIOS名でコピー
![スクリーンショット (105).png](https://qiita-image-store.s3.amazonaws.com/0/199750/141d9e11-4f5e-9a7c-3004-935e6435849e.png)

## (3)のまとめ

|  | 予測 | 実際 | 結果 |
|:-:|:-:|:-:|:-:|
| ストレージIP | eth1  | eth0  | X  |
| ストレージNETBIOS | eth1  | eth1  | ○  |

なんでじゃあああああ

# Windowsの名前解決ってどうなってんだ

[Windows 名前解決の順序 – Ask the Network & AD Support Team](https://blogs.technet.microsoft.com/jpntsblog/2009/07/13/windows/)

```
:\Users\Administrator> ipconfig /displaydns

Windows IP 構成

    ,
    ----------------------------------------
    タイプ CNAME のレコード データを表示できませんでした。


    1.11.168.192.in-addr.arpa
    ----------------------------------------
    名前が存在しません。


    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.6.e.b.0.8.a.0.c.ip6.arpa
    ----------------------------------------
    名前が存在しません。


    20.30.20.10.in-addr.arpa
    ----------------------------------------
    レコード名 . . . . . . . : 20.30.20.10.in-addr.arpa.
    レコードの種類 . . . . . : 12
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    PTR レコード . . . . . . : pollux-LB


    castor.hyperv.local
    ----------------------------------------
    レコード名 . . . . . . . : castor.hyperv.local
    レコードの種類 . . . . . : 5
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    CNAME レコード . . . . . : castor


    castor-lb
    ----------------------------------------
    タイプ AAAA のレコードがありません


    castor-lb
    ----------------------------------------
    レコード名 . . . . . . . : castor-LB
    レコードの種類 . . . . . : 1
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 4
    セクション . . . . . . . : 回答
    A (ホスト) レコード. . . : 10.20.30.10


    254.29.221.111.in-addr.arpa
    ----------------------------------------
    名前が存在しません。


    pollux
    ----------------------------------------
    タイプ AAAA のレコードがありません


    pollux
    ----------------------------------------
    レコード名 . . . . . . . : pollux
    レコードの種類 . . . . . : 1
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 4
    セクション . . . . . . . : 回答
    A (ホスト) レコード. . . : 192.168.11.232


    pollux-lb
    ----------------------------------------
    タイプ AAAA のレコードがありません


    pollux-lb
    ----------------------------------------
    レコード名 . . . . . . . : pollux-LB
    レコードの種類 . . . . . : 1
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 4
    セクション . . . . . . . : 回答
    A (ホスト) レコード. . . : 10.20.30.20


    castor-lb.hyperv.storage
    ----------------------------------------
    レコード名 . . . . . . . : castor-LB.hyperv.storage
    レコードの種類 . . . . . : 5
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    CNAME レコード . . . . . : castor-LB


    3.0.0.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.f.f.ip6.arpa
    ----------------------------------------
    名前が存在しません。


    0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.f.0.0.0.0.0.e.ip6.arpa
    ----------------------------------------
    名前が存在しません。


    10.30.20.10.in-addr.arpa
    ----------------------------------------
    レコード名 . . . . . . . : 10.30.20.10.in-addr.arpa.
    レコードの種類 . . . . . : 12
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    PTR レコード . . . . . . : castor-LB


    pollux.hyperv.local
    ----------------------------------------
    レコード名 . . . . . . . : pollux.hyperv.local
    レコードの種類 . . . . . : 5
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    CNAME レコード . . . . . : pollux


    255.11.168.192.in-addr.arpa
    ----------------------------------------
    名前が存在しません。


    88.190.89.13.in-addr.arpa
    ----------------------------------------
    名前が存在しません。


    pollux-lb.hyperv.storage
    ----------------------------------------
    レコード名 . . . . . . . : pollux-LB.hyperv.storage
    レコードの種類 . . . . . : 5
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    CNAME レコード . . . . . : pollux-LB


    wpad
    ----------------------------------------
    名前が存在しません。


    castor
    ----------------------------------------
    レコード名 . . . . . . . : CASTOR.hyperv.local
    レコードの種類 . . . . . : 28
    Time To Live  . . . . . .: 1200
    データの長さ . . . . . . : 16
    セクション . . . . . . . : 質問
    AAAA レコード. . . . . . : fe80::44bd:9b3e:3650:52aa


    castor
    ----------------------------------------
    レコード名 . . . . . . . : CASTOR.hyperv.local
    レコードの種類 . . . . . : 1
    Time To Live  . . . . . .: 1200
    データの長さ . . . . . . : 4
    セクション . . . . . . . : 質問
    A (ホスト) レコード. . . : 192.168.11.231


    レコード名 . . . . . . . : CASTOR.hyperv.local
    レコードの種類 . . . . . : 1
    Time To Live  . . . . . .: 1200
    データの長さ . . . . . . : 4
    セクション . . . . . . . : 質問
    A (ホスト) レコード. . . : 10.20.30.10


    12.11.168.192.in-addr.arpa
    ----------------------------------------
    名前が存在しません。


    253.29.221.111.in-addr.arpa
    ----------------------------------------
    名前が存在しません。


    255.30.20.10.in-addr.arpa
    ----------------------------------------
    名前が存在しません。


    231.11.168.192.in-addr.arpa
    ----------------------------------------
    レコード名 . . . . . . . : 231.11.168.192.in-addr.arpa.
    レコードの種類 . . . . . : 12
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    PTR レコード . . . . . . : castor


    232.11.168.192.in-addr.arpa
    ----------------------------------------
    レコード名 . . . . . . . : 232.11.168.192.in-addr.arpa.
    レコードの種類 . . . . . : 12
    Time To Live  . . . . . .: 86400
    データの長さ . . . . . . : 8
    セクション . . . . . . . : 回答
    PTR レコード . . . . . . : pollux
```

```
C:\Users\Administrator>nbtstat -R
    NBT リモート キャッシュ ネーム テーブルを正常に削除し、事前に読み込みました。

C:\Users\Administrator>nbtstat -A 10.20.30.20

StorageNetwork:
ノード IP アドレス: [10.20.30.10] スコープ ID: []

           NetBIOS リモート コンピューター ネーム テーブル

       名前               種類         状態
    ---------------------------------------------
    POLLUX         <00>  一意          登録済
    POLLUX         <20>  一意          登録済
    WORKGROUP      <00>  グループ        登録済

    MAC アドレス = 00-25-90-2D-80-B7


vEthernet (ExternalShared):
ノード IP アドレス: [192.168.11.231] スコープ ID: []

    ホストが見つかりませんでした。

C:\Users\Administrator>nbtstat -a 10.20.30.20

StorageNetwork:
ノード IP アドレス: [10.20.30.10] スコープ ID: []

           NetBIOS リモート コンピューター ネーム テーブル

       名前               種類         状態
    ---------------------------------------------
    POLLUX         <00>  一意          登録済
    POLLUX         <20>  一意          登録済
    WORKGROUP      <00>  グループ        登録済

    MAC アドレス = 00-25-90-2D-80-B7


vEthernet (ExternalShared):
ノード IP アドレス: [192.168.11.231] スコープ ID: []

    ホストが見つかりませんでした。
```

んごっ。

##つまりこういうこと?

1. 俺:IPアドレスで共有を開く(今回は10.20.30.20)
2. CASTOR:IPアドレスをアドレスではなく名前`10.20.30.20`としてDNSに問い合わせ。そんなドメインは無い。
3. CASTOR:名前`10.20.30.20`としてNetBIOSブロードキャスト。(`nbtstat -a 10.20.30.20`的な)
4. POLLUX:元気よくお返事 **｢ぼくPOLLUX!!｣**(Macアドレスはストレージ側のものを返す)
5. CASTOR:違う名前が返ってきたので改めてDNS(キャッシュ)に問い合わせ。
6. DNS:｢そのサーバーは192.168.11.232だな!｣
7. CASTOR:なるほど!

なるほどじゃねぇよ!

# 結論

+ 面倒臭がらずNICごとに違うNETBIOS名を持つfqdnを振って混同されないようにしよう
+ IPアドレスで叩けば素直に使ってくれると思ったら大間違いだ。
+ 大間違いなのは大間違いだろう