重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
以Docker 容器的安全问题为例
创新互联是一家集网站建设,普定企业网站建设,普定品牌网站建设,网站定制,普定网站建设报价,网络营销,网络优化,普定网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
(1) Docker 自身安全
Docker 作为一款容器引擎,本身也会存在一些安全漏洞,CVE 目前已经记录了多项与 Docker 相关的安全漏洞,主要有权限提升、信息泄露等几类安全问题。
(2) 镜像安全
由于Docker 容器是基于镜像创建并启动,因此镜像的安全直接影响到容器的安全。具体影响镜像安全的总结如下。
镜像软件存在安全漏洞:由于容器需要安装基础的软件包,如果软件包存在漏洞,则可能会被不法分子利用并且侵入容器,影响其他容器或主机安全。
仓库漏洞:无论是Docker 官方的镜像仓库还是我们私有的镜像仓库,都有可能被攻击,然后篡改镜像,当我们使用镜像时,就可能成为攻击者的目标对象。
用户程序漏洞:用户自己构建的软件包可能存在漏洞或者被植入恶意脚本,这样会导致运行时提权影响其他容器或主机安全。
(3) Linux 内核隔离性不够
尽管目前Namespace 已经提供了非常多的资源隔离类型,但是仍有部分关键内容没有被完全隔离,其中包括一些系统的关键性目录(如 /sys、/proc 等),这些关键性的目录可能会泄露主机上一些关键性的信息,让攻击者利用这些信息对整个主机甚至云计算中心发起攻击。
而且仅仅依靠Namespace 的隔离是远远不够的,因为一旦内核的 Namespace 被突破,使用者就有可能直接提权获取到主机的超级权限,从而影响主机安全。
(4) 所有容器共享主机内核
由于同一宿主机上所有容器共享主机内核,所以攻击者可以利用一些特殊手段导致内核崩溃,进而导致主机宕机影响主机上其他服务。
既然容器有这么多安全上的问题,那么我们应该如何做才能够既享受到容器的便利性同时也可以保障容器安全呢?下面我带你来逐步了解下如何解决容器的安全问题。
如何解决容器的安全问题?
(1) Docker 自身安全性改进
事实上,Docker 从 2013 年诞生到现在,在安全性上面已经做了非常多的努力。目前 Docker 在默认配置和默认行为下是足够安全的。
Docker 自身是基于 Linux 的多种 Namespace 实现的,其中有一个很重要的 Namespace 叫作 User Namespace,User Namespace 主要是用来做容器内用户和主机的用户隔离的。在过去容器里的 root 用户就是主机上的 root 用户,如果容器受到攻击,或者容器本身含有恶意程序,在容器内就可以直接获取到主机 root 权限。Docker 从 1.10 版本开始,使用 User Namespace 做用户隔离,实现了容器中的 root 用户映射到主机上的非 root 用户,从而大大减轻了容器被突破的风险。
因此,我们尽可能地使用Docker 最新版本就可以得到更好的安全保障。
(2) 保障镜像安全
为保障镜像安全,我们可以在私有镜像仓库安装镜像安全扫描组件,对上传的镜像进行检查,通过与CVE 数据库对比,一旦发现有漏洞的镜像及时通知用户或阻止非安全镜像继续构建和分发。同时为了确保我们使用的镜像足够安全,在拉取镜像时,要确保只从受信任的镜像仓库拉取,并且与镜像仓库通信一定要使用 HTTPS 协议。
(3) 加强内核安全和管理
由于仅仅依赖内核的隔离可能会引发安全问题,因此我们对于内核的安全应该更加重视。可以从以下几个方面进行加强。
宿主机及时升级内核漏洞
宿主机内核应该尽量安装最新补丁,因为更新的内核补丁往往有着更好的安全性和稳定性。
使用Capabilities 划分权限
Capabilities 是 Linux 内核的概念,Linux 将系统权限分为了多个 Capabilities,它们都可以单独地开启或关闭,Capabilities 实现了系统更细粒度的访问控制。
容器和虚拟机在权限控制上还是有一些区别的,在虚拟机内我们可以赋予用户所有的权限,例如设置cron 定时任务、操作内核模块、配置网络等权限。而容器则需要针对每一项 Capabilities 更细粒度的去控制权限,例如:
cron 定时任务可以在容器内运行,设置定时任务的权限也仅限于容器内部;
由于容器是共享主机内核的,因此在容器内部一般不允许直接操作主机内核;
容器的网络管理在容器外部,这就意味着一般情况下,我们在容器内部是不需要执行ifconfig、route等命令的 。
由于容器可以按照需求逐项添加Capabilities 权限,因此在大多数情况下,容器并不需要主机的 root 权限,Docker 默认情况下也是不开启额外特权的。
最后,在执行docker run命令启动容器时,如非特殊可控情况,–privileged 参数不允许设置为 true,其他特殊权限可以使用 --cap-add 参数,根据使用场景适当添加相应的权限。
使用安全加固组件
Linux 的 SELinux、AppArmor、GRSecurity 组件都是 Docker 官方推荐的安全加固组件。下面我对这三个组件做简单介绍。
SELinux (Secure Enhanced Linux): 是 Linux 的一个内核安全模块,提供了安全访问的策略机制,通过设置 SELinux 策略可以实现某些进程允许访问某些文件。
AppArmor: 类似于 SELinux,也是一个 Linux 的内核安全模块,普通的访问控制仅能控制到用户的访问权限,而 AppArmor 可以控制到用户程序的访问权限。
GRSecurity: 是一个对内核的安全扩展,可通过智能访问控制,提供内存破坏防御,文件系统增强等多种防御形式。
这三个组件可以限制一个容器对主机的内核或其他资源的访问控制。目前,容器报告的一些安全漏洞中,很多都是通过对内核进行加强访问和隔离来实现的。
资源限制
在生产环境中,建议每个容器都添加相应的资源限制。下面给出一些执行docker run命令启动容器时可以传递的资源限制参数:
1 --cpus 限制 CPU 配额
2 -m, --memory 限制内存配额
3 --pids-limit 限制容器的 PID 个数
例如我想要启动一个1 核 2G 的容器,并且限制在容器内最多只能创建 1000 个 PID,启动命令如下:
1 $ docker run -it --cpus=1 -m=2048m --pids-limit=1000 busybox sh
推荐在生产环境中限制CPU、内存、PID 等资源,这样即便应用程序有漏洞,也不会导致主机的资源完全耗尽,最大限度降低安全风险。
(4) 使用安全容器
容器有着轻便快速启动的优点,虚拟机有着安全隔离的优点,有没有一种技术可以兼顾两者的优点,做到既轻量又安全呢?
答案是有,那就是安全容器。安全容器是相较于普通容器的,安全容器与普通容器的主要区别在于,安全容器中的每个容器都运行在一个单独的微型虚拟机中,拥有独立的操作系统和内核,并且有虚拟化层的安全隔离。
安全容器目前推荐的技术方案是Kata Containers,Kata Container 并不包含一个完整的操作系统,只有一个精简版的 Guest Kernel 运行着容器本身的应用,并且通过减少不必要的内存,尽量共享可以共享的内存来进一步减少内存的开销。另外,Kata Container 实现了 OCI 规范,可以直接使用 Docker 的镜像启动 Kata 容器,具有开销更小、秒级启动、安全隔离等许多优点。
在如今多租户模式的数据中心环境下,虚拟化技术正从传统的基于虚拟机管理程序的服务器虚拟化,扩展到网络虚拟化。在这种环境下,基于软件的虚拟交换机通常连同虚拟机管理程序一起部署在服务器上,串联起了不同虚拟机之间传送的流量。
我在本教程上将演示如何在Ubuntu或Debian上安装和配置KVM和Open vSwitch(OVS)。KVM和Open vSwitch分别是用于如今的数据中心中的最流行的开源虚拟机管理程序和虚拟交换机。
将Open vSwitch安装在Ubuntu或Debian上
虽然OVS以程序包的方式出现在Ubuntu或Debian上,但我在此还是通过源代码来构建OVS,这将拥有最新的功能特性和修正版。
首先,安装用于构建OVS的依赖项。
$ sudo apt-get install build-essential libssl-dev linux-headers-$(uname -r)
通过源代码来构建OVS,如下所示。下列步骤将构建OVS内核模块以及OVS用户空间工具。
$ wget
$ tar xvfvz openvswitch-1.9.3.tar.gz
$ cd openvswitch-1.9.3
$ ./configure --with-linux=/lib/modules/`uname -r`/build
$ make
接下来,继续在/usr/local/share/下安装OVS用户空间组件:
$ sudo make install
下一步是,测试OVS内核模块(安装该模块之前)。为此,先在内核中装入内核模块。
$ sudo insmod ./datapath/linux/openvswitch.ko
证实OVS内核模块已成功装入。
$ lsmod | grep openvswitch
openvswitch 97934 0
一旦你证实openvswitch.ko已成功装入到内核中,继续安装内核模块,如下所示。
$ sudo make modules_install
配置和启动Open vSwitch
创建一个框架式OVS配置数据库。
$ sudo mkdir /etc/openvswitch
$ sudo ovsdb-tool create /etc/openvswitch/conf.db ./vswit
chd/vswitch.ovsschema
启动OVS数据库服务器。
$ sudo ovsdb-server --remote=punix:/usr/local/var/run/ope
nvswitch/db.sock - remote=db:Open_vSwitch,manager_options
--pidfile --detach
OVS配置数据库初始化。
$ sudo ovs-vsctl --no-wait init
最后,启动OVS守护程序。
$ sudo ovs-vswitchd --pidfile --detach
将KVM安装在Ubuntu或Debian上
使用apt-get命令,安装KVM和必要的用户空间工具。
$ sudo apt-get install qemu-kvm libvirt-bin bridge-utils
virt-manager
将一个普通的非根用户(如alice)添加到libvirtd群组,那样该用户不需要根用户权限,就能启动虚拟机。
$ sudo adduser alice libvirtd
退出,重新以该用户身份登录,让群组成员的变更生效。
运行下面这个命令。如果你看到空空如也的虚拟机列表,这意味着KVM已成功设置完毕。
$ virsh -c qemu:///system list
Id Name State
为KVM配置Open vSwitch
现在是时候创建OVS网桥启动脚本了,那样启动或终止虚拟机时,OVS就能自动配置。
安装依赖项(用户模式Linux实用工具),这些依赖项将用于处理Linux网桥模式。
$ sudo apt-get install uml-utilities
创建网桥启动脚本,如下所示。
$ sudo vi /etc/openvswitch/ovs-ifup
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1
$ sudo vi /etc/openvswitch/ovs-ifdown
#!/bin/sh
switch='br0'
/sbin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
$ sudo chmod +x /etc/openvswitch/ovs-if*
然后,创建一个默认的网桥br0,并添加一个物理网络接口,虚拟机将通过这个接口与外部网络进行联系。在该教程中,我假设这类网络接口是eth5。
$ sudo ovs-vsctl add-br br0
$ sudo ovs-vsctl add-port br0 eth5
借助KVM启动虚拟机
现在你可以准备启动访客虚拟机了。
我假设,你已经准备好了一个访客虚拟机映像(比如ubuntu-client.img)。使用下面这个命令,启动访客虚拟机。
$ sudo kvm -m 1024 -net nic,macaddr=11:11:11:EE:EE:EE -ne
t tap,script=/etc/openvswitch/ovs-ifup,downscript=/etc/op
envswitch/ovs-ifdown -vnc :1 -drive file=/home/dev/images
/ubuntu-client.img,boot=on
这会创建并启动一个访客虚拟机;一旦访客虚拟机启动,其虚拟接口就自动添加到OVS网桥br0。
你可以使用ovs-vsctl这个命令,核实OVS的状态,如下所示。
这是已启动的虚拟机的远程桌面会话。
Neutron能提供虚拟的分布式(这样就可以实现跨物理机虚机在同一个vlan)二层vswitch(提供虚拟的network\subnet\port)、三层router、防火墙、负载均衡等抽象网络功能,能为每个租户提供独立的虚拟网络环境,neutron是用来创建虚拟网络的,所谓虚拟网络,就是虚拟机启动的时候会有一个虚拟网卡,虚拟网卡会连接到虚拟switch上,虚拟交换机连接到虚拟router上,虚拟路由器最终和物理网卡联通,从而虚拟网络和物理网络联通起来。
Neutron一般包括三种网络:
1、External Network/API Network,这个网络是链接外网的,无论是用户调用OpenStack的API,还是创建出来的虚拟机要访问外网,或者外网要ssh到虚拟机,都需要通过这个网络。
2、Data Network,数据网络,虚拟机之间的数据传输通过这个网络来进行,比如一个虚拟机要连接到另一个虚拟机,虚拟机要连接虚拟路由都是通过这个网络来进行
3、Management Network,管理网络,OpenStack各个模块之间的交互,连接数据库,连接Message Queue都是通过这个网络来进行。
Horizon上创建一个neutron网络的过程:
1、为这个Tenant创建一个private network,不同的private network是需要通过VLAN tagging进行隔离的,互相之间广播(broadcast)不能到达,这里我们我们用的是GRE模式,也需要一个类似VLANID的东西,称为Segment ID(当然也可以是FLAT模式,不用vlan)
2、为private network创建一个subnet,subnet才是真正配置IP网段的地方,对于私网,我们常常用192.168.0.0/24这个网段
3、为这个Tenant创建一个Router,才能够访问外网
4、将private network连接到Router上
5、创建一个External Network((就是我们上面设置的192.168.226.138,ens37))
6、创建一个External Network的Subnet,这个外网逻辑上代表了我们数据中心的物理网络,通过这个物理网络,我们可以访问外网。因而PUBLIC_GATEWAY应该设为数据中心里面的Gateway,PUBLCI_RANGE也应该和数据中心的物理网络的CIDR一致,否则连不通。之所以设置PUBLIC_START和PUBLIC_END,是因为在数据中心中,不可能所有的IP地址都给OpenStack使用,另外的可能搭建了VMware Vcenter,可能有物理机,所以仅仅分配一个区间给OpenStack来用。
7、将Router连接到External Network
更多信息可以参考《Linux就该这么学》
管理员创建外网
我们说过外网要由管理员创建。假设我们拿到的外部网络的IP地址是20.0.2.0/24,可用的地址段是20.0.2.10-20.0.2.20,网关是20.0.2.1。我们现在就以管理员的身份在horzion上创建一个外网和子网:
以管理员身份登录后,选择管理员面板,点击’Networks’项后显示当前网络列表:
在上图中点击“Create Network”按钮弹出“Create Network”窗口:在上面的弹出窗口中,填入网络名:ExternalNet,而且勾选External Network然后点击“Create Network”。
下面是我们刚才创建好的网络:
现在我们点击“ExternalNet”查看这个网络的详细情况:
在网络详细情况页面中,我们点击“Create Subnet”弹出窗口创建外部网络的子网:
这是一个多标签页面,在上面的“Subnet”页面中填入子网名,子网CIDR(Network Address)。在下面的“Subnet Detail”页中填入地址范围:
注意:因为外部网络不挂接虚拟机,可以不选泽“Enable DHCP“。最后点击子网创建窗口上的“Create”完成子网的创建。
租户demo创建租户网络
我们现在以普通租户登录horizon,并点击“Netowrks”项:
点击上图的“Create Network”弹出租户网络创建窗口:
显然,这是一个多Tab的界面,和我们先前管理员创建网络的界面不一样。在这个界面里,我们可以一气完成网络和子网的创建。我们在“Network”页中填入网络名,在“Subnet”页中填入CIDR (Network Address):
“Subnet Datail”页面可以让我们填入IP地址池,缺省情况是Neutron使用整个CIDR规定的地址范围。所以我们不关心“Subnet Datail”页面。我们点击“Create”按钮完成租户子网的创建。
租户创建路由器
选择“Routers”项,系统显示如下页面:
创建路由器
点击右面的“Create Router”弹出路由器创建对话框:
这个对话框及其简单,我们只需输入所有的路由器的名字,然后点击“Create Router”创建路由器。
配置网关臂
路由器创建出来之后,会显示在路由器列表中:
我们点击“Set Gateway”来设置这个路由器的网关臂:
如上图所示,我们选择管理员创建好的外部网络“ExternalNet”,然后点击“Set Gateway”。
配置接口臂
下图显示了租户刚才创建的路由器及其网关臂:
现在我们点击路由器名字查看路由器详情:
为了设置路由器的接口臂,我们点击“Add Interface”按钮弹出“Add Interface”窗口:
上图显示的窗口,我们只需选择我们所要连接的子网,然后点击“Add Interface”。
现在这个租户的路由器以及连接了外网和租户的子网,接下来这个租户可以创建虚拟机,这个虚拟机借助路由器就可以访问外部网络甚至互联网。
租户创建虚拟机
这里不想详述创建虚拟机的过程,我们着重叙述一下这个过程中如何选择网络:
从上面的图中我们可以看出,租户可以选择的网路包括了租户刚才创建的网络。点击网络右边的“+”符号,或者拖拽这个网络进入“Selected Networks”框中,租户所创建的虚拟机就会使用这个网络。
租户查看网络拓扑
最后我想要说的是Horizon工程师费尽心思实现的网络拓扑图:
从这个拓扑图可以看到我们前面所有操作的结果:
绿色的是管理员创建的外部网络
跨在外部网络和租户网络上的是具有网关臂和接口臂的路由器
蓝色的是租户网路及其子网
最后是租户创建的虚拟机
点击拓扑图上的虚拟机图像,我们可以使用VNC访问虚拟机的控制台,如下图所示:
我们可以看出,这个虚拟机从租户网络中获取到了IP地址:10.0.1.3。它通过租户自己的路由器能访问互联网。
总结
是不是有了Neutron就不需要物理网络的网络工程师了呢?不是的。虚拟网络的负载最终还需要跑到物理网络上去传递,Neutron只不过是把部分传统网络管理的功能推到了租户方,比如租户可以创建一个虚拟网络及其子网,创建一个路由器等等,这个从上面的操作中可以看出来。在虚拟网络功能的帮助下,基础物理网络就可以向外提供额外的网络服务了,比如租户完全可以创建一个属于自己的类似于数据中心网络的虚拟网络。
Neutron提供了比较完善的多租户环境下的虚拟网络模型以及API。像部署物理网络一样,使用Neutron创建虚拟网络时也需要做一些基本的规划和设计。本文提出了一个Neutron环境下的典型网络结构和Horzion下的操作流程。在后续的博客中,我会继续介绍Neutron的其它功能,比如负载均衡,防火墙,VPN等。
Neutron 默认使用 ML2 作为 core plugin,配置文件 /etc/neutron/neutron.conf 中 core_plugin
计算节点和控制节点都需要在各自的 neutron.conf 中配置 core_plugin
然后配置 ML2 的配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中 mechanism_drivers
mechanism_drivers 可以同时指定多个。这里只指定了一个。
查看 linuxbridge 进程
控制节点:
计算节点:
在 Linux Bridge 环境中,一个数据包从 Instance 发送到物理网卡会经过下面几个类型的设备:
对于每个 local network,ML2 linux-bridge 会创建一个 bridge,Instance 的 tap 设备会连接到 bridge。位于同一个 local network 的 Instance 会连接到相同的 bridge,这样 Instance 之间就可以通讯了。
因为 local network 没有与物理网卡相连,所以 Instance 无法与宿主机之外的网络通信。
同时因为每个 local network 有自己的 bridge,bridge 之间是没有连通的,所以两个 local network 之间是不通的。
ML2 配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini
type_drivers ML2 加载网络类型。
tenant_network_types 普通用户在自己的 Tenant(Project)中创建网络时,默认创建哪种 type 的网络。
tenant_network_types = vlan, local 意思是当没有 vlan 可创建时,使用 local。
检测 Neutron Agent 是否正常 管理员 -- 系统 -- 系统信息 -- 网络代理
从用户管理创建网络
创建网络 项目 -- 网络 -- 网络
填写网络名称
填写子网信息。 网关 IP 可以不用填写。默认为子网地址的第一个 IP。即:172.16.10.1
添加子网 IP 范围。
点击网络名称,进去相信信息,可以看到子网和端口信息等。
可以看到在端口中已经创建了一个 port,名为 “(c45b69e6-04ba)”,IP 为 172.16.10.2。连接设备为 "network:dhcp"。
打开控制节点终端,使用 brctl show 查看 linux bridge 的状态。
可以看到 bridge 设备 brqd2fd4378-9e 和 tap 设备 tapc45b69e6-04
创建 Instance 并选择刚刚创建的网络。
创建 Instance 成功后可以发现已经分配 IP 地址。
在底层中 Neutron 会在 subnet 中创建一个 port,分配 IP 和 MAC 地址,并将 port 分配给 test。如下图
点进去可以看到详情
在宿主机上执行 brctl show 可以查看 bridge 的配置。
可以看到 bridge brqd2fd4378-9e 上连接了一个新的 tap 设备。
查看 Instance 信息。使用 virsh list 查看 Instance 运行中的列表。
使用 virsh edit 1 查看配置信息。
配置信息省略很多。重要的放在上面。
mac address='fa:16:3e:19:e1:57'/ 是 Instance 网卡的 MAC 地址
target dev='tapb337d11f-54'/ 是 Instance 虚拟网卡信息
ping test1 的 IP 地址发现是可以 ping 通。
查看 brctl show
发现 brqd2fd4378-9e 中又计入进来一个 VIF,因为两个 VIF 挂载在同一个 Linux Bridge 上,所以可以通讯。
结构如下:
如果新分的 Instance 在计算节点中。不在控制节点。他们之间将不在互通。
因为 DHCP agent 在控制节点上运行,test2 在计算节点的 local 网络上,两者位于不同物理节点。由于 local 网络的流量只能局限在本节点之内,发送的请求无法到达计算节点。
上图 物理网卡 eth1 桥接到 brqXXXX,为 Instance 提供 flat 网络。
下图 创建多个 flat Network,就要准备多个物理机网卡。
在 /etc/neutron/plugins/ml2/ml2.conf.ini 配置文件中,修改 tenant_network_types 参数为 flat
:这里是指定普通用户使用 flat。因为 flat 网络与物理网卡一一对应。一般情况下租户网络不采用 flat。
flat_networks 定义一个 flat 网络,label 为 “default”
通过 physical_interface_mappings 指名 default 对应的物理网卡为 ens35
例如:对于 label 为 “default” 的 flat network,节点 A 可能使用 ens35,配置为:
而 B 节点则可以使用 ens33,配置为:
创建 flat 网络
绑定子网
查看 控制节点网络状态
Neutron 自动新建了 flat_net 对应的网桥 brq9e3013c8-93,以及 dhcp 的 tap 设备 tap50802894-1a。
此时 tap50802894-1a 和物理网卡 ens35 都已经连接到网桥 brq9e3013c8-93 上。
可以看到 Instance 的 tap 设备 tapc1241c3f-cb 已经连接到网桥
配置文件 /etc/neutron/dhcp_agent.ini 中的 dhcp_driver 和 interface_driver
dnsmasq 是一个提供 DHCP 和 DNS 服务的开源软件。
在实现环境中使用 ps 命令可以查看到 dnsmasq 进程。
DHCP agent 会为每个 network 创建一个目录 /opt/stack/data/neutron/dhcp/xxxx 用于存放该 network 的 dnsmasq 配置文件。
在二层网络上,VLAN 可以将一个交换机分割成几个独立的虚拟交换机。
类似,在三层网络上,Linux Network Namespace 可以将一个物理三层网络分割成几个独立的虚拟三层网络。
每个 namespace 都有自己独立的网络栈,包括 route table,firewall rule,network interface device等
Neutron 通过 dnsmasq 为每个 Network 提供单独的 DHCP 和路由服务。
使用 ip 查看所有 namespcae
使用 neutron 查看 net-list
查看某个 namespace 的详细配置
3 个 Instance 通过 tap 设备连接到名为 “vrqXXXX” 的 Linux Bridge。
在物理网卡 eth1 上创建 eth1.100 的 valn interface,eth1.100 连接到 brqXXXX。
这样,Instance 通过 eth1.100 发送到 eth1 的数据包就会打上 vlan100 的 tag。
如果在创建个 network vlan101,eth1 上就会相应的创建多个 vlan interface eht1.101 并连接新的 Linux Bridge “brqYYYY”。
配置文件 /etc/neutron/plugins/ml2/ml2_conf.ini 中设置 tenant_network_types 的值为 vlan
配置 vlan 的范围
意思是:配置定义了 lable 为 “default” 的 valn network,valn id 的范围是 3001~4000。这里配置的是普通用户使用的范围。
admin 可以使用 1~4096 的 valn network
再次指定 vlan network 与物理网卡的对应关系
配置子网
查看系统网桥
这里可以看到:
vlan100 对应的网桥为 brq2b85ebb9-a。
vlan interface 是 ens35.100 (我是用的是 Ubuntu 16.04 默认网卡名 ens 开始的。)
DHCP 的 tap 设备是 tapf85d61d8-c3。
在 计算节点查看 网桥信息
可以发现创建的 Instance 已经连接到 vlan100 对应的网桥 brq2b85ebb9-a 上。因为计算节点没有 DHCP 服务所以没有相应的 tap 设备。
另外 网桥的名字与控制节点是一样的,都是 brq2b85ebb9-a6,表示是在同一个 network 上。
下图是我创建 VLAN 后 两台 Instance 分别在控制节点和计算机点的网络图
此时两台 Instance 在同一 valn100 下。相互之间是可以 ping 通的。
如果在创建一个 vlan101。如果两台 Instance1 和 Instance2 分别连在 vlan100 和 vlan101。此时两台 Instance 是不能 ping 通的。
如下图两个 vlan
两台 Instance1 和 Instance2 分别连在 vlan100 和 vlan101。此时两台 Instance 是不能 ping 通的。
因为 vlan 在二层是隔离的。如果想要互通,只能在三层通过路由转发。