TUN/TAP设备浅析(一) -- 原理浅析
TUN/TAP設備淺析
TUN設備
TUN 設備是一種虛擬網絡設備,通過此設備,程序可以方便地模擬網絡行為。TUN 模擬的是一個三層設備,也就是說,通過它可以處理來自網絡層的數據,更通俗一點的說,通過它,我們可以處理 IP 數據包。
先來看看物理設備是如何工作的:
tun設備
上圖中的 eth0 表示我們主機已有的真實的網卡接口 (interface)。
網卡接口 eth0 所代表的真實網卡通過網線(wire)和外部網絡相連,該物理網卡收到的數據包會經由接口 eth0 傳遞給內核的網絡協議棧(Network Stack)。然后協議棧對這些數據包進行進一步的處理。
對于一些錯誤的數據包,協議棧可以選擇丟棄;對于不屬于本機的數據包,協議棧可以選擇轉發;而對于確實是傳遞給本機的數據包,而且該數據包確實被上層的應用所需要,協議棧會通過 Socket API 告知上層正在等待的應用程序。
下面看看 TUN 的工作方式:
數據包處理過程
01_UDP_VPN.png
我們知道,普通的網卡是通過網線來收發數據包的話,而 TUN 設備比較特殊,它通過一個文件收發數據包。
如上圖所示,tunX 和上面的 eth0 在邏輯上面是等價的, tunX 也代表了一個網絡接口,雖然這個接口是系統通過軟件所模擬出來的.
網卡接口 tunX 所代表的虛擬網卡通過文件 /dev/tunX 與我們的應用程序(App) 相連,應用程序每次使用 write 之類的系統調用將數據寫入該文件,這些數據會以網絡層數據包的形式,通過該虛擬網卡,經由網絡接口 tunX 傳遞給網絡協議棧,同時該應用程序也可以通過 read 之類的系統調用,經由文件 /dev/tunX 讀取到協議棧向 tunX 傳遞的所有數據包。
此外,協議棧可以像操縱普通網卡一樣來操縱 tunX 所代表的虛擬網卡。比如說,給 tunX 設定 IP 地址,設置路由,總之,在協議棧看來,tunX 所代表的網卡和其他普通的網卡區別不大,當然,硬要說區別,那還是有的,那就是 tunX 設備不存在 MAC 地址,這個很好理解,tunX 只模擬到了網絡層,要 MAC地址沒有任何意義。當然,如果是 tapX 的話,在協議棧的眼中,tapX 和真是網卡沒有任何區別。
如果我們使用 TUN 設備搭建一個基于 UDP 的 VPN ,那么整個處理過程可能是這幅樣子:
udp vpn
首先,我們的應用程序通過 eth0 和遠程的 UDP 程序相連,對方傳遞過來的 UDP 數據包經由左邊的協議棧傳遞給了應用程序,UDP 數據包的內容其實是一個網絡層的數據包,比如說 IP 數據報,應用程序接收到該數據包的數據(剝除了各種頭部之后的 UDP 數據)之后,然后進行一定的處理,處理完成后將處理后的數據寫入文件 /dev/tunX,這樣,數據會第二次到達協議棧。需要注意的是,上圖中繪制的兩個協議棧其實是同一個協議棧,之所以這么畫是為了敘述的方便。
TAP設備
TAP 設備與 TUN 設備工作方式完全相同,區別在于:
最后,關于文章中出現的二層,三層,我這里說明一下,第一層是物理層,第二層是數據鏈路層,第三層是網絡層,第四層是傳輸層。
參考文章:
[1]. https://blog.kghost.info/2013/03/27/linux-network-tun/
?
總結
以上是生活随笔為你收集整理的TUN/TAP设备浅析(一) -- 原理浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一步步编写操作系统 79 在c代码中内联
- 下一篇: 【转】2.4SharePoint服务器端