寫在前面:開源項目VTun 短小精悍,,涉及到了Linux下網絡編程的幾乎所有的東西,包括守護程序,、信號的處理,、服務創(chuàng)建子進程等,實現(xiàn)了虛擬LAN的功能,。個人感覺 VTun 唯一的缺憾是在認證方面,,沒有基于X509證書,而是簡陋的在配置文件進行了密鑰的設置,。雖然在舍棄CA方面,,做到了“輕型化”,但留下來極大的安全隱患,,這也限制了它的應用,,使得其只適合進行一些實驗和測試。 我參考了 VTun 源代碼和 麻利輝在ibm的developerworks 文章,,把自己對 VTun 工作原理做了一個簡要的敘述,。限于水平,文章難免謬誤,,僅供參考,。歡迎指正! 1. 初始化這一個階段主要是服務器和客戶端的為下一階段的通信做各種初始化和準備工作,,依次包括建立連接,、挑戰(zhàn) / 握手認證、設置 TAP/TUN 設備等,。
初始化階段 如圖可以看出,,這一階段還沒有用到虛擬網卡 TAP/TUN 設備,服務器和客戶端所有通信均通過物理網卡 eth0 進行,,雙方會開啟 socket 網絡套接字進行挑戰(zhàn) / 握手認證雙方合法性,。注意 :挑戰(zhàn) / 握手所需要的密鑰在配置文件 vtund.conf 給出(字段是 pass XXXX ),還有我們會注意到在源代碼中的認證還需要 host (在 auth.c 中) if( !(h = find_host(host)) ) break; 此處的 host 就是在 vtund.conf 中的服務器端給客戶定義的名字(服務器端可以任意?。?。 接下來,服務器和客戶會根據(jù)各自的配置文件設置虛擬網卡的特征,,比如是 TUN 還是 TAP ,,或者 PIPE 、 TTY ,,配置虛擬網卡的網絡地址和內核的路由等,。 好了,,我們假設以上一切順利了。現(xiàn)在,,萬事俱備,、只欠東風。下面就是重頭戲,,主角虛擬網卡出場了。 2. 虛擬隧道通信這一階段基本進入了正題,,服務器端和客戶端的應用程序可以使用虛擬網卡進行加密通信了,。
虛擬隧道通信 下面就上圖的做一個說明。這里我們假設: VTun 服務器: IP : eth0 192.168.1.11 tun0 10.0.1.1 VTun 客戶端: IP : eth0 192.168.2.22 tun0 10.0.1.2 (關于VTun的配置可以參見
關于VTun建立IP隧道的配置文件中的網絡配
置
) 1. VTun 客戶端 的應用程序要和 VTun 服務器的應用程序 進行通信,,發(fā)往 服務器 的數(shù)據(jù)報的出口為 tun0 設備,。數(shù)據(jù)包的源 IP 10.0.1.2 ,目的 IP 192.168.1.11 (目的地址也可能為 10.0.1.1,,這要看應用程序說提供服務的IP ,。如果是 IP 192.168.1.11 ,那么還要有網關gw 10.0.1.1幫忙轉發(fā),,才可以滴 ),; 2. 虛線表示 VTun 進程 read 讀取 tun0 設備的數(shù)據(jù),不走TCP/IP協(xié)議棧,。而讀取的數(shù)據(jù)為IP包(另,,在TAP的是以太網幀 ) ; 3. 隧道封裝,。VTun 進程對讀到的數(shù)據(jù)進行對稱加密,,然后 write 寫到 socket 套接字描述符,通過物理網卡,,發(fā)送到通信對端,。(數(shù)據(jù)包的源 IP 192.168.2.22 ,目的 IP 192.168.1.11 ) ,。這樣一來,,就形成了加密隧道包裹的情形了。TUN的是IP-in-IP,,TAP的是ETH-in-IP ,; 4. 數(shù)據(jù)包正常路由; 5. 隧道解封裝,。 在 VTun 服務器,, VTun 進程 read 讀取 socket 套接字描述符,然后進行對稱解密,; 6. 虛線表示 VTun 進程將解密后的數(shù)據(jù) write 寫到 tun0 設備,; 7. tun0 設備將數(shù)據(jù)包交給TCP/IP協(xié)議棧處理,。或者轉發(fā),,或者遞交到上層應用,,比如 VTun 客戶端的應用程序收到數(shù)據(jù)。 總結 : VTun 的一個優(yōu)點就是在用戶區(qū),,即使崩潰了也不會影響系統(tǒng)內核,。注意:由于封裝隧道的緣故,數(shù)據(jù)包在整個過程中,, IP 報頭和 TCP 或 UDP 頭都沒有被修改,,因此不懼 NAT 和源路由過濾。因為只是添加了一條到 tun0 設備路由而已,,可以說是以最小的代價完成了數(shù)據(jù)報的 “ 乾坤大挪移 ” ,。 |
|