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