Neutron总结-Firewall as a Service(FWaaS)

33 篇文章 16 订阅
21 篇文章 1 订阅

理解概念

Firewall as a Service(FWaaS)是 Neutron 的一个高级服务。
用户可以用它来创建和管理防火墙,在 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_agentneutron_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。如下所示:

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

这里 driver 为 iptables。如果以后支持更多的 driver,可以在这里替换。
配置 Neutron
在 Neutron 配置文件 /etc/neutron/neutron.conf 中启用 FWaaS plugin。

service_plugins = router,neutron_fwaas.services.firewall.fwaas_plugin.FirewallPlugin

下面通过实验来学习 FWaaS。
在我们的实验环境中,有两个 instance: test1(172.16.100.18) 和test3(172.16.101.14)。
test1 和 test3 分别位于网络 vlan100 和 vlan101。 vlan100 和 vlan101 之间由虚拟路由器 router_100_101 连接。 网络拓扑如下:
这里写图片描述
router_100_101 没有应用任何 FWaaS 的情况下,test1 可以通过 ping 和 ssh 跨网络访问 test3。
这里写图片描述

下面我们将进行如下实验:
1. 创建一个不包含任何 rule 的 firewall “test_firewall” 并应用到 router_100_101
此时 FWaaS 生效,默认情况下会阻止任何跨子网的流量。
2. 创建 rule 允许 ping,并将其添加到 test_firewall。此时 test1 应该能够 ping 通 test3。

应用无 rule 的 firewall

点击菜单 项目 -> 网络 -> 防火墙,打开 防火墙策略(Firewall Policies) 标签页面。目前没有定义任何 Policy。
这里写图片描述
点击“添加策略”按钮,显示Policy 创建页面。
这里写图片描述
将 Policy 命名为 “test_policy”,直接点击 “添加” 按钮。
这里写图片描述
这样我们创建的 test_policy 不包含任何 规则(Rule)。
进入 “防火墙” 标签页,点击 “创建防火墙” 按钮
这里写图片描述
将新的 Firewall 命名为 “test_firewall”,并关联 “test_policy”。
这里写图片描述
在 “路由器” 标签页中选择 “router_100_101”。点击 “添加” 创建 firewall。
这里写图片描述
等待 test_firewall 的 状态 变为 “活动”,此时 router_100_101 已经成功应用 test_policy。
这里写图片描述

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

root@controller:~# ip netns
qrouter-d0945bdd-e860-4f17-b386-80d4ddbb9d3c
qdhcp-838d7441-7c25-4b02-8698-18d76ef670be
qdhcp-f66a4f50-6ce1-452f-a618-5ecf17f1f3e7
root@controller:~# ip netns exec qrouter-d0945bdd-e860-4f17-b386-80d4ddbb9d3c iptables-save
# Generated by iptables-save v1.4.21 on Wed Jul 19 11:05:49 2017
*raw
:PREROUTING ACCEPT [1901025:265290397]
:OUTPUT ACCEPT [37:3178]
:neutron-l3-agent-OUTPUT - [0:0]
:neutron-l3-agent-PREROUTING - [0:0]
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
COMMIT
# Completed on Wed Jul 19 11:05:49 2017
# Generated by iptables-save v1.4.21 on Wed Jul 19 11:05:49 2017
*mangle
:PREROUTING ACCEPT [177:20820]
:INPUT ACCEPT [36:11808]
:FORWARD ACCEPT [54:4536]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [54:4536]
:neutron-l3-agent-FORWARD - [0:0]
:neutron-l3-agent-INPUT - [0:0]
:neutron-l3-agent-OUTPUT - [0:0]
:neutron-l3-agent-POSTROUTING - [0:0]
:neutron-l3-agent-PREROUTING - [0:0]
:neutron-l3-agent-float-snat - [0:0]
:neutron-l3-agent-floatingip - [0:0]
:neutron-l3-agent-mark - [0:0]
:neutron-l3-agent-scope - [0:0]
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A INPUT -j neutron-l3-agent-INPUT
-A FORWARD -j neutron-l3-agent-FORWARD
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A neutron-l3-agent-POSTROUTING -o qg-279587a4-0c -m connmark --mark 0x0/0xffff0000 -j CONNMARK --save-mark --nfmask 0xffff0000 --ctmask 0xffff0000
-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-mark
-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-scope
-A neutron-l3-agent-PREROUTING -m connmark ! --mark 0x0/0xffff0000 -j CONNMARK --restore-mark --nfmask 0xffff0000 --ctmask 0xffff0000
-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-floatingip
-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x1/0xffff
-A neutron-l3-agent-float-snat -m connmark --mark 0x0/0xffff0000 -j CONNMARK --save-mark --nfmask 0xffff0000 --ctmask 0xffff0000
-A neutron-l3-agent-mark -i qg-279587a4-0c -j MARK --set-xmark 0x2/0xffff
-A neutron-l3-agent-scope -i qg-279587a4-0c -j MARK --set-xmark 0x4000000/0xffff0000
-A neutron-l3-agent-scope -i qr-17443663-d3 -j MARK --set-xmark 0x4000000/0xffff0000
-A neutron-l3-agent-scope -i qr-38818569-d9 -j MARK --set-xmark 0x4000000/0xffff0000
COMMIT
# Completed on Wed Jul 19 11:05:49 2017
# Generated by iptables-save v1.4.21 on Wed Jul 19 11:05:49 2017
*nat
:PREROUTING ACCEPT [96:7184]
:INPUT ACCEPT [8:2624]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:neutron-l3-agent-OUTPUT - [0:0]
:neutron-l3-agent-POSTROUTING - [0:0]
:neutron-l3-agent-PREROUTING - [0:0]
:neutron-l3-agent-float-snat - [0:0]
:neutron-l3-agent-snat - [0:0]
:neutron-postrouting-bottom - [0:0]
-A PREROUTING -j neutron-l3-agent-PREROUTING
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A POSTROUTING -j neutron-l3-agent-POSTROUTING
-A POSTROUTING -j neutron-postrouting-bottom
-A neutron-l3-agent-POSTROUTING ! -i qg-279587a4-0c ! -o qg-279587a4-0c -m conntrack ! --ctstate DNAT -j ACCEPT
-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
-A neutron-l3-agent-snat -j neutron-l3-agent-float-snat
-A neutron-l3-agent-snat -o qg-279587a4-0c -j SNAT --to-source 10.10.10.10
-A neutron-l3-agent-snat -m mark ! --mark 0x2/0xffff -m conntrack --ctstate DNAT -j SNAT --to-source 10.10.10.10
-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-l3-agent-snat
COMMIT
# Completed on Wed Jul 19 11:05:49 2017
# Generated by iptables-save v1.4.21 on Wed Jul 19 11:05:49 2017
*filter
:INPUT ACCEPT [9:2952]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:neutron-filter-top - [0:0]
:neutron-l3-agent-FORWARD - [0:0]
:neutron-l3-agent-INPUT - [0:0]
:neutron-l3-agent-OUTPUT - [0:0]
:neutron-l3-agent-fwaas-defau - [0:0]
:neutron-l3-agent-iv42ced2d9f - [0:0]
:neutron-l3-agent-local - [0:0]
:neutron-l3-agent-ov42ced2d9f - [0:0]
:neutron-l3-agent-scope - [0:0]
-A INPUT -j neutron-l3-agent-INPUT
-A FORWARD -j neutron-filter-top
-A FORWARD -j neutron-l3-agent-FORWARD
-A OUTPUT -j neutron-filter-top
-A OUTPUT -j neutron-l3-agent-OUTPUT
-A neutron-filter-top -j neutron-l3-agent-local
-A neutron-l3-agent-FORWARD -j neutron-l3-agent-scope
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-iv42ced2d9f
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov42ced2d9f
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau
-A neutron-l3-agent-INPUT -m mark --mark 0x1/0xffff -j ACCEPT
-A neutron-l3-agent-INPUT -p tcp -m tcp --dport 9697 -j DROP
-A neutron-l3-agent-fwaas-defau -j DROP
-A neutron-l3-agent-iv42ced2d9f -m state --state INVALID -j DROP
-A neutron-l3-agent-iv42ced2d9f -m state --state RELATED,ESTABLISHED -j ACCEPT
-A neutron-l3-agent-ov42ced2d9f -m state --state INVALID -j DROP
-A neutron-l3-agent-ov42ced2d9f -m state --state RELATED,ESTABLISHED -j ACCEPT
-A neutron-l3-agent-scope -o qr-17443663-d3 -m mark ! --mark 0x4000000/0xffff0000 -j DROP
-A neutron-l3-agent-scope -o qr-38818569-d9 -m mark ! --mark 0x4000000/0xffff0000 -j DROP
COMMIT
# Completed on Wed Jul 19 11:05:49 2017

为了让大家了解底层到底发生了什么变化,下面显示了应用 test_firewall 前后 iptables 规则的变化。
这里写图片描述

下面我们来分析一下这些规则。
route 在转发数据包时会使用 chain:

     -A FORWARD -j neutron-l3-agent-FORWARD

neutron-l3-agent-FORWARD 的规则如下:

-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-iv42ced2d9f
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov42ced2d9f
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau

我们以第一条为例,其含义是:从 router namespace 任何一个 qr-* interface 发出
的流量都会应用 chain neutron-l3-agent-iv42ced2d9f,该 chain 定义如下:

-A neutron-l3-agent-iv42ced2d9f -m state --state INVALID -j DROP
-A neutron-l3-agent-iv42ced2d9f -m state --state RELATED,ESTABLISHED -j ACCEPT

其规则为:
1. 如果数据包的状态为 INVALID,则 DROP。
2. 如果数据包的状态为 RELATED 或 ESTABLISHED,则 ACCEPT。

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

-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau

neutron-l3-agent-fwaas-defau 内容为:

-A neutron-l3-agent-fwaas-defau -j DROP

可见,数据会被丢弃。同样的道理,router 上所有进入 qr-* interface 的数据也会被丢弃。
其结论是:在没有定义任何 firewall rule 的情况下,进出 router 的数据包都会被丢弃。
ping 和 ssh 测试表明目前 test1 确实已经无法与 test3 通信。
这里写图片描述

允许ping

下面添加新的规则允许 ping,之后我们也会比较安全组和 FWaaS 的异同。

在 防火墙规则(Firewall Rules) 标签页面点击 “添加规则” 按钮。
将新 规则 命名为 “allow ping”,协议 选择 “ICMP”,操作 为 “允许”
这里写图片描述
点击 “保存”,规则 创建成功。
这里写图片描述
接下来将 规则 添加到 策略 中。
点击 防火墙策略(Firewall Policies )标签页面,然后点击 “test_policy” 后面的 “插入规则” 按钮。
这里写图片描述
在下拉框中选择 规则 “allow ping”,点击 “保存”。
这里写图片描述
可以看到,“allow ping” 已经成功添加到 “test_policy” 中。
通过 对比 查看 router namespace 的 iptables-save 发生了什么变化。
这里写图片描述
iptables 添加了两条规则:

-A neutron-l3-agent-iv42ced2d9f -p icmp -j ACCEPT
-A neutron-l3-agent-ov42ced2d9f -p icmp -j ACCEPT

其含义是进出 router 的 tcp 数据包,如果是icmp协议,则一律 ACCEPT。
测试一下,test1 已经可以 ping 通test3,但 ssh 还是不通,这与预期一致。
这里写图片描述

这里写图片描述
“allow ping” 已经起作用。同时我们也发现,firewall rule 对进出流量同时生效,不区分方向。

小节

FWaaS 用于加强 Neutron 网络的安全性,与安全组可以配合使用。下面将 FWaaS 和安全组做个比较。
相同点:
1. 底层都是通过 iptables 实现。
不同点:
1. FWaaS 的 iptables 规则应用在 router 上,保护整个租户网络;
安全组则应用在虚拟网卡上,保护单个 instance。
2. FWaaS 可以定义 allow 或者 deny 规则;安全组只能定义 allow 规则。
3. 目前 FWaaS 规则不能区分进出流量,对双向流量都起作用;
安全组规则可以区分 ingress 和 egress。

文章参考每天5分钟玩转OpenStack防火墙服务相关内容,为学习笔记:
http://www.cnblogs.com/CloudMan6/p/6099331.html
http://www.cnblogs.com/CloudMan6/p/6106441.html
http://www.cnblogs.com/CloudMan6/p/6112171.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值