本文介绍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