1. neutron安全组介绍
neutron安全组由L2 Agent来实现,也就是说L2Agent,比如 neutron-linuxbridge-agent,会将安全组规则转换成IPTables规则。一般发生在所有计算节点上,可以作用于任何进出虚拟机的流量。
2. 数据模型
2.1 eutron安全组共涉及五张表:
Ports 存放port信息
Securitygroupportbindings 存放port和安全组绑定关系
Securitygroups 存放安全组信息
Default_security_group 存放默认安全组信息
Securitygrouprules 存放安全组规则信息
这五张表之间的关系如图所示:
Ports通过port_id和Securitygroupportbindings关联。Securitygroupportbindings、 Default_security_group和Securitygrouprules通过security_group_id和Securitygroups关联。Default_security_group中存放租户默认安全组,每个租户有且只有一个默认安全组。
2.2 数据表结构说明
表名:ports
列名 | 类型 | 允许为空 | 主键 | 外键/属性 | 说明 |
tenant_id | Varchar(255) | 是 | 否 | 否 | 租户id |
id | Varchar(36) | 否 | 是 | 否 | port id |
name | Varchar(255) | 是 | 否 | 否 | Port name |
network_id | Varchar(36) | 否 | 否 | 是/ RESTRICT | network id。和networks表关联,删除networks中的network时,如果本表有数据,则不允许删除。 |
mac_address | Varchar(32) | 否 | 否 | 否 | Mac address |
status | Varchar(16) | 否 | 否 | 否 | Port状态 ACTIVE BUILD |
device_id | Varchar(255) | 否 | 否 | 否 | Device id |
device_owner | Varchar(255) | 否 | 否 | 否 | Device owner |
表名:Securitygroupportbindings
列名 | 类型 | 允许为空 | 主键 | 外键 | 说明 |
security_group_id | Varchar(36) | 否 | 是 | 是/RESTRICT | 安全组id。和Securitygroups表关联,删除Securitygroups中的安全组时,如果本表有数据,则不允许删除。 |
port_id | Varchar(36) | 否 | 是 | 是/CASCADE | port id。和ports表关联,删除ports中的port,则删除本表中port_id相同的项。 |
表名:Securitygroups
列名 | 类型 | 允许为空 | 主键 | 外键 | 说明 |
tenant_id | Varchar(255) | 是 | 否 | 否 | 租户id |
id | Varchar(36) | 否 | 是 | 否 | 安全组id |
name | Varchar(255) | 是 | 否 | 否 | 安全组名字 |
description | Varchar(255) | 是 | 否 | 否 | 安全组描述 |
表名:Default_security_group
列名 | 类型 | 允许为空 | 主键 | 外键 | 说明 |
tenant_id | Varchar(255) | 是 | 是 | 否 | 租户id |
id | Varchar(36) | 是 | 否 | 是/CASCADE | 默认安全组id。删除Securitygroups中的Securitygroup,则删除本表中id相同的项。 |
表名:Securitygrouprules
列名 | 类型 | 允许为空 | 主键 | 外键 | 说明 |
tenant_id | Varchar(255) | 是 | 否 | 否 | 租户id |
id | Varchar(36) | 否 | 是 | 否 | 安全组id |
security_group_id | Varchar(36) | 否 | 否 | 是/CASCADE | 安全组id。删除Securitygroups中的Securitygroup,则删除本表中id相同的项。 |
remote_group_id | Varchar(36) | 是 | 否 | 是/CASCADE | 远端安全组id。删除Securitygroups中的Securitygroup,则删除本表中id相同的项。 |
direction | enum | 是 | 否 | 否 | 方向,取值ingress、egress。 |
ethertype | Varchar(40) | 是 | 否 | 否 | 安全组规则类型。ipv4或ipv6。 |
protocol | Varchar(40) | 是 | 否 | 否 | 安全组规则控制的协议。 |
port_range_min | Int(11) | 是 | 否 | 否 | 安全组规则控制的最小端口值。 |
port_range_max | Int(11) | 是 | 否 | 否 | 安全组规则控制的最大端口值。 |
remote_ip_prefix | Varchar(255) | 是 | 否 | 否 | 远端ip前缀。 |
3. 包类设计
虚线部分为RPC调用,箭头表示方向。双箭头则上边表示方向,下面表示回应消息。
图中的类说明:
Neutron-server plugin:Ml2Plugin、SecurityGroupServerRpcMixin。Ml2Plugin提供基本资源的操作,SecurityGroupServerRpcMixin提供安全组、安全组规则的操作。
Ml2Plugin继承的类有:SecurityGroupServerRpcMixin(继承SecurityGroupDbMixin(继承SecurityGroupPluginBase))。
RPC:SecurityGroupAgentRpcApiMixin、SecurityGroupServerRpcCallback、DhcpAgentNotifyAPI、DhcpRpcCallback。SecurityGroupAgentRpcApiMixin提供发送给linuxbridge安全组消息的接口。SecurityGroupServerRpcCallback提供接收linuxbridge安全组消息的方法。DhcpAgentNotifyAPI提供发送给dhcp消息的接口。DhcpRpcCallback提供接收dhcp消息的方法。
Linuxbridge agent:SecurityGroupServerRpcApi、LinuxBridgeNeutronAgentRPC、SecurityGroupAgentRpc。SecurityGroupServerRpcApi提供发送给neutron-server安全组消息的接口。LinuxBridgeNeutronAgentRPC提供linuxbridge的启动流程和轮询任务的处理方法。SecurityGroupAgentRpc提供接收neutron-server安全组消息的方法。
LinuxBridgeNeutronAgentRPC在启动的时候,设置SecurityGroupServerRpcApi作为sg_plugin_rpc,设置SecurityGroupAgentRpc作为自己的sg_agent,设置LinuxBridgeRpcCallbacks作为endpoints。LinuxBridgeRpcCallbacks继承自SecurityGroupAgentRpcCallbackMixin,而在SecurityGroupAgentRpcCallbackMixin的安全组相关方法中会调用sg_agent(SecurityGroupAgentRpc)中的对应方法。
Dhcp agent:DhcpAgent、DhcpPluginApi、DhcpLocalProcess、DeviceManager、DhcpBase。
DhcpPluginApi提供发送给neutron-server消息的接口。DhcpAgent提供接收neutron-server消息的方法。DhcpBase是DhcpLocalProcess的基类,DhcpLocalProcess、DeviceManager是dhcp agent的处理driver,负责处理接收的RPC消息,并调用linux的driver进行处理。
Driver:IptablesFirewallDriver、IptablesManager。这两个类主要提供iptables相关操作。
IptablesFirewallDriver继承自FirewallDriver类