Stateless と Stateful の狭間

IPv6 アドレスの stateless な自動設定に関する RFC は 2014 年 4 月現在、4862 です。

RFC 4862 - IPv6 Stateless Address Autoconfiguration

ところが、RFC の中に明示的に stateful な自動設定に関して記述しているものは見つかりませんでした。強いていうと、DHCPv6 は 3315 です。

http://tools.ietf.org/html/rfc3315

RFC 4862 のタイトルは明確に「IPv6 Stateless Address Autoconfiguration」と言っているのとは対照的です。しかし、RFC 4862 をよく読むと、こう書かれています。

Major clarifications:

(中略)

Avoided the wording of "stateful configuration", which is known to be quite confusing, and simply used "DHCPv6" wherever appropriate.

「"stateful な設定"という言葉は、ちょっと混乱を招くので、"DHCPv6" に置き換えた」ということのようです。あれこれ調べ回っていると、下記の記事では、自動設定の形式として「Stateless Configuration」「Stateful Configuration」「Both Configurations」の3つがある、という書き方をしています。

How to configure IPv6 address in Windows

どうも、単純に stateless、stateful の2つに分割できる話じゃなさそうです。

autonomous address-configuration flag

今の目標は、

  • グローバルなアドレスは、RA による自動構成まかせ。
  • ULA は、DHCPv6 からのアドレスのみで、一時アドレスを作らないようにする。

です。DHCPv6 を使うときの RA の設定で、M フラグや O フラグは RA 全体に対するフラグで、プレフィックス毎に設定する物ではありません。

じゃぁ、プレフィックス毎に何か設定できる事はないか、と思い、かつて、おうちサーバで動かしていた radvd の設定ファイルを眺めていると、「AdvAutonomous」という設定項目がありました。

radvd.conf(5) - Linux man page

AdvAutonomous on|off
When set, indicates that this prefix can be used for autonomous address configuration as specified in RFC 4862.
Default: on

「セットされていれば、このプレフィクスが RFC 4862 で定義されている自立的なアドレス設定に利用できる事を意味する」とあります。

RFC 4862 を読み返すと、「4. Protocol Overview」にこのような記述があります。

One Prefix Information option field, the "autonomous address-configuration flag", indicates whether or not the option even applies to stateless autoconfiguration

プレフィックスが stateless な自動構成を適用するかどうかを表すオプションだと言っています。また、「5.5 Creation of Global Addresses」の「5.5.3 Router Advertisement Processing」では、

a) If the Autonomous flag is not set, silently ignore the Prefix Information option.

autonomous フラグがセットされていなかったら、そのプレフィックス情報は黙って無視する(つまり、アドレスを作らない)と書かれています。

どうも、このフラグが肝となりそうです。このフラグが off なら、stateless な自動構成アドレスの対象から外され、その結果、一時アドレス(stateless な自動構成アドレスの一種)も作られないのではないか。

NVR500 だと、「ipv6 prefix」にある「a_flag」が該当するので、

ipv6 prefix 2 fdfe:dcba:9876:5432::/64 a_flag=off

としてみます*1

すると、見事に

  • グローバルなアドレスは、MAC アドレスから生成されたアドレスと一時アドレスの2つ。
  • ULA は DHCPv6 から払い出されたアドレスの1つ。

という構成になりました。

stateless の本当の意味

RFC 4862 は stateless なアドレスの自動構成に関して書いています。で、RA のプレフィックス情報に含まれる "autonomous address-configuration flag" が on でないと、そもそも自動構成の対象とせずに無視される、という事が書かれています。

という事は、stateless なアドレスの自動構成は、

  • RA の M フラグが off
  • RA のプレフィックス情報で "autonomous address-configuration flag" が on

という、2つの条件を満たす必要がある、という事になります。この2つのフラグはともにデフォルトで、自動構成が行われる値(M フラグは off、"autonomous address-configuration flag" は on)なので、結果的に「RA だけがある状態なら stateless」ということになります。

ところが...

割り当てられるアドレスは狙ったとおりになりました。しかし、おうちサーバへの接続には、まだ問題が...。ということで、まだ話は続きます。

*1:引き続き、ULA のプレフィックスを fdfe:dcba:9876:5432::/64 としています。