Learn OpenStack · core/networking
Neutron Architecture
Neutron Server
The neutron-server process is a WSGI application that exposes the Neutron v2 REST API. It handles no actual packet forwarding — its job is to accept API requests, validate them, persist state to the database, and dispatch configuration to agents via RPC (AMQP/RabbitMQ) or directly to backend SDN controllers.
Internal structure of neutron-server:
neutron-server
├── API layer (Pecan/WSGI, versioned at /v2.0)
│ ├── Resource controllers (networks, subnets, ports, routers, …)
│ └── Policy enforcement (oslo.policy, RBAC)
├── Plugin framework
│ ├── Core plugin → ML2Plugin (most deployments)
│ └── Service plugins (L3, QoS, Trunk, Segments, BGP, …)
├── DB layer (oslo.db → SQLAlchemy → MariaDB/PostgreSQL)
├── RPC layer (oslo.messaging → RabbitMQ)
│ ├── Cast/call to agents (OVS agent, DHCP agent, L3 agent, metadata agent)
│ └── Callbacks from agents (port status updates, binding confirmations)
└── Extension manager (loads API extensions from entry points)
neutron-server runs as multiple workers (set api_workers in neutron.conf). All workers share the same DB connection pool and the same RabbitMQ connection.
ML2 Plugin
The Modular Layer 2 (ML2) plugin is the standard core plugin. It replaces the older monolithic plugins (OVS plugin, Linux Bridge plugin). ML2 decomposes network behaviour into two independent driver hierarchies:
Type Drivers
Type drivers manage the allocation and lifecycle of network segment identifiers (VLAN IDs, VXLAN VNIs, etc.).
| Type | Segment ID | Use Case |
|---|---|---|
flat |
none (untagged) | Provider networks on a dedicated physical NIC |
vlan |
802.1Q VLAN ID (1–4094) | Provider networks; isolation via VLAN tagging |
vxlan |
VNI (1–16 777 215) | Tenant networks; overlay tunnels between compute nodes |
gre |
tunnel key | Tenant overlay; less common than VXLAN |
geneve |
VNI | Used by OVN; carries metadata in header extensions |
local |
none | Single-node testing; no inter-node connectivity |
Type drivers are configured in ml2_conf.ini:
[ml2]
type_drivers = flat,vlan,vxlan,geneve
tenant_network_types = vxlan,geneve
Mechanism Drivers
Mechanism drivers implement the actual wiring of ports to the underlying network infrastructure. Multiple mechanism drivers can be active simultaneously.
| Driver | Backend | Agent Required |
|---|---|---|
openvswitch |
Open vSwitch | neutron-openvswitch-agent on each compute/network node |
ovn |
OVN (ovsdb) | ovn-controller on each node; no separate Neutron agent |
linuxbridge |
Linux bridge + VXLAN/VLAN | neutron-linuxbridge-agent on each node |
l2population |
Flood/learn optimization | Works alongside OVS or Linux Bridge to pre-populate FDB |
macvtap |
SR-IOV macvtap | For VMs with direct hardware attachment |
Configuration:
[ml2]
mechanism_drivers = ovn,l2population
# or for OVS deployments:
# mechanism_drivers = openvswitch,l2population
Extension Manager
ML2's extension manager loads port binding extensions, port security, VLAN transparency, and others as ML2 extension drivers:
[ml2]
extension_drivers = port_security,qos,dns
Agents
In ML2/OVS deployments, several agents run on each host and communicate with neutron-server over RabbitMQ.
L2 Agent (OVS Agent)
neutron-openvswitch-agent runs on every compute node and network node. Responsibilities:
- Programs OVS flow rules on
br-intandbr-tunin response to RPC from neutron-server - Manages tunnel endpoints (VTEP) for VXLAN/GRE
- Handles port binding confirmation
- Reports agent state (heartbeat) to neutron-server every
report_intervalseconds (default 30 s) - Implements security group rules as OVS flows (OVS firewall driver) or iptables (hybrid driver)
In ML2/OVN deployments the OVS agent is replaced by ovn-controller (see ovn.md).
L3 Agent
neutron-l3-agent runs on dedicated network nodes (or on compute nodes in DVR mode). Responsibilities:
- Creates Linux network namespaces (
qrouter-<uuid>) for each virtual router - Configures IP addresses, routing tables, iptables NAT rules inside the namespace
- Implements SNAT for floating IPs and for instances without floating IPs (centralized SNAT)
- In HA mode: runs keepalived/VRRP inside the namespace for failover between L3 agent nodes
- In DVR mode: each compute node hosts a partial router namespace for east-west traffic; only SNAT remains centralized
DHCP Agent
neutron-dhcp-agent runs on network nodes. Responsibilities:
- Spawns one
dnsmasqprocess per network that has DHCP enabled - Each dnsmasq process runs in a Linux network namespace (
qdhcp-<uuid>) - Passes host/DHCP entries to dnsmasq via a
hostsfile andoptsfile - Supports HA: multiple DHCP agents can be scheduled to the same network; all serve DHCP simultaneously (active-active)
Metadata Agent
neutron-metadata-agent runs on network nodes (and on compute nodes in DVR mode). Responsibilities:
- Provides a proxy for the Nova metadata API (
http://169.254.169.254) - Instances send HTTP to 169.254.169.254; the request enters the router or DHCP namespace, is forwarded to the metadata agent, which adds
X-Forwarded-ForandX-Neutron-Network-Idheaders and proxies tohttp://<nova-api>:8775/openstack/ - In OVN deployments a dedicated
neutron-ovn-metadata-agenthandles this using OVN port binding extensions (see ovn.md)
Network Types
Provider Networks
Provider networks map directly to physical network infrastructure the operator controls. They are typically used for:
- External/floating IP networks (mapped to an uplink VLAN or untagged interface)
- Networks shared to tenants that need direct physical access
Key attributes:
--provider-physical-network physnet1 # maps to bridge_mappings in agent config
--provider-network-type flat|vlan|...
--provider-segment 200 # VLAN ID (for vlan type)
Provider networks can be --external (used as router gateways / floating IP pools) or shared with --share.
Tenant / Project Networks
Tenant networks are created by end users. They are isolated by VXLAN VNI, GRE key, or GENEVE VNI and live entirely in the overlay. Traffic leaves the overlay only when:
- It passes through a virtual router with an external gateway (SNAT/floating IP)
- It is destined for another tenant network behind the same router (east-west)
Core Resource Model
Network (L2 domain)
└── Subnet (IP range, gateway, DHCP pool, DNS, routes)
└── Port (attachment point; has MAC, one or more fixed IPs)
└── Bound to: instance, router interface, DHCP tap, load balancer, etc.
Router (L3 gateway)
├── Router interfaces (connect subnets to the router)
└── External gateway (connects router to provider network)
Floating IP (1:1 NAT mapping)
├── External IP (from provider subnet)
└── Fixed IP (on a port attached to an instance)
Security Group (stateful firewall)
└── Security Group Rules (ingress/egress, protocol, port range, CIDR or remote SG)
Port States and Binding
A port moves through these states:
| Status | Meaning |
|---|---|
DOWN |
Port created but not bound to a host |
BUILD |
Nova has requested binding; agent is programming the dataplane |
ACTIVE |
Port is fully bound and dataplane is configured |
ERROR |
Binding failed |
The binding:vif_type indicates what interface type Nova should plumb (e.g., ovs, vhostuser, hw_veb for SR-IOV).
Extension Framework
Neutron's API is extensible via:
- API extensions — add new resources or extend existing ones (e.g.,
router,security-group,floating-ips,port-security,dns-integration) - Service plugins — loaded at startup, implement entire feature areas with their own DB tables and agents (e.g.,
router/ L3,qos,trunk,segments,bgp,vpnaas,lbaas)
Extensions are discovered from entry points. List loaded extensions:
openstack extension list --network
Nova Integration — Port Binding During Instance Boot
When Nova boots an instance that requests a Neutron port:
- Nova calls
POST /v2.0/ports(or uses a pre-created port) withbinding:host_idset to the compute node hostname - Neutron ML2 iterates mechanism drivers calling
bind_port()in order - The winning mechanism driver sets
binding:vif_typeandbinding:vif_details - Nova reads
vif_typeto determine how to attach the guest NIC (tap, vhostuser, etc.) - The L2 agent on that compute node receives an RPC
port_updateand programs OVS flows - The agent calls back with
update_device_upto set port status toACTIVE - Nova is notified via the
network-changedserver event and the instance network is ready
In OVN deployments steps 5-6 are handled by ovn-controller writing directly to the OVN southbound DB; no Neutron RPC round-trip to an agent is needed.