自從 FreeBSD 4.0之後,系統就已經內置對IPv6的支持了,FreeBSD的IPv6實現都基於KAME計劃。需要注意的是,並不是KAME計劃中的所有內容和最新更改都加入FreeBSD系統中,一些特性並沒有成為FreeBSD系統的一部分,但KAME可以完整的運行在FreeBSD系統中,事實上,他們的開發工作都是基於BSD Unix的,因此也可以下載他們的最新發布的代碼,得到更完整、但處於試驗目的的IPv6支持。
1) IPv6 支持 如果沒有因為定制系統取消 IPv6支持,FreeBSD已經支持IPv6,由於IPv6的自動配置特征,就為網絡界面設置了一個缺省地址。 $ ifconfig sis0 inet6 sis0: flags=8843 mtu 1500 inet6 fe80::2d0:9ff:fea3:49fa%sis0 prefixlen 64 scopeid 0x1 命令行中的 inet6就是表示IPv6地址,而地址形式為fe80::2d0:9ff:fea3:49fa%sis0,其中前綴fe80就是根據本地網絡界面設置的IPv6地址類型,而最後八個字節為根據本地網卡的有關參數生成的數據,對於以太網卡,這就是MAC地址,而%sis0定義了地址所在的網絡界面名字,這主要用於組播環境。後面的prefixlen定義了前綴長度,缺省情況下這種Ipv6地址使用64位前綴來區分網絡地址和節點地址。而使用MAC地址作為節點地址,就極大的減輕了網絡中地址分配的難題,簡化了管理工作。而scopeid是一個索引,對於這種基於網絡界面的地址用於表示網絡界面的序號。 上面的地址是最基本的 IPv6地址,它的前綴都是fe80,主要用於內部網絡之間的相互通信,如果需要和外部網絡進行通信,就比較困難了,因為這難以設置路由。更標准的辦法是為網絡界面手工設置IPv6地址,由於IPv6的特性,通常仍然保留原有的fe80地址用於本地網絡通信,而設置多個alias地址。 # ifconfig sis0 inet6 3ffe::12 prefixlen 48 如果網絡中有 IPv6路由器存在的話,就不需要手工配置IPv6地址,系統會自動從路由器中獲取網絡地址(網絡前綴),然後使用本地MAC地址填充,成為一個有效的、可路由的IPv6地址,這就是IPv6的自動配置功能,類似於IPv4網絡中的DHCP協議。 # ifconfig sis0 inet6 sis0: flags=8843 mtu 1500 inet6 fe80::2d0:9ff:fea3:49fa%sis0 prefixlen 64 scopeid 0x1 inet6 3ffe:501:ffff:1000:2d0:9ff:fea3:49fa prefixlen 64 autoconf 上例中,第二個地址就是自動配置的地址,前面的前綴為 IPv6路由器中設置的,而autoconf就標示了這種類型的地址,這個地址與前面地址的區別就是它的路由已知,因而沒有 ” %sis0 ” 這樣的後綴。 為了支持 IPv6,除了地址設置之外,還需要設置諸如網關、一些系統sysctl變量以控制網絡行為等等,以設置一個基本的IPv6環境。如果這些設置通過手工的方法來進行的話,通常比較麻煩,幸運的是,通過設置rc.conf變量,FreeBSD能自動配置IPv6基本環境。最基本的變量是 ” ipv6_enable ” ,它就包括了執行自動地址配置、添加組播路由等設置,而 ” ipv6_defaultrouter ” 就用於設置 IPv6的缺省路由地址等等。 有些應用程序, IPv4和IPv6差異比較大,系統提供了它們的IPv6對應版本,例如ping的IPv6版本ping6、ipfw的對應版本ip6fw等等,它們的用法通常是類似的。 # ping6 ::1 而另一些程序對於 IPv6和IPv4沒有太大的差別,就可以直接使用IPv6地址,或者使用參數表示是IPv6。例如: # route add -inet6 ::ffff:0.0.0.0 -prefixlen 96 ::1 -reject # route add -inet6 ::0.0.0.0 -prefixlen 96 ::1 -reject 上述兩個指令來源於系統的 rc.network6,用於屏蔽內部地址的數據包。而rc.network6就是系統IPv6初始設置腳本,通過這個腳本可以學習到更多的IPv6設置細節。 需要注意的,為了正常利用網絡功能,需要對 IPv6地址進行域名解析,除了正確設置DNS服務器之外,還需要將一些缺省的地址,例如本地地址 ” ::1 ” , ” fe80::1%lo0 ” 等放入 /etc/hosts文件,事實上這都包括在系統缺省安裝的hosts文件中了。
2) IPv6 網關支持 與 IPv4不同,IPv6的主機和網關差異比較大,在IPv4中,任何主機都可以打開路由功能,但它是被動的,等待其他系統認可才可以。而在IPv6中,路由器需要主動廣播自身,以便告訴網絡內的系統進行自動網絡配置,告訴上游的路由器設置正確路由。因此,這需要執行兩步操作,首先要打開針對IPv6的包轉發功能,然後還要運行rtadvd守護進程,進行路由器廣播。 通常情況下,這需要設置 ” ipv6_gateway_enable ” 和 ” rtadvd_enable ” 兩個變量為 ” Yes ” 。 然而,如果為了正確啟動 rtadvd,還需要設置其配置文件,缺省位置為/etc/rtadvd.conf。 default:\ :chlim#64:raflags#0:rltime#1800:rtime#0:retrans#0:\ :pinfoflags#192:vltime#2592000:pltime#604800:mtu#0: sis0:\ :addrs#1:addr="3ffe:501:ffff:1000::":prefixlen#64:tc=default: 上面是一個簡單的例子,但為了提高性能,必然需要對其中的參數進行更細的調整,以適合網絡情況。 進一步,可以在系統中運行 route6d等路由交換協議,支持RIP6等動態路由數據交換協議。對於這些涉及比較復雜的路由設置、網絡規劃內容,由於不是本書主要關心的內容,因此對此感興趣的FreeBSD用戶可以閱讀RFC以及有關資料,進一步深入研究IPv6。
3) 升級與遷移 雖然 IPv6肯定是未來網絡協議的發展方向,但真正要全面升級到IPv6也是極不現實的,因為有太多的問題存在。因而,將網絡移植到IPv6是一個逐步的過程,這個時候也不能脫離現有的網絡,依靠現有的IPv4互聯網能帶來很多便利。因此,就需要一些額外的技術,例如虛擬通道和協議轉換等,以便將新網絡架構在舊有網絡之上。 FreeBSD就對此提供了足夠的支持,系統支持gif、stf和faith邏輯網絡界面,以便能配置各種虛擬通道,進行協議轉換。 u gif通道 人們可以在自己的局域網中非常簡單的構建 IPv6網絡,但一旦需要將多個IPv6的網絡相互連接起來,就遇到種種問題。問題的關鍵在於,人們已經能夠通過IPv4相互連接,因此就沒有必要重新購置一套完整的IPv6連接設備。但如果直接在原有的IPv4網絡設備上配置IPv6,一方面這些網絡設備,是否全部支持IPv6仍然存在問題,另一方面這些網絡設備也不一定屬於同一個組織,網絡設備繁多也對配置工作量提出了很多要求。 因此,直接修改網絡設備的配置支持 IPv6是不現實的,而虛擬通道顯然是一種有效的解決方法。就是說,將IPv6的數據包,重新使用IPv4包裝一次,將這個包通過現有的IPv4網絡傳輸到對方,就不必介意這個網絡是否支持IPv6了。當對方接收到數據,再重新解開數據包,獲得真實數據。這個過程就相當於一個虛擬的點對點連接的通道,可以將這個通道的端點映射為一個虛擬的網絡界面,那麼可以直接在這個網絡界面上執行IPv6網絡配置,而不需要考慮中間的具體傳輸過程了。 根據這個原則,就可以創建 gif虛擬通道,顯然這需要涉及本地的IPv4地址、遠端的IPv4地址,這樣虛擬通道才能確定兩個端點。 首先,創建虛擬通道需要創建虛擬通道設備,通常是 gif0、gif1等等,應該選用一個沒有被使用的gif通道設備,或者重新創建它。注意,在FreeBSD 4.1之前,gif通道設備不能隨意創建,而是在系統定制的時候確定的,就無法使用下面的創建命令。 # ifconfig gif create gif0 # ifconfig gif0 gif0: flags=8010
mtu 1280 # ifconfig gif0 destroy # ifconfig gif0 create 上面的過程展示了使用 create建立通道,使用destroy撤消通道,以及再次創建通道的過程,注意,第一次創建使用的是網絡界面的類型,因此ifconfig將創建的設備名自動顯示出來,具體的設備序號由系統按順序確定。而第二次就直接使用一個不存在的虛擬設備名字,ifconfig將直接創建它。 然後就可以為通道指定兩端的地址,這需要使用 gifconfig命令,其中第一個地址為本地地址,而第二個地址為對方地址。 # gifconfig gif0 inet 192.168.100.1 192.168.1.1 也可以將創建 gif虛擬界面指令和配置指令放在一起: # ifconfig gif2 create tunnel 192.168.100.1 192.168.1.1 然後,就可以使用 ifconfig為gif0網絡界面設置地址了。 # ifconfig gif0 inet6 3ffe::2 prefixlen 64 當然,真正要使用上面的通道進行通信,還必須在兩端同時進行這樣的配置,僅僅是一端是不夠的。 為了在啟動時自動設置 gif通道,首先需要設置gif_interfaces變量,包括具體需要設置的gif通道設備名,然後再對每個通道設備設置其端點地址。下面為設置范例: gif_interfaces= ” gif0 gif1 ” gifconfig_gif0= ” 192.168.100.1 192.168.1.1 ” gifconfig_gif1= ” 192.168.10.1 192.168.111.1 ” u stf通道 使用 gif通道可以將兩個分離的IPv6網絡通過IPv4網絡連接起來,但是需要注意的是,這個設置需要兩端同時手工進行,特別是需要配置特別多的連接的時候,那麼