Linux虚拟网络基础—tap(虚拟以太设备)
前言
虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装。本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路。
tun/tap驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。利用tun/tap驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。
tap 和 tun 的区别:
tap位于网络OSI模型的二层(数据链路层),tun位于网络的三层。这里就先简单的对tap进行一下说明。
Linux主机上tap实践
如果想使用linux命令行操作一个tap,首先Linux得有tun模块(Linux使用tun模块实现了tun和tap)。
检查方法如下:
# 如果使用命令 modinfo tun,有输出的话,就说明具有tun模块
[root@public ~]# modinfo tun
filename: /lib/modules/3.10.0-693.11.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
rhelversion: 7.4
srcversion: 4E9F57A6269CFD0F4BE4021
depends:
intree: Y
vermagic: 3.10.0-693.11.1.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: 61:B8:E8:7B:84:11:84:F6:2F:80:D6:07:79:AB:69:2A:49:D8:3B:AF
sig_hashalgo: sha256
[root@public ~]#
当Linux版本具有tun模块时,还得看看其是否已经加载,检查方式如下:
# 使用该命令检查后,无回显,表示当前未加载该模块
[root@public ~]# lsmod | grep tun
[root@public ~]#
# 使用该命令加载该模块
[root@public ~]# modprobe tun
[root@public ~]#
[root@public ~]# lsmod | grep tun
tun 31621 0
加载模块后,还需要Linux是否有操作tun/tap的命令行工具tunctl。
# 可以使用yum直接安装,如果yum源中没有的话,可以去阿里源的网站中下载rpm包然后安装。
[root@public ~]# yum -y install tunctl
具备tun模块和tunctl以后,就可以创建一个tap设备,命令:
[root@public ~]# tunctl -t tap_test
Set 'tap_test' persistent and owned by uid 0
[root@public ~]# ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether fa:16:3e:08:0b:39 brd ff:ff:ff:ff:ff:ff
3: tap_test: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether ce:cc:18:91:1e:ba brd ff:ff:ff:ff:ff:ff
[root@public ~]#
添加IP地址:
[root@public ~]# ip addr add local 192.168.10.100/24 dev tap_test
[root@public ~]# ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether fa:16:3e:08:0b:39 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.93/24 brd 192.168.10.255 scope global noprefixroute dynamic eth0
valid_lft 75733sec preferred_lft 75733sec
inet6 fe80::f816:3eff:fe08:b39/64 scope link
valid_lft forever preferred_lft forever
3: tap_test: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether ce:cc:18:91:1e:ba brd ff:ff:ff:ff:ff:ff
inet 192.168.10.100/24 scope global tap_test
valid_lft forever preferred_lft forever
[root@public ~]#