深入理解OpenStack Neutron
上QQ阅读APP看书,第一时间看更新

第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这样的设备,它的数据结构如下参考http://blog.chinaunix.net/uid-7220314-id-208711.html。

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的用法。