在電腦網路中,TUN與TAP是作業系統核心中的虛擬網路裝置。不同於普通靠硬體網路板卡實現的裝置,這些虛擬網路裝置全部用軟體實現,並向運行於作業系統上的軟體提供與硬體的網路裝置完全相同的功能。
TAP 等同於一個乙太網路裝置,它操作第二層資料包如乙太網路資料幀。TUN類比了網路層裝置,操作第三層資料包比如IP資料封包。
作業系統通過TUN/TAP裝置向綁定該裝置的使用者空間的程式發送資料,反之,使用者空間的程式也可以像操作硬體網路裝置那樣,通過TUN/TAP裝置發送資料。在後種情況下,TUN/TAP裝置向作業系統的網路棧投遞(或“注入”)資料包,從而類比從外部接受資料的過程。
伺服器如果擁有TUN/TAP模組,就可以開啟VPN代理功能。
虛擬網卡TUN/TAP 驅動程式設計原理:
tun/tap 驅動程式實現了虛擬網卡的功能,tun表示虛擬是點對點裝置,tap表示虛擬是乙太網路裝置,這兩種裝置針對網路包實施不同的封裝。
利用tun/tap 驅動,可以將tcp/ip協議棧處理好的網路分包傳給任何一個使用tun/tap驅動的進程,由進程重新處理後再發到物理鏈路中。
開源項目openvpn ( http://openvpn.sourceforge.net)和Vtun( http://vtun.sourceforge.net)都是利用tun/tap驅動實現的隧道封裝。
在使用virtualbox虛擬機器測試網路啟動服務時,由於主機的網路介面是通過DHCP獲得ip地址,每次重新啟動機器後,都需要更改dhcp的設定檔.
非常麻煩,所以想到使用虛擬網卡(TUN/TAP)來產生一個虛擬網卡,設定靜態ip,將virtualbox網路設定為橋接模式,而且可以和主機網路做到相對隔離(不同網段)
下面我們就以fedora13 來舉例,來看看如何建立虛擬網卡裝置
1. 確認核心是否支援tun/tap
確認核心是否有tun模組
代碼如下:
[root@hunterfu]# modinfo tun
filename: /lib/modules/2.6.34.7-56.fc13.i686.PAE/kernel/drivers/net/tun.ko
alias: char-major-10-200
license: GPL
author: (C) 1999-2004 Max Krasnyansky
description: Universal TUN/TAP device driver
srcversion: 880DE258930FE60D765B735
depends:
vermagic: 2.6.34.7-56.fc13.i686.PAE SMP mod_unload 686
載入核心模組 -
代碼如下:
[root@hunterfu ~]# modprobe tun
[root@hunterfu ~]# lsmod | grep tun
tun 10548 1
執行以上命令後,出現如上輸出,說明模組載入成功
2. 建立和配置虛擬網卡
確認是否有tunctl命令,如果沒有通過yum安裝即可
代碼如下:
[root@hunterfu ~]# yum install tunctl
建立虛擬網卡裝置
代碼如下:
[root@hunterfu ~]# tunctl -t tap0 -u root
設定虛擬網卡
代碼如下:
[root@hunterfu ~]# ifconfig tap0 192.168.0.1 netmask 255.255.255.0 promisc
經過如上操作後,虛擬網卡已經建立和配置好了。
3. 作為系統服務隨系統自動啟動建立虛擬網卡
編寫配置指令碼(符合chkconfig規範)
代碼如下:
[root@hunterfu ~]# cat /etc/init.d/config_tap
#!/bin/bash
#
# config_tap Start up the tun/tap virtual nic
#
# chkconfig: 2345 55 25
USER="root"
TAP_NETWORK="192.168.0.1"
TAP_DEV_NUM=0
DESC="TAP config"
do_start() {
if [ ! -x /usr/sbin/tunctl ]; then
echo "/usr/sbin/tunctl was NOT found!"
exit 1
fi
tunctl -t tap$TAP_DEV_NUM -u root
ifconfig tap$TAP_DEV_NUM ${TAP_NETWORK} netmask 255.255.255.0 promisc
ifconfig tap$TAP_DEV_NUM
}
do_stop() {
ifconfig tap$TAP_DEV_NUM down
}
do_restart() {
do_stop
do_start
}
check_status() {
ifconfig tap$TAP_DEV_NUM
}
case $1 in
start) do_start;;
stop) do_stop;;
restart) do_restart;;
status)
echo "Status of $DESC: "
check_status
exit "$?"
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
可以根據具體需求修改此指令碼
加入到系統服務中
代碼如下:
[root@hunterfu ~]# chkconfig --add config_tap
[root@hunterfu ~]# chkconfig --level 345 config_tap on
操作完成後,就可以像其他標準服務一樣,通過 service config_tap start 來進行建立和啟動操作。