虛擬網絡卡TUN TAP驅動程式設計原理

2021-05-08 04:05:58 字數 1783 閱讀 8255

虛擬網絡卡tun/tap驅動是乙個開源專案,支援很多的類unix平台,openvpn和vtun都是基於它實現隧道包封裝。本文將介紹tun/tap驅動的使用並分析虛擬網絡卡tun/tap驅動程式在linux環境下的設計思路。

tun/tap 驅動程式實現了虛擬網絡卡的功能,tun表示虛擬的是點對點裝置,tap表示虛擬的是乙太網裝置,這兩種裝置針對網路包實施不同的封裝。利用tun/tap 驅動,可以將tcp/ip協議棧處理好的網路分包傳給任何乙個使用tun/tap驅動的程序,由程序重新處理後再發到物理鏈路中。開源專案 openvpn( http://openvpn.sourceforge.net)和vtun( http://vtun.sourceforge.net)都是利用tun/tap驅動實現的隧道封裝。

使用tun/tap驅動

在linux 2.4核心版本及以後版本中,tun/tap驅動是作為系統預設預先編譯進核心中的。在使用之前,確保已經裝載了tun/tap模組並建立裝置檔案:

#modprobe tun

#mknod /dev/net/tun c 10 200

引數c表示是字元裝置, 10和200分別是主裝置號和次裝置號。

這樣,我們就可以在程式中使用該驅動了。

使用tun/tap裝置的示例程式(摘自openvpn開源專案 http://openvpn.sourceforge.net,tun.c檔案)

int open_tun (const char *dev, char *actual, int size)

else if (!strncmp (dev, "tap", 3))

else

if (strlen (dev) > 3) /* unit number specified? */

strncpy (ifr.ifr_name, dev, ifnamsiz);

if (ioctl (fd, tunsetiff, (void *) &ifr) < 0) //開啟虛擬網絡卡

msg (m_err, "cannot ioctl tunsetiff %s", dev);

set_nonblock (fd);

msg (m_info, "tun/tap device %s opened", ifr.ifr_name);

strncpynt (actual, ifr.ifr_name, size);

return fd;

}

呼叫上述函式後,就可以在shell命令列下使用ifconfig 命令配置虛擬網絡卡了,通過生成的字元裝置描述符,在程式中使用read和write函式就可以讀取或者傳送給虛擬的網絡卡資料了。

tun/tap驅動程式工作原理

做 為虛擬網絡卡驅動,tun/tap驅動程式的資料接收和傳送並不直接和真實網絡卡打交道,而是通過使用者態來轉交。在linux下,要實現核心態和使用者態資料的 互動,有多種方式:可以通用socket建立特殊套接字,利用套接字實現資料互動;通過proc檔案系統建立檔案來進行資料互動;還可以使用裝置檔案的方 式,訪問裝置檔案會呼叫裝置驅動相應的例程,裝置驅動本身就是核心態和使用者態的乙個介面,tun/tap驅動就是利用裝置檔案實現使用者態和核心態的資料交 互。

從結構上來說,tun/tap驅動並不單純是實現網絡卡驅動,同時它還實現了字元裝置驅動部分。以字元裝置的方式連線使用者態和核心態。下面是示意圖:

小結參考資料

關於作者

麻利輝 電子科技大學計算機學院2003級研究生,研究方向為網路安全,對網路安全的各種技術都有著濃厚的興趣,主要研究方向為防火牆技術和攻擊技術。長期在linux下從事軟體開發,您可以通過電子郵件 [email protected]和他取得聯絡。

虛擬網絡卡 TUN TAP 驅動程式設計原理

http www.ibm.com developerworks cn linux l tuntap index.html 簡介 虛擬網絡卡tun tap驅動是乙個開源專案,支援很多的類unix平台,openvpn和vtun都是基於它實現隧道包封裝。本文將介紹tun tap驅動的使用並分析虛擬網絡卡t...

虛擬網絡卡 TUN TAP 驅動程式設計原理

虛擬網絡卡tun tap驅動是乙個開源專案,支援很多的類unix平台,openvpn和vtun都是基於它實現隧道包封裝。本文將介紹tun tap驅動的使用並分析虛擬網絡卡tun tap驅動程式在linux環境下的設計思路。tun tap 驅動程式實現了虛擬網絡卡的功能,tun表示虛擬的是點對點裝置,...

虛擬網絡卡 TUN TAP 驅動程式設計原理

虛擬網絡卡tun tap驅動是乙個開源專案,支援很多的類unix平台,openvpn和vtun都是基於它實現隧道包封裝。本文將介紹tun tap驅動的使用並分析虛擬網絡卡tun tap驅動程式在linux環境下的設計思路。tun tap驅動程式實現了虛擬網絡卡的功能,tun表示虛擬的是點對點裝置,t...