OpenStack Neutron FWaaS 学习 ( by quqi99 )
作者:张华 发表于:2013-06-24
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
( http://blog.csdn.net/quqi99 )
另一篇和防火墙相关的文章,OpenStack中的防火墙 ( by quqi99 ) http://blog.csdn.net/quqi99/article/details/7447233
OpenStack的网络组件已经从Quantum更名为Neutron了。之前Quantum就有一个安全组的实现,它运行在每一个计算节点上,能够做到:
1)过滤进入到计算节点上虚机的流量
2)过滤从虚机出来的流量(nova-network并不能实现这一点)
3)过滤虚机之间的流量
安全组的一般用法及实现框图如下:
$nova secgroup-create mygroup description
$nova secgroup-add-rule mygroup tcp 22 22 192.168.1.0/24
$nova boot --flavor 1 --image f16f1d2d-71d6-41b7-98a5-319f142d61f5--security_groups mygroup i1
上述一个安全组由一系列的iptable rule组成,rule都是针对soure/dest ip及tcp port的,它不能像下一代的防火墙一样来表达应用特性像audited rules,也不能提供边缘防火墙的特性。所以在Neutron提供L4/L7层框架之际,也将推出了FWaaS服务(https://docs.google.com/document/d/1PJaKvsX2MzMRlLGfR0fBkrMraHYF0flvl0sqyZ704tA/edit?pli=1)。
在FWaaS中,tenant可以创建多个Firewall instances,而每一个virtual firewall instance和多个Firewall Policies关联,每个firewall policies由多个Firewall rules按序组成。不能直接应用一个rule,它必须先加入到一个policy中,因为它需要先审计。如下图:
多层防火墙的应用场景如下图:
Neutron L3 agent运行在gateway host上,它通过linux的namespace特性实例化多个neutron router,一个tenant能用多个router。见下图,router中的qr-XXX虚拟接口用于和tenant网络相连,qg-XXX虚拟接口用于跟外部网络相连,防火墙服务应该是过滤出入tenant网络的所有流量,所以firewallpolicy应该是应用在qr-XXX虚拟接口上(iptables出口rule中添加”-oqr-+” a即可,入口规则添加”-iqr-+”即可),如果对所以tenant网络都适用的话可以运用在qg-XXX接口上(但havana的这一版本不会实现这一点,并且也不会实现Zones的概念,一组像上面的qr-XXX接口可以组成一个Zone,也不会检查address sppofing)。所以防火墙规则不仅应该像之前的安全组那个运用到计算节点上,也应该运用在相应的tenant'srouter的主机相应的namespace下(这即是所谓的边缘防火墙规则).
参考实现将会有4个chains,出和入各一个,ipv4和ipv6各一个。:
所以相应地在FWaaSAgent中会有几个方法:
create_firewall(apply_list, fireall),fireall是指一组上面的防火墙规则,apply_list指一些networknamespace
update_firewall(apply_list, fireall)
delete_firewall(apply_list, fireall)
关于将上面的firewallinstance在哪里应用到VM应涉及到L4/L7服务框架了。以前Neutron只有一级插件结构(像OVS插件,像LinuxBridge插件),但现在引入了L4/L7层服务框架之后变成了两层,即实现了在一个核心插件(像OVS插件)下再能添加若干个服务(像LBaaS,像FWaaS)。可参见:https://docs.google.com/document/d/1iLzieNKxM7xip_lRidmalAhF_6-Yf1b_cePF4yeAnkQ/edit?pli=1,
# ip netns exec qrouter-e438bebe-6795-4b68-a613-ec0df38d3064 iptables -t filter -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N neutron-filter-top
-N neutron-l3-agent-FORWARD
-N neutron-l3-agent-INPUT
-N neutron-l3-agent-OUTPUT
-N neutron-l3-agent-fwaas-defau #新增的 firewall chain
-N neutron-l3-agent-iv4aa85bd66 #新增的 firewall chain
-N neutron-l3-agent-local
-N neutron-l3-agent-ov4aa85bd66 #for firewall
-A INPUT -j neutron-l3-agent-INPUT
-A FORWARD -j neutron-filter-top
-A FORWARD -j neutron-l3-agent-FORWARD #将 forward 转到 neutron 的chain
-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 -o qr-+ -j neutron-l3-agent-iv4aa85bd66 #进数据网络的包
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-ov4aa85bd66 #出数据网络的包
-A neutron-l3-agent-FORWARD -o qr-+ -j neutron-l3-agent-fwaas-defau #进数据网络的包的默认处理 chain
-A neutron-l3-agent-FORWARD -i qr-+ -j neutron-l3-agent-fwaas-defau #出数据网络的包的默认处理 chain
-A neutron-l3-agent-INPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 9697 -j ACCEPT
-A neutron-l3-agent-fwaas-defau -j DROP #默认丢弃没有被以上规则处理的所有包
-A neutron-l3-agent-iv4aa85bd66 -m state --state INVALID -j DROP
-A neutron-l3-agent-iv4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT #接受状态为 RELATED, ESTABLISHED (已建立的连接)的包
-A neutron-l3-agent-iv4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT #根据定义的 FWaas rule,接受目的端口为 80 的 tcp 包
-A neutron-l3-agent-ov4aa85bd66 -m state --state INVALID -j DROP
-A neutron-l3-agent-ov4aa85bd66 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A neutron-l3-agent-ov4aa85bd66 -p tcp -m tcp --dport 80 -j ACCEPT #根据 FWaas rule,接收目的端口为 80 的 tcp 包
相关进阶的代码和BP:
1)Firewallas a Service (FWaaS) APIs and DB Model,https://review.openstack.org/29004
2) FwaaS agent,https://blueprints.launchpad.net/quantum/+spec/quantum-fwaas-agent
3) FwaaS Plugin, https://blueprints.launchpad.net/quantum/+spec/quantum-fwaas-plugin 4) FwaaS ip tables driver https://blueprints.launchpad.net/quantum/+spec/quantum-fwaas-iptables-driver