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,似乎還沒有支援!

 

關閉/啟用 IPv6 臨時位址 (temporary address, privacy extensions)

IPv6 環境已經沒有 NAT 這回事了(至少目前是這樣),使用 global IPv6 位址連上 internet 之後,就可以與其他人互通。

一般來說 IPv6 位址 (128 bits) 由 Prefix 和 Interface ID 所組成。 Prefix 可視為網路編號,因此除非網路改號,否則是不變的。而 Interface ID 一般是用 EUI-64 的方法,參照 MAC 位址來產生的,所以只要是利用同一張網路卡,其 Interface ID 也就不會變。

因此,雖然 IPv6 在 internet 直接互連可以增加效率、非常便利,但一直使用相同的位址,很容易被壞人盯上。所以 RFC 4941 定義了 IPv6 Privacy Extension,讓 IPv6 host 可以隨機產生 Interface ID,定期更換,以提高安全性。這樣的位址又有人稱為臨時位址 (temporary address)。

因此,雖然 RFC 裡面建議預設不要啟動,但常用的作業系統 (Windows, Mac, Linux) 都會優先使用臨時位址連線。

繼續閱讀 “關閉/啟用 IPv6 臨時位址 (temporary address, privacy extensions)”

IPv6 Unique Local Address

在多次的演講與簡報中,發現大家還不是很熟悉 IPv6 的私有位址概念。一些很早開始接觸 IPv6 的人只知道 IPv6 site-local 位址就是 IPv6 版本的 RFC1918。殊不知,site-local 位址因為有太多的缺點已經被捨棄了。新版本的私有位址我們稱為 Unique Local Address

為什麼要叫做 “Unique Local Address”呢?因為:一、這些位址只在本地(local/isolated)網路才是唯一。二、不用 “private” 是因為 private 一詞用來描述 routing 的範圍。

那麼 Unique Local Address (ULA) 和 IPv4 RFC1918 有什麼相同或是不一樣的地方?

就如同 RFC 1918 規定了 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 三個 private 網路 prefix , IANA 也規定了 ULA 的 prefix 編號:FC00::/7。

其位址格式如下:

ULA Address Format

若再加上 L-bit,那麼 ULA 就分成兩部分:FC00::/8 與 FD00::/8。這兩個 prefix 有著不同的使用方式。

IPv4 RFC 1918 強調的是,既然是 private address,任何人都可以隨意使用不需註冊,但這些網段不能進入 global internet routing。

FC00::/8 的 ULA 網路,當然也不能參與 global routing,但是,仍然需要註冊(上圖 “Global ID” 欄位內的數值),以維持獨特性 (unique)。由於是需要註冊,所以這類的網路位址是可以放在 global DNS 裡面的。雖然有各種註冊管理的方法被提出,到目前為止還沒有得到共識,因此這個 prefix 目前並沒有使用的意義。

相反的,FD00::/8 的 ULA 網路,”Global ID” 欄位中的數字可以任意設定,不需註冊。但是 RFC 中仍然建議使用亂數隨機的方法產生,以避免與其他網路衝突。也許有人會問,既然都是設定給私有網路,為什麼還要怕衝突?在目前 IPv4 環境中,時常聽到公司合併後位址衝突,而產生極大的困擾。因此如果能夠依循 RFC 所建議的方法,盡量產生不會衝突的網路號碼,就可以避免如此的困擾。

建議的演算法:trunc( SHA-1( local time . local EUI-64 ), 40bits)

如果需要使用這樣的方法來產生 prefix 的話,可以不用自己寫程式算,直接到 SixXS 的網頁輸入相關資料,就會產生專屬的 prefix。產生之後,還可以在上面註冊(非正式)以避免與別人衝突。

另外,因為不需要註冊,無法完全避免衝突,所以 FD00::/8 的網路,不能放在 Global DNS 中,當然也不能放入 global routing 中了!

IPv6 如何決定封包送到 router 還是本地網路?(IPv6 on-link determination)

研究所一年級上學期時修了一門恩師的“電腦網路”,第一次考試裡面有一題到現在還記憶猶新的考題:使用瀏覽器連線到台大網站時,電腦(網路)做了哪些事?

在知道連線目的端的 IP 位址 (DST) 後,電腦必須要知道 DST 是在本地還是遠端網路。如果是在本地網路,則必須使用 ARP 取得對方的 MAC 位址;如果是在遠端網路,則必須先將封包送到 Router 去,由 Router 轉送 (當然要先使用 ARP 取得 router 的 MAC 位址)。

但是,電腦怎麼知道 DST 是在本地網路還是遠端網路呢?IPv4 是利用 netmask 與 DST 做 AND 運算,再與自己的網路位址做比對,以決定是否在本地網路。(參閱 RFC 1122)

IPv6 不是這樣子做的!網路是不是本地端,與 IP 位址(還有 netmask) 是沒有關係的。

IPv6 預設只將 link-local 網段 (FE80::/10) 視為本地網路。那麼,IPv6 要怎麼判斷 DST 是否在本地網路呢?

當 IPv6 hosts 利用 Router Advertisement 取得有效 prefix 資訊的時候,如果 Prefix Information Option (PIO) 的欄位裡面的 L-bit (on-link) 為 1,那麼該 prefix 就是本地網路 (on-link)。而這個 prefix 就會被加入或更新 IPv6 的 Prefix List。所以 IPv6 hosts 的 Prefix List,其實就是記錄有哪些 prefix 是本地端的。當然,這個 Prefix List 也可以手動設定。

如果封包目的地 MAC 位址不存在於 Neighbor Table (等同於 IPv4 的 ARP Table),目的地也是屬於本地網路 (on-link prefix),IPv6 hosts 便會開始 address resolution (NS/NA),以求得對方的 MAC 位址。其他的,IPv6 hosts 會將封包送到 default router 轉送。如果 hosts 沒有 default router,就會產生 Neighbor Unreachable 的訊息。

詳細做法請參閱 RFC 5942

Surprise! DHCPv6 不會做的事

IPv4 的 DHCP 位址發放與 DHCPv6 有著很大的不同。下面就列出一些 DHCPv6 讓人意想不到的地方。

  • 不再只是 DORA 模式(Discover, Offer, Request, Acknowledgement)

不管是 SLAAC (Stateless Address Autoconfigure) 或是 DHCPv6,IPv6 host 的介面需要取得位址時,都會先送出 Router Solicitation (RS) 訊息,接著 Router 會回覆 Router Advertisement (RA)。

如果 RA 回覆必須使用 DHCPv6 取得位址 (RA 的 M-bit 為 1 ),才會開始啟動 DORA 四步驟。

值得一提的是,在 IPv4 DHCP 中,DORA 四步驟是不能避免的,初學者往往會覺得很疑惑,為什麼不使用後面的兩個步驟(Request, Acknowledgement)就好呢?

事實上,IPv6 確實存在這樣的選項:Rapid Commit。Client 端與 server 端都啟動 Rapid Commit 之後,就可以使用兩步驟 (Solicit, Reply) 取得 IPv6 位址。Cisco IOS 對於 Rapid Commit 的設定方法如下:

Server:  Router(config-if)#ipv6 dhcp server poolname rapid-commit

Client:  Router(config-if)#ipv6 dhcp client pd prefix-name rapid-commit

  • DHCPv6 並不會給 prefix length

IPv4 DHCP 會提供 subnet mask 的資訊,但 DHCPv6 並不會。Prefix length (subnet mask) 的訊息放在 RA 中 “prefix information” 內的 “prefix length” 欄位

  • DHCPv6 並不會給 default gateway 位址

IPv6 hosts 的 default router 位址並不是由 RA 訊息或 DHCPv6 訊息提供的。當收到 RA 訊息時,IPv6 hosts 會取得封包的來源地 IPv6 位址。由於 RA 訊息的來源地位址一定是 link local 位址,所以 IPv6 hosts 的 default router 位址就當然一定會是 link local 位址啦!

讓用戶端只用 DHCPv6 的位址:IPv6 Prefix "no-autoconfig"

當 Router 的 M-bit (DHCPv6) 設為 1 後,用戶端除了會向 DHCPv6 Server 取得一個位址以外,仍然會使用 RA 所給的 Prefix 生成一個 SLAC 位址(Windows 與 Mac 會再生一個 privacy extension 的位址),總共取得/生成兩個 IPv6 位址(Windows 與 Mac 為三個)。Mac OS 的例子如下: 繼續閱讀 “讓用戶端只用 DHCPv6 的位址:IPv6 Prefix "no-autoconfig"”

最簡易的 IPv6 環境設定— stateless DHCPv6 (使用 IOS DHCPv6 server)

要建立 IPv6 的網路,第一個問題便是如何讓用戶端取得 IPv6 的各項位址資訊。當然最簡單的就是 IPv6 autoconfiguration 了。

用戶端設備雖然可以透過 Router 的 RA (Router Advertisement) 取得 IPv6 prefix、Gateway 位址,但是最重要的 DNS 位址卻沒有,也無法透過 RA 取得。 繼續閱讀 “最簡易的 IPv6 環境設定— stateless DHCPv6 (使用 IOS DHCPv6 server)”

IPv6 位址的取得 (Autoconfiguration and DHCPv6)


和 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。