DHCPv6 登場

IPv6 アドレスの自動割り当ては、

  • RA による stateless
  • DHCPv6 による statesful

の2つがあるのは、IPv6 の解説には必ず登場する有名な話です。で、DHCPv6 を使って stateful な IPv6 アドレスの割り当てをする場合、RA の M フラグと O フラグを設定する事も、様々な解説で登場します。ちなみに M フラグ、O フラグのそれぞれの意味は、

M フラグ
Management の M で、アドレスを管理(Management)する事を意味する。
O フラグ
Other の O で、アドレス以外の情報(DNS サーバのアドレス等)を提供する事を意味する。

で、実際にアドレスを管理したり、アドレス以外の情報を提供するのが DHCPv6 サーバ、という事になります。RA を受信したホストは、受信した RA の情報で M フラグが on になっていたら、DHCPv6 サーバからアドレスの割り当てを受ける、O フラグが on だったら、DHCPv6 から DNS サーバのアドレス等を取得する、という挙動をすることになります*1

で、このときにふと気になったのは、前回の段階では、ルータの RA にグローバルなアドレスのプレフィックスと ULA のプレフィックスを広告する様に設定していますが、問題になったのは、

  • グローバルなアドレスは一時アドレスを使う。
  • ULA は一時アドレスを使わない。

と、2つのプレフィックスで違うポリシーでアドレスを割り当てたい、ということでした。で、グローバルなアドレスは今まで通りでよく、ULA のプレフィックスだけ、DHCPv6 でコントロールできないか、という発想だったのですが、ルータのマニュアルをどう読んでも、先の M フラグ、O フラグをプレフィックス毎に設定できません。

実際に、RA のパケットをキャプチャしてみると、一つの RA の中に2つのプレフィックス情報があり、M フラグ、O フラグは、そのプレフィックス情報の外側にあるので、RA の仕様として、プレフィックス毎にこれらのフラグを使い分ける事ができないことが分かりました。

で、しょうがないので、

  • M フラグ、O フラグを on にする。
  • だけど、広告する2つのプレフィックスのうち、DHCPv6 サーバが提供しているのは片方(当然、ULA のプレフィックス)。
  • 結果、ULA の方は DHCPv6 から割り当てられるけど、グローバルな方は、仕方なく、自動構成アドレスになる。

という挙動を期待するしかありません。

実際に設定してみる

実際に、M フラグ、O フラグを on にした NVR500 の設定は、こんな感じになります*2

ipv6 prefix 1 dhcp-prefix@lan2::/64
ipv6 prefix 2 fdfe:dcba:9876:5432::/64
ipv6 lan1 address dhcp-prefix@lan2::1/64
ipv6 lan1 address fdfe:dcba:9876:5432::1/64
ipv6 lan1 rtadv send 1 2 m_flag=on o_flag=on

前回との違いは「m_flag=on o_flag=on」が付いている部分です。

DHCPv6 サーバの方は、おうちサーバの CentOS で動かしました。/etc/dhcp/dhcpd6.conf の主な内容は下記の通りです。

# T2, the delay before Rebind (if Renews failed)
#  (default is 3/4 preferred lifetime)
#  (set to 2 hours)
option dhcp-rebinding-time 7200;

# Enable RFC 5007 support (same than for DHCPv4)
allow leasequery;

# Global definitions for name server address(es) and domain search list
option dhcp6.name-servers fdfe:dcba:9876:5432::35;
option dhcp6.domain-search "july.example.com";

# Set preference to 255 (maximum) in order to avoid waiting for
# additional servers when there is only one
##option dhcp6.preference 255;

# Server side command to enable rapid-commit (2 packet exchange)
##option dhcp6.rapid-commit;

# The delay before information-request refresh
#  (minimum is 10 minutes, maximum one day, default is to not refresh)
#  (set to 6 hours)
option dhcp6.info-refresh-time 21600;

# The path of the lease file
dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases";

# The subnet where the server is attached
#  (i.e., the server has an address in this subnet)
subnet6 fdfe:dcba:9876:5432::/64 {
        # Two addresses available to clients
        #  (the third client should get NoAddrsAvail)
        range6 fdfe:dcba:9876:5432::1:1 fdfe:dcba:9876:5432::1:ffff;
}

CentOS Ver 6.5 に含まれる dhcp パッケージでは、/usr/share/doc/dhcp-4.1.1/dhcpd6.conf.sample というサンプルファイル*3があるので、これを参考にして /etc/dhcp/dhcpd6.conf を作成しました。

ポイントになるのは、まず、

  • option dhcp6.name-servers
  • option dhcp6.domain-search

で、これで DHCPv6 で渡す DNS サーバとドメイン名を定義しています。RA で O フラグを on にした時に、クライアントに渡される情報です。

あとは、

  • subnet6 fdfe:dcba:9876:5432::/64 { 〜

の部分で、ここで、DHCPv6 で割り当てるアドレスの範囲を指定します。RA で M フラグ on にしていると、subnet6 で指定されているプレフィックスと RA が広告するプレフィックスで一致する物があれば、DHCPv6 からアドレスが割り当てられることになるはずです。

結果は、あと一歩

この状態で PC を起動すると、

  • グローバルなアドレスは、RA による自動構成アドレス。
  • ULA のアドレスは、DHCPv6 サーバが割り当てるアドレス。

となる事が確認できました。ところが、予定外の事が一つありました。

グローバルなアドレスに関しては狙ったとおり、RA だけの時と何ら変わりありません。ところが、ULA は、

の2つのアドレスが割り当てられました。前回見つかった問題は、

  • 一時アドレスは、ダイナミック DNS の対象外
  • ソースアドレスとして一時アドレスが使われると、DNS 上には存在しないホストからの接続になる。
  • WindowsLinux の Kerberos 認証を使っていると、host プリンシパルの問題があるので、これでは都合が悪い。

という問題です。DHCPv6 を使っても、ULA の一時アドレスが使われるのであれば、問題は解決しません。

調べると、Windows で「そもそも、IPv6 の一時アドレスを使わない」という方法を推奨している記事を見かけます。

固定IPv6ができない?

上記の Technet フォーラムでの話は Windows 8 での話ですが、Windows 7 だと netsh コマンドで設定できるようです。

http://www.ipnet-lab.jp/post/2012/04/12/ipv6-ra-privacyaddress-disable.aspx

しかし、これだとグローバルなアドレスでも一時アドレスが付かなくなってしまいます。

先の Technet フォーラムでの回答には

Windows Vista / Windows Server 2008 以降の OS は、ステートレス RA 環境に置かれると、IPv6 アドレスを自動構成がデフォルト ON になっていますので、手動で IPv6 アドレスを設定しても、RA で自動構成された IPv6 アドレスも付いてしまいます。

とあります。DHCPv6 でアドレスが払い出されるプレフィックスは stateful ではないのか? と思うのですが、実際には一時アドレスが付いてしまいます。

う〜ん、どうしたものか... ということで次回に続きます。

*1:O フラグだけ on であれば、アドレス自体は RA に含まれるプレフィックスから自動構成で、DNS サーバのアドレス等は DHCPv6 サーバから受け取る、ということになります。その逆(アドレスは DHCPv6 だけど、DNS サーバ等は手動設定するとか、IPv4 まかせ)にするケースは、ほとんど無いかな。

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

*3:このサンプルファイル。おそらく、ISC のオリジナルパッケージに含まれている物をそのまま収録したものだと思いますが、RHEL / CentOSSELinux を有効にしている場合、dhcpv6-lease-file-name の指定をサンプルから変更しないと、リース状態を出力するファイルの書き込みに失敗するはずです。/var/lib/dhcpd の下に設定すれば、SELinux 有効で問題ありません。