Windows 10 Creators Update のRDNSS (RFC6106) クライアント機能

# サマリ

Windows 10 ビルド 15063 (Creators Update) に、RFC6106 RDNSS, DNSSL のクライアント機能が載っていた。MicrosoftがAPNIC blogにポストした記事で Windows10のDHCPv6, RAでのIPv6アドレスおよびDNS設定まわりの動作[[1]](#参考文献)の状況を解説していたが、実装が出てきたものと思われる。なお、RFC6106はすでにobsolutedで、最新仕様はRFC8106。[[2]](#参考文献)に差分が解説されている。 

# やってみた

## 環境

- ルータ: Ubuntu 16.04 + radvd
- ノード: Windows 10 Pro ビルド 15063 (Creators Update)

IPv6 only (DHCPv4サーバなし) でRA+prefix information optionで/64のprefixを１つ広告しつつ、DNSサーバ(3つ)、サフィックスリスト(2つ)を配布。

````
+-----------------+                          +-------------------+
|                 |ens33            Ethernet0|                   |
|  Ubuntu 16.04   *--------------------------* Windows 10 (15063)|
|    (ルータ)      |    2001:db8:0:1::/64     |     (ノード)        |
+-----------------+                          +-------------------+
                  RA ---> 
                   +PIO 2001:db8:0:1::/64
                   +RDNSS 2001:db8::53:{1,2,3} (３つ)
                   +DNSSL example.com example.jp (２つ)
```

## ルータ側の設定

```
# /etc/radvd.conf

interface ens33
{
        AdvSendAdvert on;
        prefix 2001:db8:0:1::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
        };

        RDNSS 2001:db8::53:1 2001:db8::53:2 2001:db8::53:3 {
                # AdvRDNSSLifetime infinity
                #                  Default: 2*MaxRtrAdvInterval

                # FlushRDNSS on|off
                #            Default: on
        };

        DNSSL example.com example.jp {
                # AdvRDNSSLifetime infinity
                #                  Default: 2*MaxRtrAdvInterval

                # FlushRDNSS on|off
                #            Default: on
        };
};
```


## ノード側の Windows 10 の動き

netshで確認できるインターフェイスの設定項目に

```
RA ベースの DNS 構成 (RFC 6106)     : enabled
DHCP/静的 IP の共存                : enabled
```

２つの設定項目が増えており、RFC6106はデフォルトでONになっていた。

```
PS C:\> netsh int ipv6 show interfaces interface=Ethernet0 level=verbose

インターフェイス Ethernet0 パラメーター
----------------------------------------------
IfLuid                             : ethernet_32769
IfIndex                            : 5
状態                               : connected
メトリック                         : 25
リンク MTU                         : 1500 バイト
到達可能な時間                     : 24500 ミリ秒
基本の到達可能な時間               : 30000 ミリ秒
再転送間隔                         : 1000 ミリ秒
DAD 転送                           : 1
サイト プレフィックスの長さ        : 64
サイト ID                          : 1
転送                               : disabled
アドバタイズ                       : disabled
近隣探索                           : enabled
近隣到達不可能性検出               : enabled
ルーター発見                       : enabled
管理されたアドレス構成             : disabled
その他のステートフル構成           : disabled
脆弱なホストによる送信             : disabled
脆弱なホストによる受信             : disabled
自動メトリックの使用               : enabled
既定ルートを無視                   : disabled
アドバタイズされたルーターの有効期間: 1800 秒
既定ルートのアドバタイズ           : disabled
現在のホップ制限                   : 64
ARPND スリープ解除パターンの強制   : disabled
指定の MAC スリープ解除パターン    : disabled
ECN 機能                           : application
RA ベースの DNS 構成 (RFC 6106)    : enabled
DHCP/静的 IP の共存         : enabled
```

### RDNSS, DNSSL 入りRAを受信する

状態確認のコマンドをそれぞれ動かしてみる。

- ipconfig /all
- netsh int ipv6 show dnsservers
- Get-DnsClient (PowerShellのコマンドレット)
- Get-DnsClientServerAddress (PowerShellのコマンドレット)

```
PS C:\> ipconfig /all

Windows IP 構成

   ホスト名. . . . . . . . . . . . . . .: TESTENV
   プライマリ DNS サフィックス . . . . .: TESTENV.JP
   ノード タイプ . . . . . . . . . . . .: ハイブリッド
   IP ルーティング有効 . . . . . . . . .: いいえ
   WINS プロキシ有効 . . . . . . . . . .: いいえ
   DNS サフィックス検索一覧. . . . . . .: TESTENV.JP
                                          example.com
                                          example.jp

イーサネット アダプター Ethernet0:

   接続固有の DNS サフィックス . . . . .: example.com
   説明. . . . . . . . . . . . . . . . .: Intel(R) 82574L Gigabit Network Connection
   物理アドレス. . . . . . . . . . . . .: 00-0C-29-80-6D-5A
   DHCP 有効 . . . . . . . . . . . . . .: はい
   自動構成有効. . . . . . . . . . . . .: はい
   IPv6 アドレス . . . . . . . . . . . .: 2001:db8:0:1:a4bf:fbd5:49c6:33e8(優先)
   一時 IPv6 アドレス. . . . . . . . . .: 2001:db8:0:1:7d8d:b0c9:2421:a5a4(優先)
   リンクローカル IPv6 アドレス. . . . .: fe80::a4bf:fbd5:49c6:33e8%5(優先)
   自動構成 IPv4 アドレス. . . . . . . .: 169.254.51.232(優先)
   サブネット マスク . . . . . . . . . .: 255.255.0.0
   デフォルト ゲートウェイ . . . . . . .: fe80::20c:29ff:fe0d:8de%5
   DHCPv6 IAID . . . . . . . . . . . . .: 33557545
   DHCPv6 クライアント DUID. . . . . . .: 00-01-00-01-1D-A0-E0-6A-00-0C-29-80-6D-5A
   DNS サーバー. . . . . . . . . . . . .: 2001:db8::53:1
                                          2001:db8::53:2
                                          2001:db8::53:3
   NetBIOS over TCP/IP . . . . . . . . .: 有効
   接続固有の DNS サフィックス検索の一覧:
                                          example.com
                                          example.jp
```

```
PS C:\> netsh int ipv6 show dnsservers

インターフェイスの構成 "Ethernet0"
    DHCP で構成された DNS サーバー:  2001:db8::53:1
                                          2001:db8::53:2
                                          2001:db8::53:3
    次のサフィックスで登録します:           プライマリのみ
```

```
PS C:\> Get-DnsClient

InterfaceAlias               Interface ConnectionSpecificSuffix ConnectionSpecificSuffix RegisterThisConn UseSuffixWhen
                             Index                              SearchList               ectionsAddress   Registering
--------------               --------- ------------------------ ------------------------ ---------------- -------------
Ethernet0                            5 example.com              {example.com, example... True             False
```

```
PS C:\> Get-DnsClientServerAddress

InterfaceAlias               Interface Address ServerAddresses
                             Index     Family
--------------               --------- ------- ---------------
Ethernet0                            5 IPv4    {}
Ethernet0                            5 IPv6    {2001:db8::53:1, 2001:db8::53:2, 2001:db8::53:3}
Bluetooth ネットワーク接続          14 IPv4    {}
Bluetooth ネットワーク接続          14 IPv6    {fec0:0:0:ffff::1, fec0:0:0:ffff::2, fec0:0:0:ffff::3}
Loopback Pseudo-Interface 1          1 IPv4    {}
Loopback Pseudo-Interface 1          1 IPv6    {fec0:0:0:ffff::1, fec0:0:0:ffff::2, fec0:0:0:ffff::3}
```

## アダプタ設定で値をセットする際のパラメータ

Creators Update で増えていたのは２つ

```
取りうる設定値はenabled, disabledの２値
     [[rabaseddnsconfig=]enabled|disabled]
     [[dhcpstaticipcoexistence=]enabled|disabled]

rabaseddnsconfig - RA ベースの DNS 構成 (RFC 6106) が有効になっているか
                      どうかを示します。
dhcpstaticipcoexistence - DHCP と静的 IP の共存が有効になっているかどうかを示します。
```

```
PS C:\> netsh int ipv6 set interface help

使用法: set interface [interface=]<文字列> [[forwarding=]enabled|disabled]
     [[advertise=]enabled|disabled] [[mtu=]<整数>]
     [[siteprefixlength=]<整数>]
     [[nud=]enabled|disabled] [[basereachabletime=]<整数>]
     [[retransmittime=]<整数>] [[dadtransmits=]<整数>]
     [[routerdiscovery=]enabled|disabled|dhcp]
     [[managedaddress=]enabled|disabled]
     [[otherstateful=]enabled|disabled]
     [[weakhostsend=]enabled|disabled]
     [[weakhostreceive=]enabled|disabled]
     [[ignoredefaultroutes=]enabled|disabled]
     [[advertisedrouterlifetime=]<0-65535>]
     [[advertisedefaultroute=]enabled|disabled]
     [[currenthoplimit=]<0-255>] [[store=]active|persistent]
     [[forcearpndwolpattern=]enabled|disabled]
     [[enabledirectedmacwolpattern=]enabled|disabled]
     [[ecncapability=]ecndisabled|ect1|ect0|application]
     [[rabaseddnsconfig=]enabled|disabled]
     [[dhcpstaticipcoexistence=]enabled|disabled]

パラメーター:

   タグ                値
   interface        - インターフェイス名またはインデックスです。
   forwarding       - このインターフェイスに届いたパケットを他の
                      インターフェイスに転送できるかどうかを示します。
   advertise        - ルーター アドバタイズがこのインターフェイスに送信
                      されるかどうかを示します。既定は disabled です。
   mtu              - このインターフェイスの MTU です。
                      既定はリンクのナチュラル MTU です。
   metric           - インターフェイス上のすべてのルート用にルート
                      メトリックに追加された、インターフェイス
                      メトリックです。
   siteprefixlength - サイトのグローバル プレフィックスの既定の長さです。
   nud              - 近隣の到達不可能性検出が有効かどうかを示します。
                      インターフェイスの種類により既定値は異なります。
   basereachable    - 基本の到達可能時間です (ms)。
   retransmittime   - 再転送時間です (ms)。
   dadtransmits     - 重複アドレス検出の転送数です。
   routerdiscovery  - 有効、無効、または DHCP による制御に設定できます。
   managedaddress   - 管理されたアドレス構成が有効かどうかを示します。
                      このパラメーターを設定しても、ルーター発見が有効
                      でアドバタイズが無効なインターフェイスには影響は
                      ありません。この場合、パラメーターはルーター発見
                      により制御されます。
   otherstateful    - その他のステートフルな構成が有効かどうかを示し
                      ます。このパラメーターを設定しても、ルーター発見
                      が有効でアドバタイズが無効なインターフェイスには
                      影響はありません。その場合、パラメーターは
                      ルーター発見により制御されます。
   weakhostsend     - 脆弱なホストの送信が有効かどうかを示します。
   weakhostreceive  - 脆弱なホストの受信が有効かどうかを示します。
   ignoredefaultroutes- インターフェイス上の既定ルートを無視します。
                      既定値: Disabled
   advertisedrouterlifetime- ルーターの有効期間です (秒単位)。
                      既定値は 1800 です。
   advertisedefaultroute- インターフェイスが既定ルーターとしてアドバタイズ
                      されるかどうかを示します。
   currenthoplimit  - 送信トラフィックのホップ制限です。
   store            - active: 設定は次の起動時までしか適用されません。
                      persistent: 設定は固定されます。
   forcearpndwolpattern- アドレス解決と近隣探索のパケット パターンが
                      コンピューターのスリープを解除するように
                      構成されているかどうかを示します。
   enabledirectedmacwolpattern - 指定の MAC パケット パターンが
                      コンピューターのスリープを解除するように
                      構成されているかどうかを示します。
   ecncapability    - 発信パケットが ECN でマークされるかどうかを示します。
   rabaseddnsconfig - RA ベースの DNS 構成 (RFC 6106) が有効になっているか
                      どうかを示します。
   dhcpstaticipcoexistence - DHCP と静的 IP の共存が有効になっているかどうかを示します。

注釈: インターフェイス構成パラメーターを変更します。

例:

       set interface "1" metric=2 forwarding=enabled store=active
```

# 参考文献
[1] IPv6-only at Microsoft, APNIC blog, 2017.01.19, 
https://blog.apnic.net/2017/01/19/ipv6-only-at-microsoft/
[2] RFC 8106によってRFC 6106が廃止に, Geekなページ, 2017.03.21, http://www.geekpage.jp/blog/?id=2017-3-21-1