IPv6 Router Preference 在 Mac OS 的運作

如果在同一個網路下有多個 Router 發出 Router Advertisement (RA),我們可以利用 Router Preference 來讓 host 知道 default router 的優先順序 (High, Medium, Low)。Cisco IOS 的指令是:

Router(config-if)#ipv6 nd router-preference High

我們在 Mac OS 上的 TCP/IP 網路設定裡面有看到,雖然有多台 Router 發出 RA,但似乎只出現一個 default router 的位址:

事實上,Mac OS 會正確處理 Router Preference 的,只要利用 ndp -r 這個指令,就可以顯示出所有收到的 default router 列表,並看到他們各自的優先等級:

實際送一個封包到 Google DNS (2001:4860:4860::8888),就可以看到,雖然第一個圖上的「路由器」指的是 fe80::72ca:9bff:fe9b:bb90,但由於它的 router preference 是 Low,所以 Mac OS 會將封包送往 fe80::f60f:1bff:fe26:de42 (MAC address: f4:0f:1b:26:de:42, router preference: High)

由 IPv6 Router Advertisement 直接指定 DNS Server 位址

在我的部落格中,最受歡迎的文章「IPv6 位址的取得 (Autoconfiguration and DHCPv6)」是在 2009 年寫的。過了八年之後,最近因緣際會,做了一些設定和除錯之後,發現有一些更新,所以就再寫一篇。

在這篇 2009 年的文章中提到,Router Advertisement (RA) 沒有辦法提供終端設備 DNS server 的位址,還必須依靠 DHCPv6 提供。在當時,雖然已有 RFC 5006 試著定義在 RA 裡面附上 DNS server 的位址,但仍然缺乏作業系統的支援。

事情有了變化,在 2017 年 3 月,RFC 5006 被 RFC 8106 (Recursive DNS Server, RDNSS)取代,並且進入了標準階段 (Standard Track),Cisco IOS 、Mac OS 也已經開始支援,Windows 10 在 2017 年的 Creators Update 也終於加入支援了,不過,Windows 10 會優先採用 DHCPv6 的參數。

RFC 8106 裡面定義的是如何在 RA 的 Option 裡面附上 DNS Server 的位址。其 Option 格式如下圖:

Type 是由 IANA 定義的 25。

Length 則是以 8 bytes 為單位的長度,最少為 3 (3 * 8 = 24 bytes,扣掉 Type 與 Length 各 1 byte,共 2 bytes,再扣掉 Lifetime 的 4 bytes,還有 Reserved 的 2 bytes,剛好剩下 16 bytes,可放一個 IPv6 位址)。

Lifetime 定義的是 DNS 的有效期,以秒為單位。內容全為 1 代表永不 timeout;全為 0 代表此 Option 中的 DNS Server 位址已失效。

至於 Cisco IOS 的設定,更是簡單:

Router(config-if)#ipv6 nd ra dns server 2001:4860:4860::8888

至於 Apple iOS 與 Google Android,似乎還沒有支援!