Linux下Tun/Tap設備通信原理


Tun/Tap都是虛擬網卡,沒有直接映射到物理網卡,是一種純軟件的實現。Tun是三層虛擬設備,能夠處理三層即IP包,Tap是二層設備,能處理鏈路層網絡包如以太網包。使用虛擬網絡設備,可以實現隧道,如OpenVPN的實現。這篇文章我主要根據自己畫的一個圖來簡單說明在隧道實現中兩個虛擬網絡設備數據包的流程。

 

 

上面的圖中,左右兩邊分別為兩台機器。一台有一塊物理網卡配置了IP:172.16.1.11,這台機器的系統里有一個Tun(以Tun為例,不講Tap了)設備,配置了IP:192.168.1.11; 另一台的一塊物理網卡配置了IP:172.16.1.12,系統里有一個Tun設備並配置了IP:192.168.1.12。

 

左邊Linux系統里有一個Application,綁定到端口地址為: 192.168.1.11:5000,右邊Linux也有一個Application,綁定到端口地址為:192.168.1.12:5000,顯然它們綁定的都是Tun設備的IP,接着它們就通過這兩個地址通信了。

 

假設左邊的Application要給右邊的Application發送一個數據包,流程是這樣的:

 

左邊的Application並不知道什么虛擬網絡設備,它只知道往"192.168.1.12:5000"這個地址發送,左邊主機系統首先按正常的發包過程處理,比如判斷目的主機是不是位於同一網段等等,然后數據包就在Linux的網絡協議棧中穿行。Tun設備並不是真實的物理網卡,它不知道把數據包往哪里送,但是這些經過了Linux網絡協議棧的數據可以從Tun設備的文件描述符中讀取到,圖中的“User Program”就是監聽這個描述符等待讀取數據的。這個“User Program”程序綁定的端口地址是:172.16.1.11:6000,每當它從Tun設備讀到數據的時候,就把這些數據從物理網卡發送出去,目標地址是右邊的:172.168.1.12:6000。

 

數據到達右邊的系統,經過網絡協議棧之后到達“User Program”應用進程,“User Program”將接收到的數據往Tun設備對應的文件描述符寫入。對於Tun設備來說,“寫入”就像是物理網卡接受到數據包一樣,因此這些接收到的數據又進入了Linux的網絡協議棧,最終到達右邊的Application

 

可能有人迷糊了,這里的Application是指各種各樣的用戶程序,如ping工具。“User Program”是用來輔助Tun設備來實現隧道功能的,可以想象成是OpenVPN進程,沒有它隧道就廢了。

 

想要看一個簡單的隧道實現嗎?戳這里

 

原文地址:Linux下Tun/Tap設備通信原理

 

歡迎關注公眾號:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM