Neutron:Firewall as a Service(FWaaS)
Posted lsw-blogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。 如下图所示:
![技术图片](https://app.yinxiang.com/shard/s4/res/f78f8c13-6d3c-420a-a09c-d2a3c8c40841.jpg)
这里 driver 为 iptables。如果以后支持更多的 driver,可以在这里替换。
配置 Neutron
在 Neutron 配置文件 /etc/neutron/neutron.conf 中启用 FWaaS plugin。
![技术图片](https://app.yinxiang.com/shard/s4/res/3518dcbd-6ef6-477c-bfe2-ad941e4d6f1f.jpg)
配置完毕!下节我们开始创建 Firewall。
在我们的实验环境中,有两个 instance: cirros-vm1(172.16.100.3) 和 cirros-vm2(172.16.101.3)。
![技术图片](https://app.yinxiang.com/shard/s4/res/35f8a3ca-6de4-4e46-be26-31d681d773d9.jpg)
cirros-vm1 和 cirros-vm2 分别位于网络 vlan100 和 vlan101。 vlan100 和 vlan101 之间由虚拟路由器 test_router 连接。 网络拓扑如下:
![技术图片](https://app.yinxiang.com/shard/s4/res/5b07605e-99d4-43e5-bc17-dfd6cffd3733.jpg)
在 test_router 没有应用任何 FWaaS 的情况下,cirros-vm1 可以通过 ping 和 ssh 跨网络访问 cirros-vm2。
![技术图片](https://app.yinxiang.com/shard/s4/res/816b0fad-8ddf-4eae-a1fa-9ff6b868ee2e.jpg)
下面我们将进行如下实验:
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。
![技术图片](https://app.yinxiang.com/shard/s4/res/d7d38f62-9553-4a61-8d66-4fd15830146c.jpg)
点击
按钮,显示Policy 创建页面。
![技术图片](https://app.yinxiang.com/shard/s4/res/c9a577a2-212c-48fa-9fda-f11b74fe9708.jpg)
![技术图片](https://app.yinxiang.com/shard/s4/res/0413d24f-8c17-4fd0-87d1-235a6101a505.jpg)
将 Policy 命名为 “test_policy”,直接点击 “Add” 按钮。
![技术图片](https://app.yinxiang.com/shard/s4/res/6cb461f6-2877-4574-9a63-9b33dad29e1c.jpg)
这样我们创建的 test_policy 不包含任何 Rule。
进入 “Firewalls” 标签页,点击 “Create Firewall” 按钮
![技术图片](https://app.yinxiang.com/shard/s4/res/f7a4813f-8145-48dc-bf9b-227fef97b4df.jpg)
将新的 Firewall 命名为 “test_firewall”,并关联 “test_policy”。
![技术图片](https://app.yinxiang.com/shard/s4/res/3e8809ed-7ceb-4c69-8aa8-c28abb8c93e4.jpg)
在 “Routers” 标签页中选择 “test_router”。 点击 “Add” 创建 firewall。
![技术图片](https://app.yinxiang.com/shard/s4/res/2a05199c-e9c0-4b2d-b309-ff76c97a1ea2.jpg)
等待 test_firewall 的 Status 变为 “Active”,此时 test_router 已经成功应用 test_policy。
![技术图片](https://app.yinxiang.com/shard/s4/res/ed4feb01-9465-4e1c-a6c7-8d0c9a3ec399.jpg)
可以通过 iptables-save 查看 router namespace 的 iptables 规则
![技术图片](https://app.yinxiang.com/shard/s4/res/5a727807-e959-4a54-8cf3-dc239cf905e6.jpg)
为了让大家了解底层到底发生了什么变化,下面用 vimdiff 显示了应用 test_firewall 前后 iptables 规则的变化。
![技术图片](https://app.yinxiang.com/shard/s4/res/fa2a4b45-e771-45d7-b386-0bed82daa324.jpg)
下面我们来分析一下这些规则。
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 通信。
![技术图片](https://app.yinxiang.com/shard/s4/res/c2b4a9f2-6058-43a9-978d-e73caccf3b26.jpg)
下面我们添加一条 firewall rule:允许 ssh。
在 Firewall Rules 标签页面点击 “Add Rule” 按钮。
![技术图片](https://app.yinxiang.com/shard/s4/res/3c69bbe2-afb9-451e-bf19-28d8a368d593.jpg)
将新 rule 命名为 “allow ssh”, Protocal 选择 “TCP”, Action 为 “ALLOW”, Destination Port/Port Range 为 “22”,
![技术图片](https://app.yinxiang.com/shard/s4/res/3c82ee7e-9140-4cc2-9fc4-efc9b00a93d0.jpg)
点击 “Add” ,rule 创建成功。
![技术图片](https://app.yinxiang.com/shard/s4/res/ab77e82d-6f61-4903-87bb-c14882ad5ce2.jpg)
接下来将 rule 添加到 policy 中。
点击 Firewall Policies 标签页面,然后点击 “test_policy” 后面的 “Insert Rule” 按钮。
![技术图片](https://app.yinxiang.com/shard/s4/res/7033d5ea-a727-4846-a2a1-1a3e863f0d1d.jpg)
![技术图片](https://app.yinxiang.com/shard/s4/res/d893d4ef-2c8b-4166-b59a-5ce7d0fd045e.jpg)
在下拉框中选择 Rule “allow ssh”,点击 “Save Changes”。
![技术图片](https://app.yinxiang.com/shard/s4/res/4919efc3-096b-4719-a9c8-571d0a154d5d.jpg)
可以看到,“allow ssh” 已经成功添加到 “test_policy” 中。
通过 vimdiff 查看 router namespace 的 iptables-save 发生了什么变化。
![技术图片](https://app.yinxiang.com/shard/s4/res/69b0ca01-cc7a-4bb9-8e82-3c8dae931886.jpg)
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 还是不通,这与预期一致。
![技术图片](https://app.yinxiang.com/shard/s4/res/eee6ab09-8249-4f1b-85e8-04aa1974ca58.jpg)
“allow ssh” 已经起作用。 同时我们也发现,firewall rule 对进出流量同时生效,不区分方向。
小节
FWaaS 用于加强 Neutron 网络的安全性,与安全组可以配合使用。
下面将 FWaaS 和安全组做个比较。
相同点:
1. 底层都是通过 iptables 实现。
不同点:
1. FWaaS 的 iptables 规则应用在 router 上,保护整个租户网络;
安全组则应用在虚拟网卡上,保护单个 instance。
2. FWaaS 可以定义 allow 或者 deny 规则;安全组只能定义 allow 规则。
3. 目前 FWaaS 规则不能区分进出流量,对双向流量都起作用;
安全组规则可以区分 ingress 和 egress。
以上是关于Neutron:Firewall as a Service(FWaaS)的主要内容,如果未能解决你的问题,请参考以下文章