1、neutron
1.1 neutron架构
neutron-server | 对外提供 OpenStack 网络 API,接收请求,并调用 Plugin 处理请求 |
Plugin | 处理 Neutron Server 发来的请求,维护 OpenStack 逻辑网络的状态, 并调用 Agent 处理请求 分为core plugin 和 service plugin,已经集成到 neutron server,不需要运行独立的 plugin 服务。 |
neutron-dhcp-agent | 提供DHCP服务 |
neutron-metadata-agent | 为虚拟机访问metadata服务提供网络通道 该agent 让 instance 能够通过 dhcp-agent 或者 l1-agent 与 nova-metadata-api 通信 |
neutron-openvswitch-agent | 配置openvswitch流表,提供二层转发路径 |
neutron-vc-vswitch-agent | 对接VMWare,将Neutron网络模型转换成VMWare的网络模型,形成统一虚拟网络 |
neutron-sriov-nic-agent | 支持SRIOV网卡虚拟化 |
network provider | 提供网络服务的虚拟或物理网络设备,例如 Linux Bridge,Open vSwitch 或者其他支持 Neutron 的物理交换机。 |
1.2 网络概念
参考:https://www.cnblogs.com/CloudMan6/p/5716947.html
1.3 部署架构
参考:https://www.cnblogs.com/CloudMan6/p/5710297.html
1.4 Neutron server
参考:https://www.cnblogs.com/CloudMan6/p/5718110.html
Core Plugin,其功能是维护数据库中 network, subnet 和 port 的状态,并负责调用相应的 agent 在 network provider 上执行相关操作,比如创建 network。
1.5 ML2 plugin替代原有的core plugin,减少开发成本和使用多个network provider
1.6 service plugin
参考:https://www.cnblogs.com/CloudMan6/p/5770744.html
Firewall 与 Security Group 的区别在于:
1、Firewall 安全策略位于 router,保护的是某个 project 的所有 network。
2、Security Group 安全策略位于 instance,保护的是单个 instance。
1.7 部署架构
参考:https://www.cnblogs.com/CloudMan6/p/5784099.html
1.8 linux-bridge
1.8.0 linux bridge 环境中的各种网络设备 参考: https://www.cnblogs.com/CloudMan6/p/5808629.html
一个数据包从 instance 发送到物理网卡会经过下面几个类型的设备:
1、tap interface 命名为 tapN (N 为 0, 1, 2, 1......)。 |
mechanism driver配置 参考 https://www.cnblogs.com/CloudMan6/p/5801450.html
1.8.1 local network配置 参考 https://www.cnblogs.com/CloudMan6/p/5811792.html
type_drivers = local
ps:local network下,只能同一主机内的vm可以互访
小结local network
1. 位于同一 local network 的 instance 可以通信。
2. 位于不同 local network 的 instance 无法通信。
1. 一个 local network 只能位于一个物理节点,无法跨节点。
通过gui创建network 参考 https://www.cnblogs.com/CloudMan6/p/5821721.html
instance连接到network 参考 https://www.cnblogs.com/CloudMan6/p/5818174.html
当 instance 启动时:
1. 宿主机上的 neutron-linuxbridge-agent 会根据 port 信息创建 tap 设备,并连接到 local 网络所在的linux bridge
2. 同时该 tap 会映射成instance的虚拟网卡,即 virtual interface (VIF),tapxxxxxx(xxxxxx对应port id)。
1.8.2 flat network 参考 https://www.cnblogs.com/CloudMan6/p/5869885.html
flat network配置: 参考 https://www.cnblogs.com/CloudMan6/p/5869885.html
在各节点 /etc/neutron/plugins/ml2/ml2_conf.ini 设置 flat network 相关参数:
type_drivers = local,flat,vlan,gre,vxlan
接着需要指明 flat 网络与物理网卡的对应关系:
ps:因为 flat 网络与物理网卡一一对应,一般情况下租户网络不会采用 flat
创建flat network 参考 https://www.cnblogs.com/CloudMan6/p/5875849.html
部署instance 参考 https://www.cnblogs.com/CloudMan6/p/5880194.html
1.8.3 配置dhcp服务 参考: https://www.cnblogs.com/CloudMan6/p/5887164.html
DHCP agent 在网络节点运行上,默认通过 dnsmasq 实现 DHCP 功能
linux namespace隔离 参考: https://www.cnblogs.com/CloudMan6/p/5894891.html
作用:Neutron 通过 namespace 为每个 network 提供独立的 DHCP 和路由服务,从而允许租户创建重叠的网络。
veth pair实现两个namespace互通
tap19a0ed1d-fe 与 ns-19a0ed1d-fe 就是一对 veth pair,它们将 qdhcp-f151b42f-c1a1-4b6c-8865-c09b5b2aa274 连接到 brqf151b42f-c1。如下图所示:
instance 获取 IP 的过程如下: 参考:https://www.cnblogs.com/CloudMan6/p/5905996.html
/1、cirros-vm1 开机启动,发出 DHCPDISCOVER 广播,该广播消息在整个 flat_net 中都可以被收到。 |
1.8.4 vlan network
ps:这里的eth1为trunk口
在ML2中配置Vlan Network 参考:https://www.cnblogs.com/CloudMan6/p/5922014.html
创建第一个vlan network 参考: https://www.cnblogs.com/CloudMan6/p/5927400.html
创建第二个vlan network 参考:https://www.cnblogs.com/CloudMan6/p/5914921.html
1.8.5 router network
简单介绍(路由服务提供跨valan间subnet 互联互通功能) 参考:https://www.cnblogs.com/CloudMan6/p/5950490.html
配置L1 agnet 参考:https://www.cnblogs.com/CloudMan6/p/5958211.html
创建 router 连通 subnet 参考:https://www.cnblogs.com/CloudMan6/p/5965919.html
虚拟router原理 参考:https://www.cnblogs.com/CloudMan6/p/5975106.html
l1 agent 会为每个 router 创建了一个 namespace,通过 veth pair 与 TAP 相连,然后将 Gateway IP 配置在位于 namespace 里面的 veth interface 上,这样就能提供路由了
namespace 中有两个 interface:
qr-e17162c5-00 上设置了 Gateway IP 172.16.101.1,与 root namespace 中的 tape17162c5-00 组成 veth pair。
qr-d568ba1a-74 上设置了 Gateway IP 172.16.100.1,与 root namespace 中的 tapd568ba1a-74 组成 veth pair。
网络结构如图所示:
为什么要用 namespace 封装 router? 参考:https://www.cnblogs.com/CloudMan6/p/5982514.html
其根本原因是:为了支持网络重叠。
不使用namespace,主机路由表会混乱,如下:
访问外网 ML2 的配置 参考:https://www.cnblogs.com/CloudMan6/p/5990577.html
如果类型为 flat,控制节点 /etc/neutron/plugins/ml2/ml2_conf.ini 配置如下:
如果类型为 vlan,配置如下:
修改配置后,需要重启 neutron 的相关服务。
创建flat外网 参考:https://www.cnblogs.com/CloudMan6/p/5998198.html
外网连接到 Neutron 的虚拟路由器 参考:https://www.cnblogs.com/CloudMan6/p/6005081.html
外网访问原理分析
当数据包从 router 连接外网的接口 qg-b8b12a88-01 发出的时候,会做一次 Source NAT,即将包的源地址修改为 router 的接口地址 10.10.10.2,
这样就能够保证目的端能够将应答的包发回给 router,然后再转发回源端 instance。SNAT 让 instance 能够直接访问外网,但外网还不能直接访问 instance
router 的每个 interface 在 namespace 中都有对应的 veth。
1、如果 veth 用于连接租户网络,命名格式为 qr-xxx,比如 qr-d568ba1a-74 和 qr-e17162c5-00。
2、如果 veth 用于连接外部网络,命名格式为 qg-xxx,比如 qg-b8b32a88-03。
创建float ip 实现外网能访问内容instance 参考:https://www.cnblogs.com/CloudMan6/p/6011051.html
floating IP 原理分析 参考:https://www.cnblogs.com/CloudMan6/p/6020949.html
qg-b8b12a88-01网卡下,有两个ip
iptables 增加了两条处理 floating IP 的规则:
1. 当 router 接收到从外网发来的包,如果目的地址是 floating IP 10.10.10.1,将目的地址修改为 cirros-vm1 的 IP 172.16.101.1。这样外网的包就能送达到 cirros-vm1。
2. 当 cirros-vm1 发送数据到外网,源地址 172.16.101.1 将被修改为 floating IP 10.10.10.1。
1.8.6 VXLAN network
VXLAN概念 参考:https://www.cnblogs.com/CloudMan6/p/6028281.html
VXLAN 封装和包格式
VXLAN Tunnel Endpoint
VXLAN 独立于底层的网络拓扑; 反过来,两个 VTEP 之间的底层 IP 网络也独立于 VXLAN。
VXLAN 数据包是根据外层的 IP header 路由的,该 header 将两端的 VTEP IP 作为源和目标 IP。
VXLAN 包转发流程 参考:https://www.cnblogs.com/CloudMan6/p/6014721.html
目前比较成熟的 VTEP 软件实现包括:
1、带 VXLAN 内核模块的 Linux
2、Open vSwitch
在 ML2 中配置 VXLAN 参考:https://www.cnblogs.com/CloudMan6/p/6042974.html
创建VXLAN 参考:https://www.cnblogs.com/CloudMan6/p/6051007.html
部署 instance 到 VXLAN 参考:https://www.cnblogs.com/CloudMan6/p/6058985.html
L2 Population作用(减少大量广播问题) 参考:https://www.cnblogs.com/CloudMan6/p/6064244.html
配置 L2 Population 参考:https://www.cnblogs.com/CloudMan6/p/6072115.html
1.87 Security Group 参考:https://www.cnblogs.com/CloudMan6/p/6081410.html
过 iptables 对 instance 所在计算节点的网络流量进行过滤
应用新安全组 参考:https://www.cnblogs.com/CloudMan6/p/6089115.html
安全组有以下特性:
1. 通过宿主机上 iptables 规则控制进出 instance 的流量。
2. 安全组作用在 instance 的 port 上。
3. 安全组的规则都是 allow,不能定义 deny 的规则。
4. instance 可应用多个安全组叠加使用这些安全组中的规则。
1.88 Firewall as a Service(FWaaS)
理解概念和配置 参考:https://www.cnblogs.com/CloudMan6/p/6099111.html
传统网络中的防火墙一般放在网关上,用来控制子网之间的访问。 FWaaS 的原理也一样,是在 Neutron 虚拟 router 上应用防火墙规则,控制进出租户网络的数据。
Firewall
租户能够创建和管理的逻辑防火墙资源。 Firewall 必须关联某个 Policy,因此必须先创建 Policy。
Firewall Policy
Policy 是 Rule 的集合,Firewall 会按顺序应用 Policy 中的每一条 Rule。
Firewall Rule
Rule 是访问控制的规则,由源与目的子网 IP、源与目的端口、协议、allow 或 deny 动作组成。
例如,我们可以创建一条 Rule,允许外部网络通过 ssh 访问租户网络中的 instance,端口为 22。
与 FWaaS 容易混淆的概念是安全组(Security Group)。
安全组的应用对象是虚拟网卡,由 L2 Agent 实现,比如 neutron_openvswitch_agent 和 neutron_linuxbridge_agent。
安全组会在计算节点上通过 iptables 规则来控制进出 instance 虚拟网卡的流量。
也就是说:安全组保护的是 instance。
FWaaS 的应用对象是 router,由 L1 Agent 实现,可以在安全组之前控制外部过来的流量,但是对于同一个 subnet 内的流量不作限制。
也就是说:FWaaS 保护的是 subnet。
所以,可以同时部署 FWaaS 和安全组实现双重防护。
添加无rule的firewall 参考:https://www.cnblogs.com/CloudMan6/p/6106441.html
在防火墙中添加一条规则 参考:https://www.cnblogs.com/CloudMan6/p/6112171.html
下面将 FWaaS 和安全组做个比较。 相同点: 1. 底层都是通过 iptables 实现。 不同点: 1. FWaaS 的 iptables 规则应用在 router 上,保护整个租户网络; 2. FWaaS 可以定义 allow 或者 deny 规则;安全组只能定义 allow 规则。 1. 目前 FWaaS 规则不能区分进出流量,对双向流量都起作用; |
1.89 Load Balance as a Service(LBaaS)负载均衡器 参考:https://www.cnblogs.com/CloudMan6/p/6121851.html
配置 参考:https://www.cnblogs.com/CloudMan6/p/6112578.html
创建 Pool & VIP 参考:https://www.cnblogs.com/CloudMan6/p/6119211.html
添加 Pool Member 参考:https://www.cnblogs.com/CloudMan6/p/6141656.html
创建 Monitor 并测试 参考:https://www.cnblogs.com/CloudMan6/p/6160225.html
LBaaS 实现机制 参考:https://www.cnblogs.com/CloudMan6/p/6171191.html
通过 floating IP 访问 VIP 参考:https://www.cnblogs.com/CloudMan6/p/6184912.html
2 openvswitch
2.1 启用 Open vSwitch 参考:https://www.cnblogs.com/CloudMan6/p/6195449.html
2.2 初始网络状态 参考:https://www.cnblogs.com/CloudMan6/p/6204547.html
2.3 OVS Local Network
创建 OVS Local Network 参考:https://www.cnblogs.com/CloudMan6/p/6212736.html
将 instance 部署到 OVS Local Network 参考:https://www.cnblogs.com/CloudMan6/p/6220469.html
为什么 tapfc1c6ebb-71 不能像左边的 DHCP 设备 tap7970bdcd-f2 那样直接连接到 br-int 呢?
其原因是: Open vSwitch 目前还不支持将 iptables 规则放在与它直接相连的 tap 设备上。
再部署一个 instance 和 Local Network 参考:https://www.cnblogs.com/CloudMan6/p/6227449.html
OVS local network 连通性分析 参考:https://www.cnblogs.com/CloudMan6/p/6234812.html
同一个local network下的vm1和vm2可以互通;
不同local network下,vm1和vm2不能互通,因为Open vSwitch 的每个网桥都可以看作一个真正的交换机,可以支持 VLAN,这里的 tag 就是 VLAN ID
2.4 OVS flat network
在 ML2 中配置 OVS flat network 参考:https://www.cnblogs.com/CloudMan6/p/6245478.html
配置完后,如下图
来 veth pair 和 patch port 都可以连接网桥,使用的时候如何选择呢?
1. 连接两个 ovs bridge,优先使用 patch port。技术上veth pair 也能实现,但性能不如 patch port。
2. 连接 ovs bridge 和 linux bridge,只能使用 veth pair。
3. 连接两个 linux bridge,只能使用 veth pair。
创建 OVS flat network 参考:https://www.cnblogs.com/CloudMan6/p/6254072.html
勾选dhcp,会创建dhcp
部署 instance 到 OVS flat network 参考:https://www.cnblogs.com/CloudMan6/p/6261959.html
vm1和vm2可以互通
2.5 OVS vlan network
在 ML2 中配置 OVS vlan network 参考:https://www.cnblogs.com/CloudMan6/p/6269931.html
需要提前通过 ovs-ovctl 命令:
1、创建 br-eth1。
2、将物理网卡 eth1 桥接在 br-eth1 上。
创建 OVS vlan100 netwrok 参考:https://www.cnblogs.com/CloudMan6/p/6277889.html
部署 instance 到 OVS vlan100 参考:https://www.cnblogs.com/CloudMan6/p/6287658.html
同一个vlan100下可以互通
创建 OVS vlan101 并部署 instance 参考:https://www.cnblogs.com/CloudMan6/p/6292809.html
cirros-vm3 被 schedule 到计算节点
cirros-vm1 与 cirros-vm2 都在 vlan100,它们之间能通信。
cirros-vm3 在 vlan101,不能与 cirros-vm1 和 cirros-vm2 通信。
分析 OVS 如何实现 vlan 隔离 参考:https://www.cnblogs.com/CloudMan6/p/6308552.html
Open vSwitch 通过 flow rule(流规则)来指定如何对进出 br-int 的数据进行转发,进而实现 vlan 之间的隔离
flow rule:
in_port
inbound 端口编号,每个 port 在 Open vSwitch 中会有一个内部的编号。
可以通过命令 ovs-ofctl show <bridge> 查看 port 编号
dl_vlan
数据包原始的 VLAN ID。
actions
对数据包进行的操作。
简单的说,数据包在物理网络中通过 VLAN 100 和 VLAN 101 隔离,在计算节点 OVS br-int 中则是通过内部 VLAN 1 和 VLAN 5 隔离。
2.6 OVS router
用虚拟 router 连通 subnet 参考:https://www.cnblogs.com/CloudMan6/p/6337076.html
Neutron Router 工作原理 参考:https://www.cnblogs.com/CloudMan6/p/6347172.html
创建的router如下:实现两个不同vlan互通
访问 Neutron 外部网络 参考:https://www.cnblogs.com/CloudMan6/p/6351625.html
外部网络是已经存在的物理网络,一般都是 flat 或者 vlan 类型
这里我们将外部网络的 label 命名为 “external”,网桥为 br-ex。
如果类型为 flat,控制节点 /etc/neutron/plugins/ml2/ml2_conf.ini 配置如下:
如果类型为 vlan,配置如下:
在我们的网络环境中,外部网络是 flat 类型。 修改配置后,需要重启 neutron 的相关服务。另外,我们需要提前准备好 br-ex,将 eth2 添加到 br-ex。
创建 OVS 外部网络 ext_net 参考:https://www.cnblogs.com/CloudMan6/p/6357311.html
将 ext_net 连接到 router 参考:https://www.cnblogs.com/CloudMan6/p/6358617.html
router interface 的命名规则如下:
1. 如果 interface 用于连接租户网络,命名格式为 qr-xxx。
2. 如果 interface 用于连接外部网络,命名格式为 qg-xxx。
如下图,实现route_100_101连接qg-cf54d3ea-6a
floating IP
通过 SNAT 使得 instance 能够直接访问外网,但外网还不能直接访问 instance。
直接访问 instance 指的是通信连接由外网发起,例如从外网 SSH instance。
如果需要从外网直接访问 instance,可以利用 floating IP。
Open vSwitch driver 环境中 floating IP 的实现与 Linux Bridge driver 完全一样:
都是通过在 router 提供网关的外网 interface 上配置 iptables NAT 规则实现
2.7 OVS VxLAN network
ML2 配置 OVS VxLAN 参考:https://www.cnblogs.com/CloudMan6/p/6360862.html
创建 vxlan 并部署 instance 参考:https://www.cnblogs.com/CloudMan6/p/6366459.html
OVS vxlan 底层结构分析 参考:https://www.cnblogs.com/CloudMan6/p/6376523.html
需要特别注意的是:无论存在多少个 VXLAN,devstack-controller 与 devstack-compute1 之间所有的数据都只通过 “vxlan-a642100b” 这对 port 上建立的隧道传输。
OVS VxLAN Flow 分析 参考:https://www.cnblogs.com/CloudMan6/p/6380708.html