Neutron:Firewall as a Service(FWaaS)

用户可以用它来创建和管理防火墙,在 subnet 的边界上对 layer 3 和 layer 4 的流量进行过滤。

传统网络中的防火墙一般放在网关上,用来控制子网之间的访问。 FWaaS 的原理也一样,是在 Neutron 虚拟 router 上应用防火墙规则,控制进出租户网络的数据。

FWaaS 有三个重要概念: Firewall、Policy 和 Rule。

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,可以在安全组之前控制外部过来的流量,但是对于同一个 subnet 内的流量不作限制。

也就是说:FWaaS 保护的是 subnet。

所以,可以同时部署 FWaaS 和安全组实现双重防护。

启用 FWaaS

因为 FWaaS 是在 router 中实现的,所以 FWaaS 没有单独的 agent。 已有的 L3 agent 负责提供所有 FWaaS 功能。

要启用 FWaaS,必须在 Neutron 的相关配置文件中做些设置。

配置 firewall driver

Neutron 在 /etc/neutron/fwaas_driver.ini 文件中设置 FWaaS 使用的 driver。 如下图所示:

这里 driver 为 iptables。如果以后支持更多的 driver,可以在这里替换。

配置 Neutron

在 Neutron 配置文件 /etc/neutron/neutron.conf  中启用 FWaaS plugin。

配置完毕!下节我们开始创建 Firewall。


在我们的实验环境中,有两个 instance: cirros-vm1(172.16.100.3) 和 cirros-vm2(172.16.101.3)。

cirros-vm1 和 cirros-vm2 分别位于网络 vlan100 和 vlan101。 vlan100 和 vlan101 之间由虚拟路由器 test_router 连接。 网络拓扑如下:

在 test_router 没有应用任何 FWaaS 的情况下,cirros-vm1 可以通过 ping 和 ssh 跨网络访问 cirros-vm2。

下面我们将进行如下实验:

1. 创建一个不包含任何 rule 的 firewall “test_firewall” 并应用到 test_router。

此时 FWaaS 生效,默认情况下会阻止任何跨子网的流量。

2. 创建 rule 允许 ssh,并将其添加到 test_firewall。此时 cirros-vm1 应该能够 ssh cirros-vm2。

应用无 rule 的 firewall

点击菜单 Project -> Network -> Firewalls,打开 Firewall Policies 标签页面。 目前没有定义任何 Policie。

点击按钮,显示Policy 创建页面。

将 Policy 命名为 “test_policy”,直接点击 “Add” 按钮。

这样我们创建的 test_policy 不包含任何 Rule。

进入 “Firewalls” 标签页,点击 “Create Firewall” 按钮

将新的 Firewall 命名为 “test_firewall”,并关联 “test_policy”。

在 “Routers” 标签页中选择 “test_router”。 点击 “Add” 创建 firewall。

等待 test_firewall 的 Status 变为 “Active”,此时 test_router 已经成功应用 test_policy。

可以通过 iptables-save 查看 router namespace 的 iptables 规则

为了让大家了解底层到底发生了什么变化,下面用 vimdiff 显示了应用 test_firewall 前后 iptables 规则的变化。

下面我们来分析一下这些规则。

route 在转发数据包时会使用 chain:

-A FORWARD -j neutron-***-agen-FORWARD

neutron-***-agen-FORWARD 的规则如下:

-A neutron-***-agen-FORWARD -o qr-+ -j neutron-***-agen-iv4e85f4601

-A neutron-***-agen-FORWARD -i qr-+ -j neutron-***-agen-ov4e85f4601

-A neutron-***-agen-FORWARD -o qr-+ -j neutron-***-agen-fwaas-defau

-A neutron-***-agen-FORWARD -i qr-+ -j neutron-***-agen-fwaas-defau

我们以第一条为例,其含义是:从 router namespace 任何一个 qr-* interface 发出

的流量都会应用 chain neutron-***-agen-iv4e85f4601,该 chain 定义如下:

-A neutron-***-agen-iv4e85f4601 -m state --state INVALID -j DROP

-A neutron-***-agen-iv4e85f4601 -m state --state RELATED,ESTABLISHED -j ACCEPT

其规则为:

1. 如果数据包的状态为 INVALID,则 DROP。

2. 如果数据包的状态为 RELATED 或 ESTABLISHED,则 ACCEPT。

其他正常传输的数据怎么处理呢? 回到 neutron-***-agen-FORWARD chain 的下一条关于 router 外出数据的规则:

-A neutron-***-agen-FORWARD -o qr-+ -j neutron-***-agen-fwaas-defau

neutron-***-agen-fwaas-defau 内容为:

-A neutron-***-agen-fwaas-defau -j DROP

可见,数据会被丢弃。 同样的道理,router 上所有进入 qr-* interface 的数据也会被丢弃。

其结论是:在没有定义任何 firewall rule 的情况下,进出 router 的数据包都会被丢弃。

ping 和 ssh 测试表明目前 cirros-vm1 确实已经无法与 cirros-vm2 通信。

下面我们添加一条 firewall rule:允许 ssh。

在 Firewall Rules 标签页面点击 “Add Rule” 按钮。

将新 rule 命名为 “allow ssh”, Protocal 选择 “TCP”, Action 为 “ALLOW”, Destination Port/Port Range 为 “22”,

点击 “Add” ,rule 创建成功。

接下来将 rule 添加到 policy 中。

点击 Firewall Policies 标签页面,然后点击 “test_policy” 后面的 “Insert Rule” 按钮。

在下拉框中选择 Rule “allow ssh”,点击 “Save Changes”。

可以看到,“allow ssh” 已经成功添加到 “test_policy” 中。

通过 vimdiff 查看 router namespace 的 iptables-save 发生了什么变化。

iptables 添加了两条规则:

-A neutron-***-agen-iv4e85f4601 -p tcp -m tcp --dport 22 -j ACCEPT

-A neutron-***-agen-ov4e85f4601 -p tcp -m tcp --dport 22 -j ACCEPT

其含义是进出 router 的 tcp 数据包,如果目的端口为 22(ssh)ssh,则一律 ACCEPT。

测试一下,cirros-vm1 已经可以 ssh cirros-vm2,但 ping 还是不通,这与预期一致。

“allow ssh” 已经起作用。 同时我们也发现,firewall rule 对进出流量同时生效,不区分方向。

小节

FWaaS 用于加强 Neutron 网络的安全性,与安全组可以配合使用。

下面将 FWaaS 和安全组做个比较。

相同点:

1. 底层都是通过 iptables 实现。

不同点:

1. FWaaS 的 iptables 规则应用在 router 上,保护整个租户网络;

安全组则应用在虚拟网卡上,保护单个 instance。

2. FWaaS 可以定义 allow 或者 deny 规则;安全组只能定义 allow 规则。

3. 目前 FWaaS 规则不能区分进出流量,对双向流量都起作用;

安全组规则可以区分 ingress 和 egress。

原文地址:https://www.cnblogs.com/lsw-blogs/p/10782761.html

时间: 2024-10-12 16:28:19

Neutron:Firewall as a Service(FWaaS)的相关文章

Neutron: Load Balance as a Service(LBaaS)负载均衡

load balancer 负责监听外部的连接,并将连接分发到 pool member. LBaaS 有三个主要的概念: Pool Member,Pool 和 Virtual IP Pool Member Pool Member 是 layer 4 的实体,拥有 IP 地址并通过监听端口对外提供服务. 例如 Pool Member 可以是一个 web server,IP 为 172.16.100.9 并通过 80 端口提供 HTTP 服务. Pool Pool 由一组 Pool Member 组

Windows as a Service(4)——使用Intune管理Windows10更新

这是这个系列的最后一篇文章,我已经花了三篇的篇幅和大家分享有关于Windows as a Serivce的相关内容,链接如下: Windows as a Service(1)-- Windows 10服务分支 Windows as a Service(2)-- 使用WSUS管理Windows10更新 Windows as a Service(3)--使用SCCM管理Windows10更新 最后这篇文章,要和大家分享的是使用Intune来管理Windows 10更新.由于Microsoft Int

Neutron LBaaS Service(2)—— Neutron Services Insertion Model

Service Insertion Service Insertion是Neutron中实现L4/L7层服务的框架.Neutron以前只有一级插件结构用于实现各种L2层技术(如LinuxBridge,OVS等,部署时分两块:用于和数据库打交道的NeutronPlugin+用于干实际事情的L2Agent),对于L3层的路由和dhcp是采用单独的agent(l3-agent,dhcp-agent)来实现的.但L4-L7层服务要求: (1)像FW,VPN,DNAT服务需要运行在l3-agent所在的网

Neutron LBaaS Service(1)—— Neutron LBaaS Service基本知识

在OpenStack Grizzly版本中,Quantum组件引入了一个新的网络服务:LoadBalancer(LBaaS),服务的架构遵从Service Insertion框架.LoadBalancer为租户提供到一组虚拟机的流量的负载均衡,其基本实现为:在neutron-lbaas-agent中生成Haproxy的配置文件然后启动Haproxy. Neutron LBaaS Service Architecture LBaaS主要由以下几个模块构成,如下图所示 Loadbalancer 处理

Android 两种启动Service(远程)的方式:Bind 与Start

前言:本文主要讨论启动远程Service. Service和Activity不在一个工程里面,也即不在一个App里面.不在一个进程里,所以会用到AIDL. Service的android:process属性未指定. 一.startService 1.通过调用startService启动服务的过程: onCreate ->onStartCommand ->onStart startService 仅用于启动服务,如果Activity需要与Service进行通信,需利用Broadcast. 2.而

Java服务器端生成报告文档:使用SQL Server Report Service(SSRS)

SQL Server Report Service(SSRS)提供了Asp.Net和WinForm两类客户端组件封装,因此使用C#实现SSRS报表的导出功能,仅需要使用相应的组件即可. Java操作SSRS,需要借助于SSRS的Report Server应用站点,该应用为SSRS的报表Web查看页面,通过发送Get请求获取要访问的报表并传递报表参数,此外可指明输出报表文件格式. SSRS关键参数: rs:Format,指明输出文件格式,PDF.EXCEL.WORD等: 注意事项:中文报表路径和中

架构设计:负载均衡层设计方案(7)——LVS + Keepalived + Nginx安装及配置

1.概述 上篇文章<架构设计:负载均衡层设计方案(6)--Nginx + Keepalived构建高可用的负载层>(http://blog.csdn.net/yinwenjie/article/details/47130609) 我们解说了Nginx的故障切换.而且承诺各位读者会尽快解说 LVS + Keepalived + Nginx的安装和配置.在中间由于工作的原因.我又插写了三篇关于zookeeper的原理使用的文章.今天这边文章我们回归主题.为各位读者解说LVS + Keepalive

Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service

准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并引入spring来进行RESTful web service的配置和管理. 项目目录结构如下图 首先我们要在web.xml中加入通过Spring的ContextLoaderListener加载的Spring运行时环境以及CXF的Spring配置文件 web.xml <?xml version="

架构设计:负载均衡层设计方案(6)——Nginx + Keepalived构建高可用的负载层

1.概述 前两遍文章中,我们一直在说后文要介绍Nginx + Keepalived的搭建方式.这篇文章开始,我们就来兑现前文的承诺,后续的两篇文章我们将介绍Nginx + Keepalived和 LVS + Keepalived搭建高可用的负载层系统.如果你还不了解Nginx和LVS的相关知识,请参见我之前的两篇文章<架构设计:负载均衡层设计方案(2)--Nginx安装>(http://blog.csdn.net/yinwenjie/article/details/46620711).<