neutron安全组由L2 Agent来实现,也就是说L2Agent,比如 neutron-linuxbridge-agent,会将安全组规则转换成IPTables规则。一般发生在所有计算节点上,可以作用于任何进出虚拟机的流量。
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中存放租户默认安全组,每个租户有且只有一个默认安全组。
表名: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前缀。 |
虚线部分为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类