在計算機網絡中,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驅動實現的隧道封裝。
1. 確認內核是否支持tun/tap
確認內核是否有tun模塊
[root@VM_196_26_centos ~]# modinfo tun
filename: /lib/modules/3.10.0-327.el7.x86_64/kernel/drivers/net/tun.ko
alias: devname:net/tun
alias: char-major-10-200
license: GPL
author: (C) 1999-2004 Max Krasnyansky <[email protected]>
description: Universal TUN/TAP device driver
rhelversion: 7.2
srcversion: B59BCB1255A36FBC7557FC3
depends:
intree: Y
vermagic: 3.10.0-327.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: 79:AD:88:6A:11:3C:A0:22:35:26:33:6C:0F:82:5B:8A:94:29:6A:B3
sig_hashalgo: sha256
加載內核模塊
[root@VM_196_26_centos ~]# modprobe tun
[root@VM_196_26_centos ~]# lsmod | grep tun
tun 27141 0
執行以上命令後,出現如上輸出,說明模塊加載成功
2. 創建和配置虛擬網卡
確認是否有tunctl命令,如果沒有通過yum安裝即可
centos6通過直接通過yum install tunctl -y安裝
(以上參考的http://www.jb51.net/LINUXjishu/401735.html)
centos7安裝之前需要新增yum源(參考的https://pkgs.org/centos-7/nux-misc-x86_64/tunctl-1.5-12.el7.nux.x86_64.rpm.html)
Install Howto
Create the repository config file /etc/yum.repos.d/nux-misc.repo:
[nux-misc]name=NuxMiscbaseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/enabled=0gpgcheck=1gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
Install tunctl rpm package:
#yum--enablerepo=nux-miscinstalltunctl
創建虛擬網卡設備
[root@VM_196_26_centos ~]# tunctl -t tap0 -u root
Set 'tap0' persistent and owned by uid 0
[root@VM_196_26_centos ~]# ifconfig tap0 192.168.0.1 netmask 255.255.255.0 promisc
[root@VM_196_26_centos ~]# ifconfig tap0
tap0: flags=4355<UP,BROADCAST,PROMISC,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255
ether 5e:04:f6:78:9a:01 txqueuelen 500 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
經過如上操作後,虛擬網卡已經建立和配置好了。
下面再用另一個命令添加一個tap1(參考https://www.mylinuxplace.com/create-taptun-device-centos-7/)
[root@VM_196_26_centos ~]# ip tuntap add tap1 mode tap
[root@VM_196_26_centos ~]# ifconfig tap1 10.0.0.1/30
[root@VM_196_26_centos ~]# ifconfig tap1
tap1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.0.0.1 netmask 255.255.255.252 broadcast 10.0.0.3
ether 2e:69:ab:20:0d:a7 txqueuelen 500 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3.最後怎麼刪除tap0、tap1呢?(參考的http://blog.csdn.net/zhaihaifei/article/details/23168621)
[root@VM_196_26_centos ~]#tunctl -d tap0
Set 'tap0' nonpersistent
[root@VM_196_26_centos ~]#tunctl -d tap1
Set 'tap1' nonpersistent
http://xxxxxx/Linuxjc/1184816.html TechArticle