Learn OpenStack · core/networking

Neutron Operations

Networks

Create a Tenant Network (VXLAN Overlay)

openstack network create \
  --provider-network-type vxlan \
  private-net

Neutron allocates the next available VNI from the vni_ranges pool automatically.

Create a Provider Network (Flat — External)

openstack network create \
  --provider-physical-network physnet1 \
  --provider-network-type flat \
  --external \
  provider-net

physnet1 must appear in the OVS agent's bridge_mappings (e.g., physnet1:br-ex).

Create a Provider Network (VLAN)

openstack network create \
  --provider-physical-network physnet1 \
  --provider-network-type vlan \
  --provider-segment 200 \
  --share \
  vlan200-net

List, Show, Update, Delete Networks

openstack network list
openstack network show private-net
openstack network set --description "Application tier" private-net
openstack network delete private-net

Share a Network via RBAC

# Share private-net with project "acme"
openstack network rbac create \
  --type network \
  --action access_as_shared \
  --target-project acme \
  private-net

Subnets

Create a Subnet on a Tenant Network

openstack subnet create \
  --network private-net \
  --subnet-range 192.168.1.0/24 \
  --gateway 192.168.1.1 \
  --dns-nameserver 8.8.8.8 \
  --dns-nameserver 8.8.4.4 \
  private-subnet

Create a Subnet on a Provider Network (No DHCP)

openstack subnet create \
  --network provider-net \
  --subnet-range 203.0.113.0/24 \
  --gateway 203.0.113.1 \
  --no-dhcp \
  provider-subnet

Create a Subnet with Allocation Pools and Host Routes

openstack subnet create \
  --network private-net \
  --subnet-range 10.0.0.0/24 \
  --gateway 10.0.0.1 \
  --allocation-pool start=10.0.0.100,end=10.0.0.200 \
  --host-route destination=10.1.0.0/24,gateway=10.0.0.254 \
  --dns-nameserver 1.1.1.1 \
  app-subnet

Create an IPv6 Subnet (SLAAC)

openstack subnet create \
  --network private-net \
  --subnet-range fd00:192:168:1::/64 \
  --ip-version 6 \
  --ipv6-ra-mode slaac \
  --ipv6-address-mode slaac \
  private-subnet-v6

List, Show, Update, Delete Subnets

openstack subnet list --network private-net
openstack subnet show private-subnet
openstack subnet set --dns-nameserver 9.9.9.9 private-subnet
openstack subnet delete private-subnet

Routers

Create a Router and Wire It

openstack router create main-router
openstack router add subnet main-router private-subnet
openstack router set --external-gateway provider-net main-router

Create an HA Router

openstack router create --ha ha-router
openstack router add subnet ha-router app-subnet
openstack router set --external-gateway provider-net ha-router

Create a Distributed Router (DVR)

openstack router create --distributed distributed-router

DVR requires neutron.conf to have router_distributed = True or setting it per-router as above.

Manage Router Interfaces

# Add a subnet interface
openstack router add subnet main-router another-subnet

# Add a specific port as router interface
openstack router add port main-router <port-uuid>

# Remove a subnet interface
openstack router remove subnet main-router another-subnet

Show Router Details

openstack router show main-router
openstack router list

Inspect a Router's Network Namespace (on the network/compute node)

# Find the namespace
ip netns list | grep qrouter

# Inspect routing table inside the namespace
ip netns exec qrouter-<uuid> ip route

# Test connectivity from within the namespace
ip netns exec qrouter-<uuid> ping 8.8.8.8

Floating IPs

Allocate a Floating IP

openstack floating ip create provider-net

Output includes the allocated IP, e.g. 203.0.113.15.

Associate a Floating IP with an Instance

openstack server add floating ip my-instance 203.0.113.15

Associate a Floating IP with a Specific Port

openstack floating ip set --port <port-uuid> 203.0.113.15

Disassociate and Release

openstack server remove floating ip my-instance 203.0.113.15
openstack floating ip delete 203.0.113.15

List Floating IPs

openstack floating ip list
openstack floating ip list --status ACTIVE
openstack floating ip list --project acme

Security Groups

Create a Security Group

openstack security group create web-sg \
  --description "Security group for web tier"

Add Ingress Rules

# Allow HTTP from anywhere
openstack security group rule create web-sg \
  --protocol tcp \
  --dst-port 80 \
  --remote-ip 0.0.0.0/0 \
  --ingress

# Allow HTTPS from anywhere
openstack security group rule create web-sg \
  --protocol tcp \
  --dst-port 443 \
  --remote-ip 0.0.0.0/0 \
  --ingress

# Allow ICMP (ping) from anywhere
openstack security group rule create web-sg \
  --protocol icmp \
  --remote-ip 0.0.0.0/0 \
  --ingress

# Allow SSH from a management CIDR
openstack security group rule create web-sg \
  --protocol tcp \
  --dst-port 22 \
  --remote-ip 10.10.0.0/24 \
  --ingress

Allow Traffic from Another Security Group

# Allow PostgreSQL access from instances in the app-sg group
openstack security group rule create db-sg \
  --protocol tcp \
  --dst-port 5432 \
  --remote-group app-sg \
  --ingress

Allow All UDP (e.g., for DNS)

openstack security group rule create web-sg \
  --protocol udp \
  --dst-port 53 \
  --remote-ip 0.0.0.0/0 \
  --ingress

List, Show, Delete Rules

openstack security group rule list web-sg
openstack security group rule show <rule-uuid>
openstack security group rule delete <rule-uuid>
openstack security group delete web-sg

Apply a Security Group to an Instance Port

openstack server add security group my-instance web-sg
openstack server remove security group my-instance default

Ports

Create a Port

openstack port create \
  --network private-net \
  --fixed-ip subnet=private-subnet,ip-address=192.168.1.50 \
  --security-group web-sg \
  app-port

Create a Port with a Specific MAC

openstack port create \
  --network private-net \
  --mac-address fa:16:3e:ab:cd:ef \
  reserved-port

Create a Port with Allowed Address Pairs (e.g., VIP)

openstack port create \
  --network private-net \
  --allowed-address ip-address=192.168.1.200 \
  vip-port

Disable Port Security on a Port

openstack port set --no-security-group --disable-port-security router-port

List, Show, Update, Delete Ports

openstack port list --network private-net
openstack port list --server my-instance
openstack port show app-port
openstack port set --description "Application server NIC" app-port
openstack port delete app-port

Show Port Binding Details

openstack port show app-port -c binding_host_id -c binding_vif_type -c binding_vnic_type -c status

Agent Operations

List All Agents and Their State

openstack network agent list
openstack network agent list --agent-type "OVS agent"
openstack network agent list --host compute01.example.com

Show Agent Details

openstack network agent show <agent-uuid>

Check Which Networks a DHCP Agent Serves

openstack network agent list --network private-net

Schedule a Network to a Specific DHCP Agent

openstack network add agent <dhcp-agent-uuid> private-net
openstack network remove agent <dhcp-agent-uuid> private-net

Schedule a Router to a Specific L3 Agent

openstack network agent add router <l3-agent-uuid> main-router
openstack network agent remove router <l3-agent-uuid> main-router

RBAC Policies

# Allow another project to use a network
openstack network rbac create \
  --type network \
  --action access_as_shared \
  --target-project <project-uuid> \
  private-net

# Allow another project to use a network as an external network
openstack network rbac create \
  --type network \
  --action access_as_external \
  --target-project <project-uuid> \
  provider-net

openstack network rbac list
openstack network rbac show <rbac-uuid>
openstack network rbac delete <rbac-uuid>

Configuration Reference

/etc/neutron/neutron.conf

[DEFAULT]
core_plugin = ml2
service_plugins = router,qos,trunk,segments,port_forwarding
auth_strategy = keystone
transport_url = rabbit://openstack:rabbitpass@controller01:5672/
api_workers = 4
rpc_workers = 4
router_distributed = False
allow_overlapping_ips = True
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
dns_domain = openstack.internal.

[database]
connection = mysql+pymysql://neutron:neutrondbpass@controller01/neutron?charset=utf8mb4

[keystone_authtoken]
www_authenticate_uri = http://controller01:5000
auth_url = http://controller01:5000
memcached_servers = controller01:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = neutron
password = neutronservicepass

[oslo_concurrency]
lock_path = /var/lib/neutron/tmp

[oslo_messaging_rabbit]
rabbit_retry_interval = 1
rabbit_retry_backoff = 2
heartbeat_timeout_threshold = 60

/etc/neutron/plugins/ml2/ml2_conf.ini

[ml2]
type_drivers = flat,vlan,vxlan,geneve
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security,qos,dns

[ml2_type_flat]
flat_networks = physnet1

[ml2_type_vlan]
network_vlan_ranges = physnet1:100:299,physnet2:300:499

[ml2_type_vxlan]
vni_ranges = 1:65535
vxlan_group = 239.1.1.1

[ml2_type_gre]
tunnel_id_ranges = 1:1000

[ml2_type_geneve]
vni_ranges = 1:65535
max_header_size = 38

[securitygroup]
enable_security_group = True
firewall_driver = openvswitch
# For iptables hybrid mode:
# firewall_driver = iptables_hybrid

/etc/neutron/plugins/ml2/openvswitch_agent.ini

[ovs]
local_ip = 10.0.0.11
bridge_mappings = physnet1:br-ex
tunnel_types = vxlan

[agent]
tunnel_types = vxlan
l2_population = True
arp_responder = True
prevent_arp_spoofing = True

[securitygroup]
enable_security_group = True
firewall_driver = openvswitch

/etc/neutron/plugins/ml2/ml2_conf.ini — OVN section

[ml2]
type_drivers = local,flat,vlan,geneve
tenant_network_types = geneve
mechanism_drivers = ovn
extension_drivers = port_security,qos,dns

[ml2_type_geneve]
vni_ranges = 1:65535
max_header_size = 38

[ml2_type_flat]
flat_networks = physnet1

[ml2_type_vlan]
network_vlan_ranges = physnet1:100:299

[ovn]
ovn_nb_connection = tcp:192.168.0.10:6641
ovn_sb_connection = tcp:192.168.0.10:6642
ovn_l3_scheduler = leastloaded
ovn_metadata_enabled = True
enable_distributed_floating_ip = True

[securitygroup]
enable_security_group = True

/etc/neutron/l3_agent.ini

[DEFAULT]
interface_driver = openvswitch
external_network_bridge =
# Leave external_network_bridge empty when using bridge_mappings in OVS agent

[l3_agent]
agent_mode = legacy
# agent_mode = dvr           # on compute nodes for DVR
# agent_mode = dvr_snat      # on the network node for DVR+SNAT
ha_confs_dir = /var/lib/neutron/ha_confs

/etc/neutron/dhcp_agent.ini

[DEFAULT]
interface_driver = openvswitch
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
force_metadata = True

[agent]
root_helper = sudo neutron-rootwrap /etc/neutron/rootwrap.conf

/etc/neutron/metadata_agent.ini

[DEFAULT]
nova_metadata_host = controller01
nova_metadata_port = 8775
metadata_proxy_shared_secret = metadata-proxy-secret-change-me
metadata_workers = 2