neutron openvswitch agent实现安全组的方法
关于openstack安全组,采用一问一答的形式记录如下
1. 是加载在计算节点的还是网络节点的?
是加载在计算节点的
2. 是使用iptable规则实现的吗?
M版的neutron实现了openvswitch 基于流表的防火墙
之前常见的是用iptables实现的,一般会创建neutron-openvswi-XXX链
3. iptables实现的防火墙方法中,添加的规则都是accept,其余的包都是drop的吗?
是的添加的规则一般都在最后默认drop规则的前面return掉。安全组利用iptables实现原理如下
其中需要说明两点
(1). ipset
0 0 RETURN all -- any any anywhere anywhere match-set NIPv4de0fc679-6a26-43d6-a3f6- src,规则的意思是利用ipset来指定src集合,在这个集合中的srcIP报文都可以通过。
通过命令ipset list可以查看到所有的ipset集合
[root@node-129 var]# ipset list
Name: NIPv4de0fc679-6a26-43d6-a3f6-
Type: hash:net
Revision: 3
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 16816
References: 1
Members:
192.168.188.19
Name: NIPv6de0fc679-6a26-43d6-a3f6-
Type: hash:net
Revision: 3
Header: family inet6 hashsize 1024 maxelem 65536
Size in memory: 17552
References: 1
Members:
(2).security-group 远端
如果选择一个安全组作为来访源地址,则该安全组中的任何云主机实例都被允许使用该规则访问任一其它云主机。
例如host-1绑定安全组default, host-2绑定安全组secg1, 这时在default中添加一条规则并且指定远程为secg1, 那么这条规则适用于src-ip是host-2的报文。
(3)如果加入了ethertype =ipv4, protocol = any ingress和egress两个方向的安全组,那么所有的ipv4的包都可以通过,包括所有的tcp,udp,icmp.
4. neutron-openvswitch-agent实现firewall的代码结构是怎么样的?
(1) 首先在/etc/neutron/plugins/ml2/openvswitch_agent.ini 中设置firewall_driver的类名(用于指定加载类的路径),并打开安全组开关。
#firewall_driver = <None>
#firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
firewall_driver = neutron.agent.linux.openvswitch_firewall.OVSFirewallDriver
enable_security_group = true
(2) 所有的firewall基于父类FirewallDriver,每种firewall都需要实现该父类的几个接口;
prepare_port_filter : port创建时调用一次,初始化安全组信息
apply_port_filter
update_port_filter : port安全组更新时被调用
remove_port_filter : port安全组删除时被调用
filter_defer_apply_on
filter_defer_apply_off
ports
defer_apply
update_security_group_members
update_security_group_rules
security_group_updated
这些接口由securitygroups_rpc.py调用。