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
[email protected]
http://openvswitch.org/mailman/listinfo/dev