第2章 Linux虚拟网络基础
Neutron在构建网络服务时,利用了很多Linux虚拟网络功能(Linux内核中的虚拟网络设备以及其他网络功能)。为了对Neutron有一个全面的理解,掌握一些Linux虚拟网络知识是必要的。本章将从使用方法入手,对与Neutron密切相关的Linux虚拟网络功能进行简单介绍。
2.1 tap
Linux在谈到tap时,经常会与tun并列谈论。两者都是操作系统内核中的虚拟网络设备。tap位于二层,tun位于三层。需要说明的是,这里所说的设备(Device)是Linux的概念,不是我们平时生活中所说的设备。比如,生活中,我们常常把一台物理路由器称为一台设备,如图2-1所示。
图2-1 一台路由器设备
而Linux所说的设备,其背后指的是一个类似于数据结构、内核模块或设备驱动这样的含义。像tun/tap这样的设备,它的数据结构如下:
struct tun_struct { char name[8]; //设备名 unsigned long flags; //区分tun和tap设备 struct fasync_struct *fasync; //文件异步通知结构 wait_queue_head_t read_wait; //等待队列 struct net_device dev; //Linux抽象网络设备结构 struct sk_buff_head txq; //网络缓冲区队列 struct net_device_stats stats; //网卡状态信息结构 };
我们看到,甚至连数据结构,tap与tun的定义都是同一个,两者仅仅是通过一个Flag来区分。不过从背后所承载的功能而言,两者还是有比较大的区别:tap位于网络OSI模型的二层(数据链路层), tun位于网络的三层。本节暂时只介绍tap, tun会在后面的章节专门介绍。
tap从功能定位上来讲,位于数据链路层,数据链路层的主要协议有:
1)点对点协议(Point-to-Point Protocol);
2)以太网(Ethernet);
3)高级数据链路协议(High-Level Data Link Protocol);
4)帧中继(Frame Relay);
5)异步传输模式(Asynchronous Transfer Mode)。
但是tap只是与其中一种协议以太网(Ethernet)协议对应。所以,tap有时也称为“虚拟以太设备”。
要想使用Linux命令行操作一个tap,首先Linux得有tun模块(Linux使用tun模块实现了tun/tap),检查方法如下:
# 如果敲击Linux命令行modinfo tun,有如下输出,则说明具有tun模块 modinfo tun filename: /lib/modules/4.5.5-300.fc24.x86_64/kernel/drivers/net/tun.ko.xz alias: devname:net/tun alias: char-major-10-200 ......
当Linux版本具有tun模块时,还得看看其是否已经加载,检查方法如下:
lsmod | grep tun tun 28672 2
如果已经加载,则会出现上述的“tun***”那一行。如果没有加载,则使用如下命令进行加载:
modprobe tun
当我们确认Linux加载了tun模块以后,我们还需要确认Linux是否有操作tun/tap的命令行工具tunctl。在Linux中输入以下命令:
tunctl help
输入这个命令后,如果Linux有输出,则说明OK,否则我们执行如下命令行以安装tunctl:
yum install tunctl
具备了tun和tunctl以后,我们就可以创建一个tap设备了,命令行也很简单,如下:
tunctl -t tap_test Set 'tap_test' persistent and owned by uid 0
我们可以通过如下命令来查看刚刚创建的tap(名字是tap_test):
ip link list ... 13: tap_test: <BROADCAST, MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/ether 2e:72:30:19:4e:bb brd ff:ff:ff:ff:ff:ff
我们也可以通过如下命令来查看:
ifconfig -a ... tap_test: flags=4098<BROADCAST, MULTICAST> mtu 1500 ether 2e:72:30:19:4e:bb txqueuelen 1000 (Ethernet) ...
通过上面的命令行输出,我们看到,这个tap_test还没有绑定IP地址。执行如下命令,给其绑定IP地址:
# 使用ip addr命令绑定IP地址命令 ip addr add local 192.168.100.1/24 dev tap_test # 或者使用ifconfig命令绑定IP地址命令 ifconfig tap_test 192.168.100.1/24
使用ifconfig -a命令再查看一下:
ifconfig -a ...... tap_test: flags=4099<UP, BROADCAST, MULTICAST> mtu 1500 inet 192.168.100.1 netmask 255.255.255.0 broadcast 0.0.0.0 ......
配置完IP以后,一个tap设备就创建完毕了。我们会在后面的章节中通过测试用例,继续讲述tap的用法。