# Create router
openstack router create test-router1 \
--centralized \
--ha \
--external-gateway public
# Show available tenant IPv6 subnet
openstack subnet pool list --share | grep tenant-subnet-pool-v6
# Create network
openstack network create test-network1
# DUAL-STACK: Create IPv4 subnet (skip for IPv6 only)
openstack subnet create test-subnet1-ipv4 \
--network test-network1 \
--subnet-range 10.11.12.0/24
# DUAL-STACK: Attach IPv4 subnet to router (skip for IPv6 only)
openstack router add subnet test-router1 test-subnet1-ipv4
# Create IPv6 subnet
openstack subnet create test-subnet1-ipv6 \
--network test-network1 \
--ip-version 6 \
--subnet-pool tenant-subnet-pool-v6 \
--prefix-length 64 \
--ipv6-ra-mode dhcpv6-stateless \
--ipv6-address-mode dhcpv6-stateless
# Attach IPv6 subnet to router
openstack router add subnet test-router1 test-subnet1-ipv6
# OPTINAL: allow access from outside
SECURITY_GROUP=test-secgroup
openstack security group create ${SECURITY_GROUP}
# DUAL-STACK: allow access to Floating FIP from outside (skip for IPv6 only)
openstack security group rule create ${SECURITY_GROUP} --ethertype IPv4 --protocol icmp --ingress --remote-ip 0.0.0.0/0
openstack security group rule create ${SECURITY_GROUP} --ethertype IPv4 --protocol icmp --egress --remote-ip 0.0.0.0/0
openstack security group rule create ${SECURITY_GROUP} --ethertype IPv4 --protocol tcp --dst-port 22 --remote-ip 0.0.0.0/0
openstack security group rule create ${SECURITY_GROUP} --ethertype IPv4 --protocol tcp --dst-port 80 --remote-ip 0.0.0.0/0
# OPTINAL: allow access to IPv6 from outside
openstack security group rule create ${SECURITY_GROUP} --ethertype IPv6 --protocol ipv6-icmp --ingress --remote-ip "::/0"
openstack security group rule create ${SECURITY_GROUP} --ethertype IPv6 --protocol ipv6-icmp --egress --remote-ip "::/0"
openstack security group rule create ${SECURITY_GROUP} --ethertype IPv6 --protocol tcp --dst-port 22 --remote-ip "::/0"
openstack security group rule create ${SECURITY_GROUP} --ethertype IPv6 --protocol tcp --dst-port 80 --remote-ip "::/0"
# Crate test VM
SERVER_ID=test-vm1-test
openstack server create ${SERVER_ID} \
--flavor m1.small \
--image "Ubuntu 24.04" \
--network test-network1 \
--key-name test-key \
--security-group ${SECURITY_GROUP}
# DUAL-STACK: Assign IPv4 floating IP to the VM (skip for IPv6 only)
FLOATING_IP=$(openstack floating ip create public -c floating_ip_address -f value)
openstack server add floating ip ${SERVER_ID} ${FLOATING_IP}
# Show IP adresses
openstack server show ${SERVER_ID} -c addressesDEBUG: show netplan configuration
# sudo cat /etc/netplan/50-cloud-init.yaml
network:
version: 2
ethernets:
ens3:
match:
macaddress: "fa:16:3e:81:f5:85"
dhcp4: true # disable for IPv6 only
dhcp6: true
set-name: "ens3"Allow unprivileged user to create a centralized router
# /etc/neutron/policy.json
{
"context_is_admin": "role:admin",
"admin_or_owner": "rule:context_is_admin or tenant_id:%(tenant_id)s",
"create_router:external_gateway_info": "rule:admin_or_owner",
"create_router:external_gateway_info:network_id": "rule:admin_or_owner",
"create_router:ha": "rule:admin_or_owner",
"create_router:distributed": "rule:admin_or_owner"
}