使用 OVS 学习操作实施 OpenStack 安全组防火墙驱动程序

已发布:02/26/2016   最后更新时间:02/26/2016

作者:Rodolfo Alonso Hernández

推动因素

截至目前,OpenStack 的 Neutron 项目上仅实施了一个防火墙,即基于 iptables 的防火墙。 该防火墙能够较好地满足使用 Linux Bridge 的用户的网络需求。 但是,Linux Bridge 既不是 Neutron 上的唯一网络选项,也不是使用最多的一个。 使用最多的是 Open vSwitch (OVS),该网络选项目前为多达 46% 的 OpenStack 公共部署提供支持。 虽然 iptables 适用于使用 Linux Bridge 的部署,但是它对于 OVS 却并非最佳选择。 连接 iptables 与 Open vSwitch 需要进行大量的编码和网络,但实际上 OVS 本身已经提供了可用于部署内部规则的方法(使用 OpenFlow 协议)。我们应使用此方法,并且我们也已经这样做了。

我在此处展示的防火墙完全基于 OVS 规则,它是一个纯 OVS 模型,不依赖于底层平台的功能。 它用来与 Neutron 代理通信的公共 API 与现有的 Linux Bridge 防火墙实施相同,可支持已经使用 OVS 的用户直接完成过渡。

技术手段

2015 年 OpenStack 温哥华峰会上发布了一款新型防火墙。 虽然尚未实施,但是它利用了 Linux 的“conntrack (连接跟踪)”模块。 该模块可通过跟踪连接状态来实施“状态防火墙”。 据预计,使用连接跟踪可最大程度地降低用户空间处理流量包的需求,从而实现更高的性能。

另一方面,我们实施的防火墙基于“学习操作”。这些学习操作可跟踪一个方向的流量,然后设置一个新的流,允许流量向相反的方向流动。 该实施完全基于 OpenFlow 标准。

当添加工作组规则时,将会有一个“手动” OpenFlow 规则添加到 OVS 配置中。 例如,该新规则允许从特定端口进入 TCP 流量。 当某个数据包与该规则匹配时,“手动”规则便会允许该数据包传送至目的地。 但是,这只是新防火墙的一个主要方面,另一方面,该防火墙还会提供一个“自动”规则,将相反的流量回复发送回来源。

最初,我们担心由于使用学习操作会迫使所有数据包在用户空间处理,所以可能会影响性能。 但是,本篇博客下文提供的基准测试结果显示,该设计的性能高于 iptables。 更重要的是,该防火墙允许使用 OVS 的 DPDK,这要比没有防火墙的非 DPDK OVS 的性能高出 4 倍。

工作原理概述

流量分为内部虚拟机间的流量(东西流量)和内部机器和外部主机之间的流量(南北流量)。 安全组规则仅适用于由 Neutron 控制并包含一个或多个安全组的机器,这表示,只有计算主机内的虚拟机才会受到这些规则的影响。

在一个计算节点中,OVS 内会创建多个桥接来处理主机流量。 连接虚拟机的桥接即为“集成桥接”。 防火墙仅管理该桥接的规则。

数据包到达集成桥接后,该桥接上使用的防火墙规则将立即开始处理流量。 下文介绍了使用的 OVS 处理表和规则。

处理表详细介绍

下图展示了所使用的各种处理表和规则以及优先级(从最高至最低)。

表 0: 输入表

The Input Table

第一个表,即输入表(表= 0)是默认表,流入桥内的流量全部由该表处理。 ARP 包使用最高的权限处理。 VLAN 内的每个机器必须在其他 VLAN 机器中填充其地址。

其余流量(无 ARP 包)均发送至选择表。

表 1: 选择表

The Selection Table

选择表负责监控每个包是否来自或发送至虚拟机。 添加的规则可确保只有与存储的端口 MAC 地址、VLAN 标签和端口编号匹配的数据包才能够通过。 如果数据包为 DHCP 包,那么 IP 必须是 0.0.0.0。

不符合该规则的流量将丢掉。

表 2: 导入表

The Ingress Table

导入表有三种规则:

  • 当输出规则匹配时,将自动创建“学习”输入规则。 如前文所述,创建该输出规则还会激活反向输入规则的创建。
  • 服务输入规则始终由防火墙添加,以允许某些 ICMP 流量和 DHCP 消息。
  • 手动输入规则由安全组中的用户添加。

如果流量与这些规则不符,将会被丢掉。

表 3: 导出表

The Egress Table

导出表有三种规则(以及第四个):

  • 当输出规则匹配时,将自动创建“学习”输入规则。 如前文所述,创建该输出规则还会激活反向输入规则的创建。
  • 服务输出规则始终由防火墙添加,以允许某些 ICMP 流量和 DHCP 消息。
  • 手动输出规则由安全组中的用户添加。

如果流量与之前的规则不符,将发送至导出内部流量。

Egress external traffic

该表负责处理南北流量。 如果流量需要离开集成桥接,便会到达该表。 做最后的检查:如果该表的任何流量发送至虚拟机,那么该流量将被丢掉。 只有外部导入流量才必须由该表管理。 未被这些规则过滤的流量将使用“常规”操作发送。 数据包由 OVS 使用内置的 ARP 表发送。

性能指标评测

我们在采用两个英特尔® 至强™ 处理器 E5-2680 v2 (2.80GHz,40 线程)和 64 GB 内存的服务器上对该新防火墙进行了基准测试。

我们为该测试创建了唯一控制器/计算节点,并在同一台主机上运行了虚拟机。 虚拟机的配置为 Ubuntu* Desktop Edition 14.04 LTS (3.16.0-30 内核)、4GB 内存和 8 个核心。

为了在主机和虚拟机上注入流量,使用了 Ixia XG12 机箱和 10 Gbps 端口。

无 DPDK,无防火墙

数据包大小 \ 用户 1 10 100 1,000 10,000
64 93.14 86.66 98.58 96.41 101.38
128 121.08 122.29 118.03 121.78 118.17
256 144.93 197.10 197.08 197.09 197.08
512 366.59 421.05 420.78 420.88 420.83
1024 870.21 870.43 814.53 815.06 759.62
1280 1,122.00 984.45 1,053.85 1,053.03 929.00
1518 1,125.55 1,264.42 1,264.04 1,195.11 1,056.33

无 DPDK,iptables

数据包大小 \ 用户 1 10 100 1,000 10,000
64 93.18 91.38 84.75 92.83 84.20
128 101.06 88.33 94.29 87.51 90.16
256 197.10 144.75 197.10 196.90 144.86
512 421.05 312.54 312.78 366.90 312.78
1024 815.28 594.25 704.98 760.15 649.80
1280 984.56 707.33 984.57 983.91 818.45
1518 1,125.80 709.09 1,125.43 1,125.55 875.31

无 DPDK,学习操作

数据包大小 \ 用户 1 10 100 1,000 10,000
64 92.45 101.95 76.36 93.24 100.92
128 131.15 122.00 99.48 108.40 91.91
256 196.94 197.09 197.10 197.06 197.13
512 366.59 421.05 421.04 421.02 366.95
1024 759.61 870.34 815.04 870.21 704.87
1280 983.69 986.76 929.21 984.55 929.15
1518 931.07 1,264.45 986.17 1,264.32 931.54

无 DPDK,学习操作

数据包大小 \ 用户 1 10 100 1,000 10,000
64 1,641.76 923.58 952.42 1,010.71 910.67
128 2,761.31 1,575.62 1,578.31 1,708.01 1,543.14
256 5,257.29 3,188.03 3,186.35 3,350.85 3,074.94
512 8,946.62 5,304.72 5,393.62 5,616.17 5,410.86
1024 9,807.88 9,699.39 9,634.91 9,806.72 8,810.03
1280 9,845.58 9,845.57 9,845.55 9,845.53 9,845.50
1518 9,869.43 9,869.37 9,869.38 9,869.39 9,869.34

DPDK,学习操作

数据包大小 \ 用户 1 10 100 1,000 10,000
64 559.01 359.72 311.09 252.73 134.53
128 1,022.93 713.27 540.54 540.28 151.89
256 2,028.90 1,353.60 1,066.66 996.52 163.30
512 3,742.67 2,537.26 2,043.94 1,898.97 169.93
1024 6,619.18 4,817.83 3,829.52 3,712.83 248.32
1280 8,012.43 5,858.60 4,709.67 4,534.04 475.08
1518 8,946.96 6,786.09 5,472.00 5,296.74 551.59

注:这些表中展示的所有数据均为初步结果。 性能测试中使用的软件和工作负载可能仅在英特尔® 微处理器上进行了性能优化。 诸如 SYSmark* 和 MobileMark* 等测试均系基于特定计算机系统、硬件、软件、操作系统及功能。 上述任何要素的变动都有可能导致测试结果的变化。 请参考其它信息及性能测试(包括结合其它产品使用时的运行性能)以对目标产品进行全面评估。 如欲了解更多信息,请访问 http://www.intel.com/performance

如欲了解有关性能及性能指标评测结果的更完整信息,请访问 www.intel.com/benchmarks

如何部署

如要使该防火墙与 OVS DPDK 兼容,您需要下载 networking-ovs-dpdk 项目:

git clone https://github.com/stackforge/networking-ovs-dpdk.git

您还可将该项目安装为 PIP 包:

pip install networking-ovs-dpdk

如要启用防火墙,您可以将以下代码添加到您的 devstack/local.conf 文件中:

[[post-config|/etc/neutron/plugins/ml2/ml2_conf.ini]]
[securitygroup]
#firewall_driver = neutron.agent.linux.iptables_firewall
firewall_driver = networking_ovs_dpdk.agent.ovs_dpdk_firewall.OVSFirewallDriver

 

产品和性能信息

1

英特尔的编译器针对非英特尔微处理器的优化程度可能与英特尔微处理器相同(或不同)。这些优化包括 SSE2、SSE3 和 SSSE3 指令集和其他优化。对于在非英特尔制造的微处理器上进行的优化,英特尔不对相应的可用性、功能或有效性提供担保。该产品中依赖于微处理器的优化仅适用于英特尔微处理器。某些非特定于英特尔微架构的优化保留用于英特尔微处理器。关于此通知涵盖的特定指令集的更多信息,请参阅适用产品的用户指南和参考指南。

通知版本 #20110804