由 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 中了!

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””