[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 系統管理 > Linux > 正文
Linux下IPV4和IPV6的互操作性研究
本文出自:http://www.china-pub.com 作者: 譚海平 (2002-09-29 09:08:26)

  作為向下一代互聯網絡協議過渡的重要步驟,國際的IPv6試驗網--6bone在1996年成立了。現在,6bone已經擴展到全球50多個國家和地區,成為IPv6研究者、開發者和實踐者的主要平台。CERNET國家網絡中心1998年6月加入6bone,同年11月成為其骨幹網成員。電子科大作為教育網的西南主節點,在得到Nokia的IPv6路由器之,積極參與IPv6技術研究,我們先查閱研究了大多數與IPv6有關的RFC文檔和相關技術資料,並且在此基礎上進行了很多網絡實驗。該文先簡單闡述了IPV6的必要性和IPV4到IPV6升級轉換的機制,然詳細闡明了在Linux操作系統下進行的IPv6網絡實驗及其結論,並附有相關參考文獻書目。

一、使用IPv6的必要性

  現在運行的因特網協議IPv4存在其固有的局限性,一是地址問題,IPv4的地址只有32位,這意味著總的地址數大約是40億,並且還有許多地址是不可用的。按照目前網絡的發展趨勢,到2005和2015年之間IPv4的地址就會耗盡,必須用另一種地址方案來替代它,二是IPv4提供的服務局限性,IPv4盡它的最大努力來傳送信息包,但是它不會保証提供給上層的服務是可靠的,沒有QoS(服務質量)的概念。這些問題都是IPv4的薄弱環節,致命弱點,另外因特網不斷提出對移動性、安全性以及多媒體業務的支持等問題,IPv4都無法解決,這樣就迫使我們必須引入下一帶因特網協議--IPv6。

二、IPv4和IPv6的互操作

  要將現在的IPV4網絡升級到IPV6網絡,不可能所有的機器在同時啟用IPV6協議棧,配置好IPV6地址,安裝好IPV6應用程序,所以必須實現IPV4網絡與IPV6網絡之間的互操作及平滑升級機制。IPv4到IPv6的升級轉換機制的首要條件是允許IPv6和IPv4主機互操作;其次是在相互依賴性很小的情況下使IPv6的主機和路由器能在因特網中快速發展;第三是轉換對端用戶,系統管理員和網絡實施者來說易理解和執行。IPv6轉換機制是一套主機和路由器執行的協議機制,有一套定址和配置的操作指導方案,盡可能減少轉換過程中造成的破壞。IPv6轉換機制的主要目標如下:
  ﹒ 可增加的升級和擴展性:單個IPv4的主機和路由器可在不需要其它的主機和路由器同時升級的情況下單獨升級成IPv6,新的IPv6主機和路由器可以再一台台的安裝成IPv6。
  ﹒最小的升級依賴性。將主機升級成IPv6的唯一先決條件是域名服務器必須先升級以處理IPv6地址記錄。
  ﹒方便的尋址。當IPv4的主機和路由器升級到IPv6,他們必須繼續用原來的地址。他們不需要指定新的地址。管理者不需制定新的地址分配方案。
  ﹒很低的啟動開銷。將IPv4系統升級成IPv6很少或幾乎不需要準備工作。
  IPv6轉換機制確保IPv6主機能和任何因特網上的IPv4通信,直到IPv4被淘汰,並在那時允許在小范圍內互相通信。這個特征保護了用戶已經在IPv4上的巨大投入並使得IPv6不會將IPv4孤立。
  基以上原因,IPv4主機和路由器上與Ipv6主機和路由器現在廣泛採用了如下兩種互操作的機制:隧道技術和雙IP協議棧技術。
  
A.隧道技術:

  隧道提供了一種利用IPv4路由基礎上傳輸IPv6包的方法。隧道應用下面幾種應用中:路由器到路由器、主機到路由器、主機到主機和路由器到主機。
  路由器到路由器和主機到路由器隧道技術都是將IPv6包傳到路由器,隧道的終點是中間路由器,必須將IPv6包解出,並且轉發到它的目的地。隧道終點的地址必須由配置隧道節點的配置信息獲得,這種類型的隧道稱作人工配置隧道。
  當利用隧道到達IPv6的主幹網時,如果一個在IPv4網絡和IPv6網絡邊界的IPv4/IPv6路由器的IPv4地址已知時,那隧道的端點可以配置為這個路由器。這個隧道的配置可以被寫進路由表中作為"缺省路由"。這就是說所有IPv6目的地址符合此路由的都可以使用這條隧道,這種隧道就是默認配置的隧道。
  主機到主機和路由器到主機隧道技術都是將IPv6包傳到主機的,可以用IPv6包的信息獲得終點地址。隧道入口創建一個IPv4封裝頭並傳送包,隧道出口解包,去掉IPv4頭,更新IPv6頭,處理IPv6包。隧道入口節點需要保存隧道信息如MTU等。如果用目的節點的IPv6地址是與IPv4兼容的地址,隧道的IPv4地址可以自動從IPv6地址繼承下來,因此也就不需要人工配置。這種隧道也就稱為自動隧道。
  IPv4兼容的IPv6地址格式如下:
      

B.雙IP協議棧方式

  雙協議棧方式包括提供IPv6和IPv4協議棧的主機和路由器。雙協議棧工作方式的簡單描述如下:
  ﹒如果應用程序使用的目的地址是IPv4地址,那將使用IPv4協議棧;
  ﹒如果應用程序使用的目的地址是兼容IPv4的IPv6地址,那IPv6就封裝到IPv4中;
  ﹒如果目的地址是另一種類型的IPv6地址,那就使用IPv6地址,可能封裝在默認配置的隧道中。
  雙協議棧的缺省IP包發送算法為:
a. 如果IP包的目的地址是IPv4地址:
  如果目的站點在可達鏈路上,直接發送;
  如果目的站點不可達,要送往在線路由器,要不可達。
b. 如果IP包的目的地址是IPv4兼容的IPv6地址:
  如果目的站點在可達鏈路上,直接發送IPv6包;
  如果目的站點處off-link,(1)如果有可達IPv4路由器,則封裝在IPv4包中發往IPv4路由器;(2)如果有可達IPv6路由器,則不封裝,直接發送;(3)如果沒有可達路由器,則不可達。
c. 如果IP包的目的地址是純IPv6地址:
  如果目的站點在 可達鏈路上,直接發送IPv6包;
  如果目的站點處off-link,(1)如果有可達IPv6路由器,則直接發送到路由器;(2如果目的地通過手動隧道可達,並且鏈路上有可達IPv4路由器,則封裝成IPv4包,目的IP地址為隧道終點地址,鏈路地址為可達路由器的鏈路地址。(3)否則為不可達。
d. 在線/離線的確定
  IPv4使用子網掩碼確定,IPv6使用鄰居發現協議。兩者共同使用的是:如果目的地址是IPv4地址,則使用  RFC1122比較兩者的掩碼;如果目的地址是IPv4兼容的IPv6地址,則使用低32位目的地址的子網掩碼比較;如果是  IPv6純地址,則使用鄰居發現協議。

三、Linux下IPv6網絡研究實驗

  我們在研究了大量IPv6協議(主要的IPv6 RFC文檔)之,進行了一系列的IPv6研究實驗。現詳細敘述如下:

1.Pv6研究實驗平台的選擇

  在國內有幾所大學已經或正在進行IPv6實驗研究,並且建立了CERNET IPv6實驗床,我們在與CERNET IPv6實驗床的老師和同學取得聯系並進行了交流,實驗床網絡中心最初的組網是通過主機配置FreeBSD來完成的,1998年開始用的是FreeBSD2.2.8,現在是FreeBSD3.2,3.4,4.0都有,此外有些科研人員也開始採用linux進行實驗,路由器現在採用的是Nokia的IP650,還有FreeBSD+Mrtd的主機。電子科大作為教育網西南地區的主節點,也得到了Nokia捐贈的IPv6路由器。在此基礎之上,我們通過分析比較研究各種操作系統,最選定用linux作為IPv6主機和路由器研究實驗平台。具體原因如下:
A. Linux作為開放的操作系統,其原代碼完全公開,具有很強的靈活性,現在有很多自由軟件聯盟為Linux免費開發如件,故Linux具有很強的生命力和活力,而其他大部分由個別公司開發的操作系統,一方面原代碼不公開,無法根據自己的要求修改內核,其公司的發展的興衰,很大程度上影響該操作系統的發展。
B. Linux操作系統很先進,一直跟蹤關注網絡的發展,用Linux組建Internet網絡,建立網站,進行網絡開發研究,都是很好的選擇。並且其內核從2.2.0開始,就已經開始支持IPv6技術了,這等就為我們提供了IPv6協議棧原代碼,  我們可以利用其共享代碼做IPv6的研究開發。

2.Linux主機IPv6協議支持技術研究

  在選定了實驗平台之,我們就著手進行一系列的IPv6實驗,主要針對在已大量安裝了IPv4的主機和路由器情況下,如何成功地兼容地升級到IPv6,如何運用在IPv6主機和路由器上,與Ipv4主機和路由器成功互操作,以及如何建立配置IPv6主機和路由器。在進行IPv6實驗之前,我們根據網上查詢資料及對Linux內核分析,研究了如何建立IPv6主機,包括安裝協議棧,網絡工具及網絡程序,現以Redhat 6.1 Linux為例,詳細說明其具體步驟如下:

A.支持IPv6協議的新內核的編譯

  要讓操作系統支持IPv6,就要安裝IPv6協議棧,Redhat6.1的內核為2.2.12版本,可支持IPv6,但是安裝缺省不支持,由協議棧在操作系統中是處核心地位的,必須重新編譯新的內核才能安裝上新的協議棧,其具體步驟如下:
  1)以root身份登陸,進入源碼所在的目錄:cd /usr/src/linux
  2)運行 make clean,清除一些可能過期的中間代碼。
  3) 然配置內核選項:make menuconfig 或者 make xmenuconfig運行make menuconfig,將下面的支持IPv6的選項選上,其他內核選項請根據系統的具體情況作出符合系統的選擇。
   Code maturity level options
     Prompt for development and/or incomplete code/drivers Yes.
   Networking options
     Packet socket               yes
     Unix domain sockets            yes
     TCP/IP networking             yes
     The IPv6 protocol             yes
     IPv6: enable EUI-64 token format      yes
     IPv6: disable provider based address    yes
   File systems
     / procfilesystem support yes
  4)然運行make dep; make clean; make bzImage
  5)沒有錯誤,現在已經編譯成功了支持IPv6協議的內核了。將該內核拷貝到Linux的啟動目錄下。
   cp arch/i386/boot/zImage /boot/vmlinuz-IPv6
  6)編輯etc/lilo.conf使新的內核成為boot的選擇。
  7) 重啟系統: reboot
  在重啟系統之,在登陸之前會發現有支持IPv6的內核信息出現,這下該主機就是純IPv6主機啦,但是現在的主機只是安裝的IPv6協議棧,並沒有IPv6網絡配置工具如hostname, netstat, arp, ifconfig, rarp, route等,還不能配置網絡,不能檢測調試發送IPv6包,因此我們必須進行如下操作。

B.編譯net-tools

  Linux的網絡配置,基本上是通過ifconfig和route等命令實現的,需要安裝編譯新版本的支持IPv6的net-tools,我們採用了net-tools-1.52。其安裝過程如下:
  1)解開軟件包:tar xzf your-path/net-tools-1.52.tar.gz -C /usr/src
  2)進入源碼所在目錄:cd /usr/src/net-tools
  3)make config時選擇下面的內容,其他選項內容請根據自己系統情況選擇:
   編譯主選項          子選項          選擇
   GNU gettext                      Yes( 如果使用的是glibc2)
   Protocol Families      UNIX protocol family    Yes
              INET (TCP/IP) protocol family  Yes
              INET6 (IPv6) protocol family   Yes
             Device hardware types SIT (IPv6-inIPv4) support Yes
  4)然編譯:make;安裝:make install。再重啟。
  現在我們就可以使用ifconfig和route等命令配置查看網絡了。運行ifconfig,我們可以看到在每個網絡接口,都生成了一個IPv6地址,這是它的本地鏈路地址,我們還需要配置其相應的全球地址和路由信息。最我們的IPv6主機就建立起來了。兩台機器均如此操作,通過絞線相連的最簡單的純IPv6網絡就搭建好啦。
  但是我們沒有IPv6的應用程序來檢測我們的IPv6網絡,但是怎知道我們的主機在網絡中是否能夠與其他主機通信呢,這還得需要有IPv6的應用程序檢測我們的網絡。

C.編譯Inet6-applications

  編譯新版本的支持IPv6的網絡應用程序我們採用的是inet6-apps-0.36,其編譯過程如下:
  1) 解開軟件包:tar xzf your-path/inet6-apps-0.36.tar.gz -C /usr/src
  2) 為編譯程序建立必要的鏈接:
   ln -sf /usr/src/inet6-apps-0.36 /usr/src/inet6-apps
  3) 進入源碼所在目錄: cd /usr/src/inet6-apps
  4)這個版本的inet6工具的icmp.c有個小Bug,編譯時需要一個補丁(inet6-apps-0.36-glibc21-rh60-patch.txt.gz)。將補丁程序加上然編譯:make clean; make ; make install。重啟系統。
現在我們就有了如finger[d], ftp[d], inetd, ping, tftp, libinet6等網絡應用程序就可以進行主機間的IPv6測試了。

3.Linux下IPv6主機和路由器配置技術研究

  在研究了Linux IPv6主機建立技術之,我們在Linux主機上進行了如下的進行IPv6主機和路由網絡實驗研究:

A.IPv6主機通信實驗

  為了了解如何建立IPv6主機,如何在Linux操作系統中,建立IPv6協議棧,收發純的IPv6數據包,我們最開始建立了如圖1所示的一個最簡單的IPv6網絡實驗環境:
          
  我們安裝了兩台以Redhat6.1 Linux為操作系統的主機,並且通過絞線相連。對每台主機,編譯新的內核支持IPv6,由缺省支持IPv4,故該主機為IPv6/IPv4雙協議棧主機。為了研究純IPv6主機通信,我們只配置主機的IPv6網絡信息,未配置其IPv4地址和網絡。作為西南地區,網絡中心分配的IPv6地址前綴是3ffe:3203:1001::/48,故利用ifconfig配置Host1和Host2的全球IPv6地址分別為3ffe:3203:1001::218/52和3ffe:3203:1001::218/52,命令格式為:ifconfig interface add IPv6-address,用route添加缺省網關分別為對方IPv6地址,然利用IPv6的應用程序ping對方的IPv6地址,得到連續的對方主機返回ICMPv6響應報文,安裝成功了。

B.IPv6/IPv4主機隧道通信實驗

  因為現在的IPv6主機在整個IPv4網絡中,象一個孤島,許多路由器不支持IPv6,故在IPv4網絡中經過了純IPv4路由器相連的兩個IPv6主機是不能直接通信的,要採用RFC1933所說的隧道技術(tunnel)。在Linux下的IPv6協議棧是支持隧道技術的。為研究IPv6主機如何在IPv4網絡中通信的,我們建立了圖2所示的實驗環境。
     
  與實驗1一樣,配置好Host1和Host2的IPv6地址,並且按照實際IPv4網絡情況,配置好網絡接口的IPv4地址。之,我們需要分別為Host1和Host2配置隧道,兩隧道的端地址分別為Host1和Host2的IPv4地址。具體配置命令格式如下:
   ifconfig sit0 up
   ifconfig sit0 inet6 tunnel ::202.115.12.218
   ifconfig sit1 up
   route -inet6 add 3ffe:3203:1001::/48 dev sit1
  其中第二步中的tunnel地址是與對方主機的IPv4兼容的IPv6地址,最一步添加的網絡為對方主機網絡接口所在網絡,這樣,相互的隧道就連通了。隧道0(sit0)為自動隧道(Automatic Tunneling),隧道1(sit1)為手動隧道(Configured Tunneling),在啟動了sit0之,可以直接ping通對方主機的IPv4兼容IPv6地址,但是不能ping通對方的全球IPv6地址,因為IPv4 Router不負責轉發IPv6報文,只有在手動配置了sit1之,跨越了IPv4網絡的IPv6主機之間才能進行通信。

C.IPv6/IPv4主機接入6bone網絡

  我們在完成以上實驗的基礎上,具有了IPv6主機和網絡配置基本理論和實踐經驗,就準備接入IPv6實驗網6bone,首先通過主機與電子科大網絡中心的IPv6路由器相接,連入CERNET IPv6實驗床,再通過該網絡與世界IPv6實驗網6bone相接。根據網絡分析,我們制定了如圖3所示的網絡接入方案:
   
  首先配置好Host1和Host2的IPv4網絡信息,再向電子科大網絡中心申請分配全球IPv6地址,申請隧道,網絡中心按照Host1和Host2的IPv4地址,手動配置分配兩隧道,並設置了靜態路由信息。按照實驗2的配置步驟,分別為Host1和Host2配置好IPv6地址,並且與網絡中心的Nokia IPv6路由器建立好隧道,基本操作與實驗2相似。完成如上所述配置操作之,我們首先ping電子科大網絡中心IPv6路由器的IPv6地址,實驗成功,IPv6網絡連通了,然ping CERNET IPv6實驗網的主機,利用finger6,FTP6瀏覽6bone網絡中其他網絡資源,實驗成功,我們與CRENET IPv6實驗床和國際IPv6實驗網6bone實現了連網。

D.Pv6/IPv4路由器研究

  在成功配置了IPv6主機並且接入了國際IPv6之,我們嘗試組建自己的IPv6網絡,具體組網如圖4所示:
    
  由沒有現成的IPv6路由器,就嘗試利用Linux操作系統,配置成IPv6路由器,具體工作如下:我們就在支持IPv6的Linux主機上,配置多個網卡,為每個網卡設置好IPv6地址,在操作系統中編輯新的配置文件和Script文件,主要為network-ip6、 network-ip6.conf 、network-ip6.init、tunnels-ip6.init和radvd.init幾個文件。具體編輯細節參看Peter Bieringer 2000-05-19所的IPv6 & Linux - HowTo 3.14版。之中較為關鍵的是   /etc/sysconfig/network-ip6文件,需要設置IP6FORWARDING=yes,IP6GATEWAYCONFIG=yes,IP6ROUTEFILE=/etc/sysconfig/network-ip6.conf,這樣設置之,從一個網絡接口發送來的IPv6報文就可以轉發到另外的網絡接口,完成路由轉發功能,完成路由器基本功能,再啟動其他路由協議,完成相關工作,到此,我們的IPv6路由器就安裝成功了,如果還要安裝其他的IPv6路由協議,可以參照相應的文檔。

參考文獻

  1. RFC1933 IPv6主機和路由器遷移機制;
  2. RFC2460 IPv6規范說明;
  3. RFC2461 IPv6鄰居發現協議;
  4. RFC2462 IPv6無狀態地址自動配置協議;
  5. RFC2463 ICMPV6協議;
  6. RFC2464 IPv6分組在以太網上的傳輸;
  7. RFC2471 IPv6實驗地址分配;
  8. RFC2473 在IPv6規范中通用分組隧道;
  9. RFC2373 IPv6地址體系;
  10. RFC2147 TCP和UDP在IPv6上的大數據傳輸;
  11. RFC2529 在無顯式的隧道情況下通過IPv4網絡傳輸IPv6分組;
  12. IPv6 & Linux - HowTo, Peter Bieringer,2000-05-19;
  13. The Linux Kernel HOWTO, v1.0,Brian Ward, 5 June 1999;
  14. Linux Networking-HOWTO (Previously the Net-3 Howto), v1.5,Current Author, August 1999


(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
linux kernel 2.4.5 ipv4 socket層的一點解釋 (2001-07-30 10:00:00)
 

★  樊強制作 歡迎分享  ★