和 IPv4 相同,介面的 IPv6 位址可以是手動設定(static)或是自動設定。

手動設定沒什麼好說的。這篇文章要講的是自動設定的種類與方法。

在 IPv6 的環境裡,Router 的介面會定期的使用 multicast 發出 Router Advertisement (RA)。

這個 RA 包含了這個網路(網段)的 ipv6 prefix 資訊。

如果我們把介面設定成 IP 位址自動設定(autoconfiguration),電腦的網路卡收到 RA 之後,會利用這個 Prefix 再加上網路卡的 Interface ID (通常是使用 EUI-64 來取得) 組合成 128 bits 的 IPv6 位址。

But wait! 只有 IPv6 位址和 default gateway,上網會寸步難行吧。至少還需要 DNS server 的位址啊!

如果我們來看 Router Advertisement 的格式 (RFC 4861) ,你會發現,RA 真的只會給 IPv6 prefix 而已。但是,如何讓電腦順利的上網呢?

我們把 RA 的格式拿出來看:

raformat

紅框的地方,叫做 Router Advertisement Option (上圖為舊的資訊,最新的定義在 RFC5175,不過上圖足以解釋本文)。我們要看的就是其中的 M bit 與 O bit。

M: Managed Address Configuration 這個 bit 如果是 1,代表要請電腦另外再去跟 DHCPv6 要 IPv6 Prefix

O: Other Configuration 這個 bit 如果是 1,代表請電腦去跟 DHCPv6 要 DNS 等等資訊。

我們常聽到的 stateful DHCPv6 與 stateless DHCPv6,就是由 M bit 與 O bit 的組合不同而來的。

  1. M=1, O=0 or 1: 所有資訊(包括 Prefix、DNS等等資訊)都請電腦使用 DHCPv6 取得。(Stateful DHCPv6)
  2. M=0, O=1: 使用 RA 裡面的 Prefix,但是 DNS 等等資訊請電腦使用 DHCPv6 取得。(Stateless DHCPv6)
  3. M=0, O=0: 電腦將只得到 Prefix,無法取得 DNS 等資訊。(Stateless autoconfiguration)

所謂的 stateful 就是必須要由 server 去動態維護、保留其對應狀態的資訊。會有這種需求的,就是 IPv6 位址的指派、對應。

而 stateless 則是不須動態維護的資訊,如 DNS 等資訊,因為這些不會動態改變,都是固定的資訊。

所以當 prefix 由 DHCPv6 來提供的時候,因為 DHCPv6 server 會有對應表(binding table),所以這種就叫 stateful DHCPv6。

而如果 prefix 是由 router 提供,因為 router 不會留存這個 binding table,所以這種方式就叫做 stateless autoconfiguration or stateless DHCPv6。

那麼,Cisco IOS 如何設定 M bit 與 O bit 呢(也就是如何選擇 stateful DHCPv6/stateless DHCPv6/stateless autoconfiguration)?

設定 M bit:

Router(config-if)# ipv6 nd managed-config-flag

設定 O bit:

Router(config-if)# ipv6 nd other-config-flag

至於,有沒有方法不須 DHCPv6 直接從 RA 裡得到 DNS 資訊?有,不過目前(Oct. 2009)還不是標準,請參見 RFC5006。在 router 端,Linux/BSD上的 radvd (Router Advertisement Deamon)有支援 RFC 5006。在 client 端,ndisc6 裡的 rdnssd 有支援 RFC5006。不過,我都沒有試過。Cisco/Juniper 也都尚未支援 RFC5006。