Spec-provider-firewall
2005年9月1日:请注意,此功能正在被移除。
https://review.openstack.org/#/c/184027/
http://lists.openstack.org/pipermail/openstack-dev/2014-November/050959.html
http://lists.openstack.org/pipermail/openstack-dev/2015-September/073383.html
- Launchpad 条目:NovaSpec:provider-firewall
- 创建:
- 贡献者:
目录
总结
允许服务提供商在安全组规则之上应用防火墙规则。
发布说明
在Admin API中添加钩子,允许云管理员通过CIDR阻止来自特定网络地址的流量。
原理
有些人就是不良的互联网公民。阻止不良流量到达数据中心的任何实例,而无需依赖于实例所有者的合作。
用户故事
Alice是一位黑客,试图在云中的许多实例上暴力破解ssh连接,并探测开放的SMTP服务器。Bob来自数据中心运维团队,注意到不良流量并阻止Alice访问任何实例。
设计与实现
API
Admin API应该接受来自管理员的请求来阻止一个CIDR网络块。此方法是 nova/api/ec2/admin.py AdminController.block_external_addresses。它可以通过 nova/adminclient.py AdminClient.block_ips 访问,因此可以轻松地集成到仪表盘或其他客户端中。
当来自管理员的阻止网络的消息到达时,规则会使用 db.provider_fw_rule_create 写入数据库,并向计算发送广播以刷新防火墙。
数据库
db/api.py 和 db/sqlalchemy/api.py 中存在一个名为 'provider_fw_rule_create' 的函数。db/sqlalchemy/models.py 中还有一个名为 ProviderFirewallRule 的模型,用于写入数据库。sqlalchemy 的迁移也存在。可以使用以下命令列出规则:
计算
计算API响应 'trigger_provider_fw_rules_refresh',API服务器使用它来让计算工作者知道有新的规则需要加载。这会向每个计算服务发送广播消息 'trigger_provider_fw_rules'(没有参数)。接收到的计算管理器会将调用转发到基础虚拟化驱动程序(FLAGS.compute_driver,进而可能基于 FLAGS.connection_type 转发)。
Libvirt
大部分工作在 nova/virt/libvirt_connection.py 中完成。LibvirtConnection 类实现了 'refresh_provider_fw_rules' 方法,该方法在 nova/virt/fake.py 中的 FakeConnection 中定义为引发 NotImplemented(它存在于 FakeConnection 中,以便其他虚拟化驱动程序的实现者知道他们需要定义它)。LibvirtConnection 只是将调用转发到防火墙驱动程序(FLAGS.firewall_driver)。FirewallDriver 基类引发 NotImplementedError,而 IptablesFirewallDriver 和 NWFilterFirewall 都会更改防火墙以按预期方式运行。
NWFilterFirewall
在实例防火墙规则创建期间,紧接 nova-base 的引用之后,现在有一个 nova-provider 过滤器的引用。该过滤器每次调用 'refresh_provider_fw_rules' 时都会重建。在设置基本规则期间,会调用 'refresh_provider_fw_rules' 以最初填充过滤器。处理提供程序规则后,流量将继续通过剩余的过滤器进行安全组规则和项目流量过滤。
IptablesFirewallDriver
从 FORWARD 链到 nova-provider 建立了一个跳转。nova-provider 链根据数据库的状态丢弃连接,并在调用 'refresh_provider_fw_rules' 期间重建。在丢弃任何被阻止的IP之后,它会跳转到 nova-local,在那里它继续进行安全组和项目流量的过滤过程。
仪表盘
此功能当前未暴露给仪表盘,但由于它包含在 NovaAdminClient 中,因此可以很容易地实现。
迁移
NWFilterFirewall 用户需要更新其实例过滤器的 xml 以包含对 nova-provider 过滤器的引用。由于 IptablesFirewallFilter 几乎在任何调用时都会一次性重新生成整个表,因此防火墙状态的任何更新都应将提供程序级别的过滤添加到防火墙规则中(广播 refresh_provider_fw_rules 即可)。
测试/演示计划
如果使用 NWFilterFirewall,您应该能够调用 'virsh nwfilter-list nova-instance-instance-ID' 并查看对 nova-provider 过滤器的引用。您应该能够 'iptables -L' 并查看从 FORWARD 到 nova-provider 的跳转,以及从 nova-provider 到 nova-local 的跳转。
未解决的问题
看起来并非所有 connection_types 都实现了 refresh_* 调用。这同时存在于安全组调用和提供程序防火墙规则中。
BoF 议程和讨论
待定