Linux Tun/Tap 介紹

什麼是Tun/Tap

在計算機網絡中,TUN與TAP是操作系統內核中的虛擬網絡設備。不同於普通靠硬件網路板卡實現的設備,這些虛擬的網絡設備全部用軟件實現,並向運行於操作系統上的軟件提供與硬件的網絡設備完全相同的功能。

TAP等同於一個以太網設備,它操作第二層數據包如以太網數據幀。TUN模擬了網絡層設備,操作第三層數據包比如IP數據封包。

操作系統通過TUN/TAP設備向綁定該設備的用戶空間的程序發送數據,反之,用戶空間的程序也可以像操作硬件網絡設備那樣,通過TUN/TAP設備發送數據。在後種情況下,TUN/TAP設備向操作系統的網絡棧投遞(或“注入”)數據包,從而模擬從外部接受數據的過程。

應用程序如何操作Tun/Tap

Linux Tun/Tap驅動程序爲應用程序提供了兩種交互方式:虛擬網絡接口和字符設備/dev/net/tun。寫入字符設備/dev/net/tun的數據會發送到虛擬網絡接口中;發送到虛擬網絡接口中的數據也會出現在該字符設備上。

  1. 1.    應用程序可以通過標準的Socket APITun/Tap接口發送IP數據包,就好像對一個真實的網卡進行操作一樣。
  2. 2.    除了應用程序以外,操作系統也會根據TCP/IP協議棧的處理向Tun/Tap接口發送IP數據包或者以太網數據包,例如ARP或者ICMP數據包。
  3. Tun/Tap驅動程序會將Tun/Tap接口收到的數據包原樣寫入到/dev/net/tun字符設備上,處理Tun/Tap數據的應用程序如VPN程序可以從該設備上讀取到數據包,以進行相應處理

應用程序也可以通過/dev/net/tun字符設備寫入數據包,這種情況下該字符設備上寫入的數據包會被髮送到Tun/Tap虛擬接口上,進入操作系統的TCP/IP協議棧進行相應處理,就像從物理網卡進入操作系統的數據一樣。

Tun虛擬設備和物理網卡的區別是Tun虛擬設備是IP層設備,從/dev/net/tun字符設備上讀取的是IP數據包,寫入的也只能是IP數據包,因此不能進行二層操作,如發送ARP請求和以太網廣播。與之相對的是,Tap虛擬設備是以太網設備,處理的是二層以太網數據幀,從/dev/net/tun字符設備上讀取的是以太網數據幀,寫入的也只能是以太網數據幀。從這點來看,Tap虛擬設備和真實的物理網卡的能力更接近。

下圖描述了Tap/Tun的工作原理:

 

 

使用Tun/Tap創建點對點隧道

通過應用程序從/dev/net/tun字符設備中讀取或者寫入數據看上去並沒有太大用處,但通過將Tun/Tap結合物理網絡設備使用,我們可以創建一個點對點的隧道。如下圖所示,左邊主機上應用程序發送到Tun虛擬設備上的IP數據包被VPN程序通過字符設備接收,然後再通過一個TCP或者UDP隧道發送到右端的VPN服務器上,VPN服務器將隧道負載中的原始IP數據包寫入字符設備,這些IP包就會出現在右側的Tun虛擬設備上,最後通過操作系統協議棧和socket接口發送到右側的應用程序上。

 

 

 

上圖中的隧道也可以採用Tap虛擬設備實現。使用Tap的話,隧道的負載將是以太數據幀而不是IP數據包,而且還會傳遞ARP等廣播數據包。

 

 

使用Tun/Tap隧道繞過防火牆

結合路由規則和IPTables規則,可以將VPN服務器端的主機作爲連接外部網絡的網關,以繞過防火牆對客戶端的一些外部網絡訪問限制。如下圖所示,防火牆規則允許客戶端訪問主機IP2,而禁止訪問其他Internet上的節點。通過採用Tun隧道,從防火牆角度只能看到被封裝後的數據包,因此防火牆認爲客戶端只是在訪問IP2,會對數據進行放行。而VPN服務端在解包得到真實的訪問目的後,會通過路由規則和IPTables規則將請求轉發到真正的訪問目的地上,然後再將真實目的地的響應IP數據包封裝進隧道後原路返回給客戶端,從而達到繞過防火牆限制的目的。

 

 

使用Tap隧道橋接兩個遠程站點

如下圖所示,可以使用tap建立二層隧道將兩個遠程站點橋接起來,組成一個局域網。對於兩邊站點中的主機來說,訪問對方站點的主機和本地站點的主機的方式沒有區別,都處於一個局域網192.168.0.0/24中。

VPN主機上有兩個物理網卡,其中Eth0用於和對方站點的VPN主機進行通信,建立隧道。Eth1在通過網線連接到以太網交換機的同時也被則加入了Linux Bridge,這相當於用一條網線將Linux Bridge上的一個端口(Eth1)連接到了本地站點的以太網交換機上,Eth1上收到的所有數據包都會被髮送到Linux Bridge上,Linux Bridge發給Eth1的數據包也會被髮送到以太網交換機上。Linux Bridge上還有一個Tap虛擬網卡,用於VPN程序接收從Linux Bridge上收到的數據包。

 

 

 

假設192.168.0.5發出了一個對192.168.0.3的ARP請求,該ARP請求在網絡中經過的路徑如下:

  1. 192.168.0.5發出ARP請求,詢問192.168.0.3的MAC地址。
  2. 該ARP請求將被髮送到以太網交換機上。
  3. 以太網交換機對該請求進行泛洪,發送到其包括Eth1在內的所有端口上。
  4. 由於Eth1被加入了VPN主機上的Linux Bridge,因此Linux Bridge收到該ARP請求。
  5. Linux Bridge對該ARP請求進行泛洪,發送到連到其上面的Tap虛擬網卡上。
  6. VPN程序通過/dev/net/tun字符設備讀取到該ARP請求,然後封裝到TCP/UDP包中,發送到對端站點的VPN主機。
  7. 對端站點的VPN程序通過監聽TCP/UDP端口接收到封裝的ARP請求,將ARP請求通過/dev/net/tun字符設備寫入到Tap設備中。
  8. Linux Bridge泛洪,將ARP請求發送往Eth1,由於Eth1連接到了以太網交換機上,以太網交換機接收到了該ARP請求。
  9. 以太網交換機進行泛洪,將ARP請求發送給了包括192.168.0.3的所有主機。
  10. 192.168.0.3收到了APR請求,判斷iP地址和自己相同,對此請求進行響應。
  11. 同理,ARP響應包也可以按照該路徑返回到圖左邊包括192.168.0.5在內的站點中。

從站點主機的角度來看,上面圖中兩個VPN主機之間的遠程連接可以看作一條虛擬的網線,這條網線將兩個Linux Bridge連接起來。這兩個Linux Bridge和兩個以太網交換機一起將左右兩個站點的主機連接在一起,形成了一個局域網。

 

 

參考資料

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章