熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Linux中IP隧道的分析與建議

2013-11-13 22:17:27  來源: Oracle 

  作者 Wing
  摘要:由於網絡的日益普及網絡的安全成為目前的熱門話題本文對隧道技術的分析就側重安全領域對利用隧道技術實現虛擬專網提出建議
  作者的話
    
    作者信箱: x 歡迎來信!!
  
  **********************************************************************
    由於網絡的日益普及網絡的安全成為目前的熱門話題本文對隧道技術的分析就側重安全領域對利用隧道技術實現虛擬專網提出建議
  
    為什麼需要IP隧道?沒有接觸過這個概念的人自然提出這樣的疑問實際上概念最初的提出很簡單為了在TCP/IP網絡中傳輸其他協議的數據包設想IPX協議或 X封裝的數據包如何通過Internet網進行傳輸在已經使用多年的橋接技術中是通過在源協議數據包上再套上一個IP協議頭來實現形成的IP數據包通過Internet後卸去IP頭還原成源協議數據包傳送給目的站點對源協議數據來說就如被IP帶著過了一條隧道這種技術在業余無線網絡(Amateur Packet Radio network應該怎麼翻請告訴我)得到了最廣泛的應用
  
    利用IP隧道來傳送的協議包也包括IP數據包本文主要分析的IPIP封包就是如此從字面來理解IPIP就對了就是把一個IP數據包又套在一個IP包裡為什麼要這麼做呢?多此一舉嘛其實不然見過一些應用就會明白移動IP(MobileIP)和IP多點廣播IPMulticast)是兩個通常的例子目前IP隧道技術在構築虛擬專網( Virtual Private Network)中也顯示出極大的魅力本文也將對利用IP隧道技術構築VPN做簡單設想
  
  背景隧道的多種理解和實現
  
    Internet的研究者多年前就感到需要在網絡中建立隧道最初的理解是在網絡中建立一條固定的路徑以繞過一些可能失效的網關可以說隧道就是一條特定的路徑這樣的隧道是通過IP報頭中的源路由選項來實現的在目前看來這個方法的缺 陷十分明顯要設置源路由選項就必須知道數據包要經過的確切路徑而且目前多數路由實現中都不支持源路由
  
    另一個實現隧道的機制是開發一種新的IP選項用來表明源數據包的信息原IP頭可能成為此選項的一部分這種隧道的意義與我們所說的隧道已十分接近但它的不足在於要對目前IP選項的實現和處理做較大的修改也缺乏靈活性
  
    最後常用的一種實現方法是開發一種新的IP封包協議仍然套用當前的IP頭格通過IP封包不須指明網絡路徑封包就能透明地到達目的地也可以通過封包 空間把未直接連接的機器綁在一起從而創建虛擬網絡這種方法易行可靠可擴展性強Linux采用了這一方法這也是目前我們所理解的隧道思想
  
  一封包協議的結構和實現
  
    封包協議的實現原理十分簡單先看看通過隧道傳送的數據報在網絡中如何流動如圖一
  
    為了敘述簡便我把在隧道中傳送的IP數據包稱為封包
  
  
  
   / 子網A / 子網C
   / /
   | | | |
   | & | | |
   | + +++++ | | ***** |
   | +++++ + | | * * |
   | + | | ***** * |
   + / * * /
   ++> # * **>(#) * ***> # ++++
   / * * / +
   | * * | | + |
   | * * | | + |
   | ***** * | | +++++++ |
   | ***** | | V |
   | | | & |
   / /
   子網B / 子網D /
  
   ++++++ 原數據報
   ****** 封裝後的數據包(封包)
   # 封裝/解封
   & 用戶主機
   圖一 封包協議實現模型
  
    看圖中的設備 #分別處於隧道的兩端分別起打包(封裝)和解包(解封)的作用在整個數據包的傳送路徑中除了隧道兩端的 # 設備其他網關把數據包看成一個普通的IP包進行轉發
  
    設備 # 就是一個封包基於的兩個實現部件封裝部件和解封部件封裝和解封部件(設備)都應當同時屬於兩個子網封裝部件對接收到的數據報加上封包頭 然後以解封部件地址作為目的地址轉發出去而解封部件則在收到封包後還原原數據報轉發到目的子網
  
    隧道的源端(封裝部件)對進入隧道的數據包進行封裝形成封包一個完整的封包如圖二所示
  
  
   / ++
   | | 封包IP頭 |
   封包頭 | ++
   | | 封包協議頭 |
   ++
   / | 原協議頭 |
   | ++
   | | |
   原數據報 | | 原協議數據 |
   |
   |
   | | |
   ++
   圖二 封包結構
  
  二Linux中的實現
  
    本人分析的版本是Linux(RedHat采用)
  
    在Linux中隧道的實現主要基於兩個文件new_tunnelc和ipipc同時Linux定義了一種新的協議類型IPIP(IPPROTO_IPIP)與上面所說封包類型類似
  
  基本思路
  
    在Linux中IP Tunnel的實現也分為兩個部件封裝部件和解封部件分別司職發送和接收但這兩個部分是在不同的層次以不同的方式實現的封裝部件是在數據鏈路層以虛設備的方式實現所有源代碼見
  
  /usr/src/linux/drivers/net/new_tunnelc
  
    為實現封裝Linux實現一個稱為tunl的網絡設備(類似loopback設備)此設備具有其他網絡設備共有的特征對於使用此設備的上層應用來說對這些網絡設備 不加區分調用及處理方法當然也完全一樣
  
    tunnel_init()和tunnel_xmit()是new_tunnelc中的兩個主要過程
  
    tunnel_init()初始化與設備tunl相關的device結構
  
    而tunnel_xmit()在從tunl設備發送數據時被調用tunl設備作為實現IP隧道技術的封裝部分在此過程中完成對相應的數據報進行封裝所需的全部操作形成IPIP類型的IP包並重新轉發此數據包(ip_forward())
  
    解封部件在IP的上層實現系統把它作為一個虛的傳輸層(實際上與傳輸層毫無關系)具體處理見文件
  
  /usr/src/linux/net/ipv/ipipc
  
    我們知道每一個IP數據包均交由ip_rcv函數處理在進行一些必要的判斷後ip_rcv對於發送給本機的數據包將交給上層處理程序對於IPIP包來說其處理函數是ipip_rcv(就如TCP包的處理函數是tcp_rcv一樣IP層不加區分)也就是說 當一個目的地址為本機的封包到達後ip_rcv函數進行一些基本檢查並除去IP頭然後交由ipip_rcv解封
  
    ipip_rcv所做的工作就是去掉封包頭還原數據包然後把還原後的數據包放入相應的接收隊列(netif_rx())
  
    從以上IP Tunnel實現的思想來看思路十分清晰但由於IP Tunnel的特殊性其實現的層次並不單純實際上它的封裝和解封部件不能簡單地象上面所說的那樣分層tunl設備雖應算進鏈路層但其發送程序中做了更多的工作如制作IPIP頭及新的IP頭(這些一般認為是傳輸層或網絡層的工作)調用ip_forward轉發新包也不是一個網絡設備應當做的事可以說tunl借網絡設備之名一把抓干了不少工作真是高效而解封部件宏觀上看在網絡層之上解出IPIP頭恢復原
  
    數據包是它分內的事
From:http://tw.wingwit.com/Article/program/Oracle/201311/18700.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.