用 tap tun 做虛擬機器的網絡卡

2021-09-12 18:58:09 字數 2123 閱讀 1485

在雲計算時代,虛擬機器和容器已經成為標配。它們背後的網路管理都離不開一樣東西,就是虛擬網路裝置,或者叫虛擬網絡卡,tap/tun 就是在雲計算時代非常重要的虛擬網路網絡卡。

tap/tun 是 linux 核心 2.4.x 版本之後實現的虛擬網路裝置,不同於物理網絡卡靠硬體網路板卡實現,tap/tun 虛擬網絡卡完全由軟體來實現,功能和硬體實現完全沒有差別,它們都屬於網路裝置,都可以配置 ip,都歸 linux 網路裝置管理模組統一管理。

作為網路裝置,tap/tun 也需要配套相應的驅動程式才能工作。tap/tun 驅動程式包括兩個部分,乙個是字元裝置驅動,乙個是網絡卡驅動。這兩部分驅動程式分工不太一樣,字元驅動負責資料報在核心空間和使用者空間的傳送,網絡卡驅動負責資料報在 tcp/ip 網路協議棧上的傳輸和處理。

在 linux 中,使用者空間和核心空間的資料傳輸有多種方式,字元裝置就是其中的一種。tap/tun 通過驅動程式和乙個與之關聯的字元裝置,來實現使用者空間和核心空間的通訊介面。

在 linux 核心 2.6.x 之後的版本中,tap/tun 對應的字元裝置檔案分別為:

裝置檔案即充當了使用者空間和核心空間通訊的介面。當應用程式開啟裝置檔案時,驅動程式就會建立並註冊相應的虛擬裝置介面,一般以tunxtapx命名。當應用程式關閉檔案時,驅動也會自動刪除tunxtapx裝置,還會刪除已經建立起來的路由等資訊。

tap/tun 裝置檔案就像乙個管道,一端連線著使用者空間,一端連線著核心空間。當使用者程式向檔案/dev/net/tun/dev/tap0寫資料時,核心就可以從對應的tunxtapx介面讀到資料,反之,核心可以通過相反的方式向使用者程式傳送資料。

tap/tun 通過實現相應的網絡卡驅動程式來和網路協議棧通訊。一般的流程和物理網絡卡和協議棧的互動流程是一樣的,不同的是物理網絡卡一端是連線物理網路,而 tap/tun 虛擬網絡卡一般連線到使用者空間。

如下圖的示意圖,我們有兩個應用程式 a、b,物理網絡卡eth0和虛擬網絡卡tun0分別配置 ip:10.1.1.11192.168.1.11,程式 a 希望構造資料報發往192.168.1.0/24網段的主機192.168.1.1

基於上圖,我們看看資料報的流程:

應用程式 a 構造資料報,目的 ip 是192.168.1.1,通過socket a將這個資料報發給協議棧。

協議棧根據資料報的目的 ip 位址,匹配路由規則,發現要從tun0出去。

tun0發現自己的另一端被應用程式 b 開啟了,於是將資料發給程式 b.

程式 b 收到資料後,做一些跟業務相關的操作,然後構造乙個新的資料報,源 ip 是eth0的 ip,目的 ip 是10.1.1.0/24的閘道器10.1.1.1,封裝原來的資料的資料報,重新發給協議棧。

協議棧再根據本地路由,將這個資料報從eth0發出。

後續步驟,當10.1.1.1收到資料報後,會進行解封裝,讀取裡面的原始資料報,繼而**給本地的主機192.168.1.1。當接收回包時,也遵循同樣的流程。

在這個流程中,應用程式 b 的作用其實是利用tun0對資料報做了一層隧道封裝。其實tun裝置的最大用途就是用於隧道通訊的。

看到這裡,你可能還不大明白 tap/tun 的區別。

tap 和 tun 雖然都是虛擬網路裝置,但它們的工作層次還不太一樣。

從上面的資料流程中可以看到,tun裝置充當了一層隧道,所以,tap/tun 最常見的應用也就是用於隧道通訊,比如 vpn,包括 tunnel 和應用層的 ipsec 等,其中比較有名的兩個開源專案是 openvpn 和 vtun。

tun/tap 虛擬網絡卡,對應於物理網絡卡,如 eth0。

tun/tap 驅動包括字元裝置驅動和網絡卡驅動。

tun/tap 常用於隧道通訊。

ubuntu 虛擬機器網絡卡

安裝的ubuntu16.04,完成之後ip是動態獲取的,於是項配置乙個靜態的ip,ubuntu16的物理網絡卡名字是ens33,和以前的eth0 之類的不一樣,不知道從什麼版本開始改的。直接修改 etc network inte ces檔案。新增如下幾行 iface ens33 inet stati...

虛擬機器開啟網絡卡

虛擬機器一直不能和本機共用網路 然後各種找問題,最後發現是虛擬機器的網絡卡沒開啟,所以記錄一下 1 第一步 登入虛擬機器 centos 系統,檢視系統網絡卡裝置 ip addr show 紅框為網絡卡名字 2 第二步 修改網絡卡配置引數,修改 onboot 引數為yes,儲存退出 cd etc sy...

虛擬機器網絡卡重啟

1 centos6的網絡卡重啟方法 service network restart centos7的網絡卡重啟方法 systemctl restart network 2 dns配置檔案 cat etc resolv.conf 設定主機和ip繫結資訊 cat etc hosts 設定主機名 cat ...