I've been working on Neutron security groups for OVN a bit this week and
have the first rough cut "working" (it does something, at least).  Right
now it only creates ACLs on neutron port creation.  I have to go back
and add cleanup, handle when ports or security groups get updated after
they are created, ...
Anyway, I definitely found myself getting confused with Neutron's SG
ingress vs. egress, OVN ACL direction inbound vs. outbound, and when to
use OVN inport and outport associated with each.  So, here's the
simplest example.  Let me know which part doesn't match what you'd
expect, because surely I've got something backwards.

The "default" security group created by Neutron is this:

> $ neutron security-group-list
> +--------------------------------------+---------+----------------------------------------------------------------------+
> | id                                   | name    | security_group_rules       
>                                           |
> +--------------------------------------+---------+----------------------------------------------------------------------+
> | b5e2bd3c-241d-41f8-b883-1586955078c0 | default | egress, IPv4               
>                                           |
> |                                      |         | egress, IPv6               
>                                           |
> |                                      |         | ingress, IPv4, 
> remote_group_id: b5e2bd3c-241d-41f8-b883-1586955078c0 |
> |                                      |         | ingress, IPv6, 
> remote_group_id: b5e2bd3c-241d-41f8-b883-1586955078c0 |
> +--------------------------------------+---------+----------------------------------------------------------------------+

(To make it easier to talk about direction, I'm going to talk about the
perspective of a VM.)

What this means is that all outgoing IPv4 and IPv6 traffic from a VM
should be allowed.  Incoming IPv4 and IPv6 traffic to a VM that
originated from another VM using the same security group is allowed.
VMs can talk to the world and each other, but the world is not allowed
to talk to the VMs.

The Neutron plugin creates ACLs with 2 priorities.  The numbers are
arbitrary.  It just needs 2 of them.  It uses 1001 to create default
drop rules.  It then adds a rule with a priority of 1000 for each
allow-related rule.

The default drop rules look like this (the quote escaping is done by the
output of ovsdb-client):

ACL:
  priority: 1001
  direction: inbound
  action: drop
  external_ids: {"neutron:lport"="9d0876ea-9191-4d75-83b4-7e20b6d7ad11"}
  match: "outport == \"9d0876ea-9191-4d75-83b4-7e20b6d7ad11\""

ACL:
  priority: 1001
  direction: outbound
  action: drop
  external_ids: {"neutron:lport"="9d0876ea-9191-4d75-83b4-7e20b6d7ad11"}
  match: "inport == \"9d0876ea-9191-4d75-83b4-7e20b6d7ad11\""

The 4 ACL entries here correspond to the 4 security group rules
associated with the "default" security group as shown in the output of
"neutron security-group-list" above.

ACL:
  priority: 1000
  direction outbound
  action: allow-related
  external_ids: {"neutron:lport"="9d0876ea-9191-4d75-83b4-7e20b6d7ad11"}
  match: "inport == \"9d0876ea-9191-4d75-83b4-7e20b6d7ad11\" && ip4"

ACL:
  priority: 1000
  direction outbound
  action: allow-related
  external_ids: {"neutron:lport"="9d0876ea-9191-4d75-83b4-7e20b6d7ad11"}
  match: "inport == \"9d0876ea-9191-4d75-83b4-7e20b6d7ad11\" && ip6"

(Note that the set of UUIDs is the set of ports that use the same
security group.)

ACL:
  priority: 1000
  direction inbound
  action: allow-related
  external_ids: {"neutron:lport"="9d0876ea-9191-4d75-83b4-7e20b6d7ad11"}
  match: "outport == \"9d0876ea-9191-4d75-83b4-7e20b6d7ad11\" && ip4 &&
inport ==
{\"192e5d75-2aac-4213-8bea-81d1322b3ed2\",\"1e6355f5-b6e4-43e3-8e89-aac1836424f8\",\"474febf6-0b68-4807-add7-32fd0de61ff6\",\"5fc806a5-e909-40a7-b037-9d50242596a5\",\"6fdfc7ed-94b9-4be2-92cd-ba56c0c07b3c\",\"9d0876ea-9191-4d75-83b4-7e20b6d7ad11\",\"a6474b44-c091-4be5-a19c-aee8f7529d72\",\"a708bf55-aff7-4cc9-baf4-cc6f7a73e0ca\",\"c092c75d-a342-4f55-b421-c00e15cb4872\",\"d770254e-cc0d-4951-8040-cb7c1fec6961\",\"daceec7d-03db-4f1b-83a3-8a3621693e47\",\"dda41f17-9d8d-4064-8ef5-fd139dc49172\",\"f96a2351-b604-43b0-a34f-54fd861edfc9\"}"

ACL:
  priority: 1000
  direction inbound
  action: allow-related
  external_ids: {"neutron:lport"="9d0876ea-9191-4d75-83b4-7e20b6d7ad11"}
  match: "outport == \"9d0876ea-9191-4d75-83b4-7e20b6d7ad11\" && ip6 &&
inport ==
{\"192e5d75-2aac-4213-8bea-81d1322b3ed2\",\"1e6355f5-b6e4-43e3-8e89-aac1836424f8\",\"474febf6-0b68-4807-add7-32fd0de61ff6\",\"5fc806a5-e909-40a7-b037-9d50242596a5\",\"6fdfc7ed-94b9-4be2-92cd-ba56c0c07b3c\",\"9d0876ea-9191-4d75-83b4-7e20b6d7ad11\",\"a6474b44-c091-4be5-a19c-aee8f7529d72\",\"a708bf55-aff7-4cc9-baf4-cc6f7a73e0ca\",\"c092c75d-a342-4f55-b421-c00e15cb4872\",\"d770254e-cc0d-4951-8040-cb7c1fec6961\",\"daceec7d-03db-4f1b-83a3-8a3621693e47\",\"dda41f17-9d8d-4064-8ef5-fd139dc49172\",\"f96a2351-b604-43b0-a34f-54fd861edfc9\"}"

-- 
Russell Bryant
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to