1. 程式人生 > >vpn原理及實現--隧道的一種實現

vpn原理及實現--隧道的一種實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

理論上已經合理的ip over ssl還需要一些額外的技術支撐才能使用,必須想辦法將一個ip資料報原封不動的讓它被ssl重新封裝一次,這個動作不可能在原始的標準協議棧中執行,標準協議棧不支援資料雙向流動,那麼解決方案之一就是修改協議棧,在ip層之下實現一個輕量的ssl協議層,但是如此一來就又回到了IPSec的老路上,因此此法不可取,正確的方法是不修改協議棧,讓一切留在它應該在的地方,於是ssl必然得在應用層或者說是表示層實現,現在的問題是如何將下層的ip資料報重新引入上面的應用層,而且還不能修改標準協議棧,於是必然地要讓ip資料報繼續往下走,然後最終從一個網絡卡流出,於是就出了協議棧,接下來就可以自由發揮了,讓資料流出網絡卡的原因是不能修改協議棧,但是還不能真的讓它流出機器,如果它走了就不能指望用ssl封裝它了,那麼流到哪裡呢?迴環裝置是一個不錯的選擇,從迴環裝置流出的資料實際上又流進了迴環裝置,使用者空間只需要打開回環裝置然後讀取就可以了,注意不能通過一般套接字讀取,畢竟那些資料不是發給我們的,要使用類似抓包的方式進行資料抓取,並且用防火牆禁止被抓取的資料繼續被forward,這實際上是一種巧妙的攔截方式,被抓取得資料然後經過ssl封裝後再發向一個真的ip地址,我們需要配置的就是將所有的vpn資料全部發往回環裝置,其實就是新增一條路由,虛擬網路已經建立,事情到此為止看似要結束了。
     但是且慢,問題來了,以後所有vpn資料都會經標準協議棧流出再流進loopback,然後作為裸資料進入應用層,接著整個原始vpn資料連同它的原始ip頭封裝作為應用資料接受ssl協議的封裝,然後發往vpn的另一端,在另一端資料從真實網絡卡進入,然後由於這是隧道的終點,資料直接進入應用層,在應用層,vpn伺服器等候在那裡,得到原始的vpn裸資料還有它在傳送端的ip頭,服務端得到這個東西有什麼用呢,接下來它要怎麼做呢,它只是隧道的終點,並不是真的要接收資料的機器,因此它必須將資料重新發到真正需要它的機器,很顯然它要作為一個應用層代理存在,剝去原始的ip頭,得到原始的資料,然後將資料發給真實的目的地,且不說此法是否可能,有兩點不合理之處足以否定它,由於vpn伺服器實現了代理,那麼資料必然要在該處集中並剝去ip頭,並且在相反的方向要做同樣的處理,那麼它就要記住所有的ip頭,否則資料就會有去無回,如此一來,vpn伺服器的負載可堪忍受?效能呢?第二點,代理的方式消除了隧道的透明性,目的地受到資料後會不知道資料從何而來,統一認為是vpn伺服器發來的,這樣就無法根據資料來源點進行策略化服務。綜上原因,loopback裝置可用但不可行,因為它是本機閉合的,也就是說只有loopback出去的資料才能進入loopback,它又且僅有兩個出口,一讀一寫都在應用層,你無法將資料作為物理層的流寫入loopback,而只能作為應用層的資料通過協議棧逐級封裝到達loopback,然後再逐級解封回來,vpn傳送端面臨同樣的問題,因為僅僅是路由將資料出口指向了loopback, 如果不用抓包的方式(pcap)的話是得不到資料的,而這種方式又十分影響效能,加之還要配置複雜的防火牆規則禁止進入loopback的資料被轉發,效能又受影響,隧道兩端由於是全雙工通訊,因此一端面臨的問題在資料反向時在對端同樣存在,拋開這些不談,僅就loopback無法自由配置ip地址這一條,它就不能被選中來實現隧道,vpn網路需要被管理,有時管理本身就很複雜,虛擬網路不僅僅就一張,我們需要為每張虛擬網路準備一個子網,也就是每個虛擬網路要有不同的ip,所以必然需要靈活的ip配置,故而loopback不能實現優雅透明的隧道,既然如此我們回到原點,無非就是做到兩點,第一,資料必須按照協議棧的標準逐級封裝和解封裝,不能修改協議棧,第二就是資料到了最下面物理層的時候不能真的走掉,而是回到使用者空間,於是乎虛擬網絡卡就成了很好的選擇。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述