第 15 章 配置 Firewall-as-a-Service(FWaaS)

Firewall-as-a-Service (FWaaS) 插件为 OpenStack Networking (neutron) 添加了边界防火墙(perimeter firewall)管理功能。FWaaS 使用 iptables 在一个项目的所有虚拟路由上应用防火墙规则,并支持在一个项目中使用一个防火墙策略和逻辑防火墙实例。

FWaaS 在网络边界进行操作,它会对 OpenStack Networking (neutron) 的路由进行过滤。这一点和安全组有所不同,安全组在实例一级进行操作。

注意

FWaaS 当前还是一个技术预览,我们不推荐您在未经测试的情况下使用它。

以下的图例显示了 VM2 实例的出站和入站网络数据的流程:

fwaas

图 1. FWaaS 结构

15.1. 启用 FWaaS

1.neutron.conf 文件中启用 FWaaS 插件:

service_plugins = neutron.services.firewall.fwaas_plugin.FirewallPlugin

2.fwaas_driver.ini 文件中配置 FWaaS:

[fwaas]
driver = neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver
enabled = True

[service_providers]
service_provider=LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default

3. FWaaS 管理选项包括在 OpenStack 的 dashboard 中。在 local_settings.py 文件中(通常位于 Controller 节点上)启用这个选项:

/usr/share/openstack-dashboard/openstack_dashboard/local/local_settings.py
'enable_firewall' = True

15.2. 配置 FWaaS

先创建防火墙规则以及包括它们的防火墙策略,然后再创建防火墙来应用这个防火墙策略:

1. 创建一个防火墙规则:

$ neutron firewall-rule-create --protocol <tcp|udp|icmp|any> --destination-port <port-range> --action <allow|deny>

CLI 需要一个协议值,如果防火墙规则与协议无关,则可以使用任何值。

2. 创建一个防火墙策略:

$ neutron firewall-policy-create --firewall-rules "<firewall-rule IDs or names separated by space>" myfirewallpolicy

以上指定的规则顺序非常重要。您可以先创建一个空的防火墙规则,以后再添加规则(使用 update 操作来添加多个规则,或使用 insert-rule 操作来添加一个规则)。

请注意: FWaaS 总会在每个策略的最后添加一个默认的禁用所有网络数据的规则。因此,没有任何规则的防火墙策略会在默认情况下阻止所有网络流量。

15.3. 创建一个防火墙

$ neutron firewall-create <firewall-policy-uuid>

在 OpenStack Networking 路由器被创建、接口被添加前,防火墙会处于 PENDING_CREATE 状态。

15.4. allowed-address-pairs

allowed-address-pairs 允许您指定 mac_address/ip_address(CIDR)对,使它们可以在不考虑子网的情况下通过一个端口。这会启用对一些协议的使用,如 VRRP,它会在两个实例间浮动一个 IP 地址,从而实现快速故障切换功能。

注意

当前,只有以下插件支持 allowed-address-pairs 扩展:ML2、Open vSwitch 和 VMware NSX。

15.4.1. 基本的 allowed-address-pairs 操作

创建一个带有 allowed-address-pairs 的端口:

# neutron port-create net1 --allowed-address-pairs type=dict list=true mac_address=<mac_address>,ip_address=<ip_cidr>
15.4.2. 添加 allowed-address-pairs
# neutron port-update <port-uuid> --allowed-address-pairs type=dict list=true mac_address=<mac_address>,ip_address=<ip_cidr>
注意

OpenStack Networking 不允许设置和一个端口的 mac_addressip_address 匹配的 allowed-address-pair。这是因为,匹配 mac_addressip_address 的网络流量已被允许通过这个端口,所以这样的配置不会起任何作用。