本文介绍Linux
虚拟网络设备 tap/tun
,该部分是云计算
、容器
等虚拟化技术网络部分的基础。
tap/tun
tap/tun
是 Linux
内核 2.4.x
后实现的虚拟网络设备
,tap/tun 虚拟网卡
实现了物理网卡的所有功能,可以配置 IP,都归 Linux 网络设备管理模块
统一管理,tap
工作在数据链路层
,也称虚拟以太设备
。
tap/tun
驱动包括两部分:
tap/tun
对应的字符设备
文件分别为:
- tap:/dev/tap0
- tun:/dev/net/tun
tap/tun
设备文件像一个管道,一端连接着用户空间
,一端连接着内核空间
。当用户程序向文件 /dev/net/tun
或 /dev/tap0
写数据时,内核就可以从对应的 tunX
或 tapX
接口读到数据。简单的说:操作系统
通过 TUN/TAP
设备向绑定该设备的 用户空间的程序
发送数据,反之,用户空间的程序
也可以像操作 硬件网络设备
那样,通过 TUN/TAP
设备发送数据。
tap/tun
的区别:
tap
是二层设备(或者以太网设备
),只处理二层的以太网帧
tun
是一个点对点
的三层设备(或网络层设备),只处理三层的 IP 数据包
tun/tap
常用于隧道通信,比如 VPN
等
tun/tap
查看
查看命令:
$ modinfo tun
filename: /lib/modules/3.10.0-1160.6.1.el7.x86_64/kernel/drivers/net/tun.ko.xz
alias: devname:net/tun
alias: char-major-10-200
license: GPL
author: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
description: Universal TUN/TAP device driver
retpoline: Y
rhelversion: 7.9
srcversion: E26A36A927427B2BAE3FB17
depends:
intree: Y
vermagic: 3.10.0-1160.6.1.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: 6A:DD:D0:96:21:8C:B2:B4:3D:F9:3C:C9:56:82:39:8F:4D:F6:B1:DB
sig_hashalgo: sha256
Linux
使用tun
模块实现了tun
和tap
。
lsmod | grep tun
# 未加载,触发加载
modprobe tun
工具
ip tuntap
$ ip tuntap help
Usage: ip tuntap { add | del | show | list | lst | help } [ dev PHYS_DEV ]
[ mode { tun | tap } ] [ user USER ] [ group GROUP ]
[ one_queue ] [ pi ] [ vnet_hdr ] [ multi_queue ] [ name NAME ]
Where: USER := { STRING | NUMBER }
GROUP := { STRING | NUMBER }
$ ip tuntap add dev tap0 mod tap # 创建 tap
$ ip tuntap add dev tun0 mod tun # 创建 tun
$ ip tuntap show
tap0: tap UNKNOWN_FLAGS:800
tun0: tun UNKNOWN_FLAGS:800
$ ip tuntap del dev tap0 mod tap # 删除 tap
$ ip tuntap del dev tun0 mod tun # 删除 tun
tunctl
yum -y install http://rpmfind.net/linux/opensuse/distribution/leap/15.3/repo/oss/x86_64/tunctl-1.5-1.26.x86_64.rpm
$ tunctl -t tap0 -u root
$ ifconfig tap0 192.168.0.1 netmask 255.255.255.0 promisc
$ ip a show tap0
17: tap0: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 6a:ed:1c:56:95:63 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/24 brd 192.168.0.255 scope global tap0
valid_lft forever preferred_lft forever
$ brctl addbr br0
$ brctl addif br0 tap0
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.06d935e09ee1 no tap0
$ brctl showmacs br0
port no mac addr is local? ageing timer
3 6a:ed:1c:56:95:63 yes 0.00
3 6a:ed:1c:56:95:63 yes 0.00