Skip to main content

Create a Site-to-Site VPN Connection with Endpoint Groups

Neutron provides Site-to-Site IPsec VPN through VPN as a Service (VPNaaS). IPsec policies and connections are configured within OpenStack meaning no dedicated virtual machines are required to use this service.

For Horizon procedure please use - Horizon VPN Site-to-Site

Prerequisites​

  • Familiarity with OpenStackClient

Overview​

In this guide you will create a site-to-site IPSec VPN connection. This allows you to configure communication between private networks across regions.

Step One: West Network Setup​

  1. Create Network

    $  openstack network create net-west
    +---------------------------+--------------------------------------+
    | Field | Value |
    +---------------------------+--------------------------------------+
    | admin_state_up | UP |
    | availability_zone_hints | |
    | availability_zones | |
    | created_at | 2022-07-11T17:23:38Z |
    | description | |
    | dns_domain | None |
    | id | ffbb6dc6-4dec-4f96-92c9-2af5098ecca1 |
    | ipv4_address_scope | None |
    | ipv6_address_scope | None |
    | is_default | False |
    | is_vlan_transparent | None |
    | mtu | 1500 |
    | name | net-west |
    | port_security_enabled | True |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | provider:network_type | vxlan |
    | provider:physical_network | None |
    | provider:segmentation_id | 4 |
    | qos_policy_id | None |
    | revision_number | 1 |
    | router:external | Internal |
    | segments | None |
    | shared | False |
    | status | ACTIVE |
    | subnets | |
    | tags | |
    | updated_at | 2022-07-11T17:23:38Z |
    +---------------------------+--------------------------------------+
  2. Create Subnet

    $ openstack subnet create subnet-west \
    --network net-west \
    --subnet-range 10.1.0.0/24
    +----------------------+--------------------------------------+
    | Field | Value |
    +----------------------+--------------------------------------+
    | allocation_pools | 10.1.0.2-10.1.0.254 |
    | cidr | 10.1.0.0/24 |
    | created_at | 2022-07-11T17:25:54Z |
    | description | |
    | dns_nameservers | |
    | dns_publish_fixed_ip | None |
    | enable_dhcp | True |
    | gateway_ip | 10.1.0.1 |
    | host_routes | |
    | id | e4ee7de8-ddfc-43aa-b74b-31e029225603 |
    | ip_version | 4 |
    | ipv6_address_mode | None |
    | ipv6_ra_mode | None |
    | name | subnet-west |
    | network_id | ffbb6dc6-4dec-4f96-92c9-2af5098ecca1 |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | revision_number | 0 |
    | segment_id | None |
    | service_types | |
    | subnetpool_id | None |
    | tags | |
    | tenant_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | updated_at | 2022-07-11T17:25:54Z |
    +----------------------+--------------------------------------+
  3. Create router

    $ openstack router create router-west
    +-------------------------+--------------------------------------+
    | Field | Value |
    +-------------------------+--------------------------------------+
    | admin_state_up | UP |
    | availability_zone_hints | |
    | availability_zones | |
    | created_at | 2022-07-11T17:29:04Z |
    | description | |
    | distributed | False |
    | external_gateway_info | null |
    | flavor_id | None |
    | ha | True |
    | id | e5d611fd-22b6-4da9-bdf4-84eb84d4e6e9 |
    | name | router-west |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | revision_number | 2 |
    | routes | |
    | status | ACTIVE |
    | tags | |
    | tenant_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | updated_at | 2022-07-11T17:29:04Z |
    +-------------------------+--------------------------------------+
  4. Associate subnet (This command returns no output)

    openstack router add subnet router-west subnet-west
  5. Set external gateway (This command returns no output)

     openstack router set --external-gateway \
    $(openstack network list --external -f value -c ID) \
    router-west

Step Two: East Network Setup​

  1. Create Network

    $ openstack network create net-east
    +---------------------------+--------------------------------------+
    | Field | Value |
    +---------------------------+--------------------------------------+
    | admin_state_up | UP |
    | availability_zone_hints | |
    | availability_zones | |
    | created_at | 2022-07-11T18:20:44Z |
    | description | |
    | dns_domain | None |
    | id | 535f5839-ea6e-402f-8235-fdc3b99c9696 |
    | ipv4_address_scope | None |
    | ipv6_address_scope | None |
    | is_default | False |
    | is_vlan_transparent | None |
    | mtu | 1500 |
    | name | net-east |
    | port_security_enabled | True |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | provider:network_type | vxlan |
    | provider:physical_network | None |
    | provider:segmentation_id | 5 |
    | qos_policy_id | None |
    | revision_number | 1 |
    | router:external | Internal |
    | segments | None |
    | shared | False |
    | status | ACTIVE |
    | subnets | |
    | tags | |
    | updated_at | 2022-07-11T18:20:44Z |
    +---------------------------+--------------------------------------+
  2. Create Subnet

    $ openstack subnet create subnet-east --network net-east --subnet-range 10.2.0.0/24
    +----------------------+--------------------------------------+
    | Field | Value |
    +----------------------+--------------------------------------+
    | allocation_pools | 10.2.0.2-10.2.0.254 |
    | cidr | 10.2.0.0/24 |
    | created_at | 2022-07-11T18:25:01Z |
    | description | |
    | dns_nameservers | |
    | dns_publish_fixed_ip | None |
    | enable_dhcp | True |
    | gateway_ip | 10.2.0.1 |
    | host_routes | |
    | id | 1f78171d-e1f4-4920-abf2-45e5f9bf9570 |
    | ip_version | 4 |
    | ipv6_address_mode | None |
    | ipv6_ra_mode | None |
    | name | subnet-east |
    | network_id | 535f5839-ea6e-402f-8235-fdc3b99c9696 |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | revision_number | 0 |
    | segment_id | None |
    | service_types | |
    | subnetpool_id | None |
    | tags | |
    | tenant_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | updated_at | 2022-07-11T18:25:01Z |
    +----------------------+--------------------------------------+
  3. Create router

    $ openstack router create router-east
    +-------------------------+--------------------------------------+
    | Field | Value |
    +-------------------------+--------------------------------------+
    | admin_state_up | UP |
    | availability_zone_hints | |
    | availability_zones | |
    | created_at | 2022-07-11T18:27:25Z |
    | description | |
    | distributed | False |
    | external_gateway_info | null |
    | flavor_id | None |
    | ha | True |
    | id | 075dc3d1-4587-43b0-9f90-19632f012820 |
    | name | router-east |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | revision_number | 2 |
    | routes | |
    | status | ACTIVE |
    | tags | |
    | tenant_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | updated_at | 2022-07-11T18:27:25Z |
    +-------------------------+--------------------------------------+
  4. Associate subnet

    openstack router add subnet router-east subnet-east
  5. Set external gateway

    openstack router set --external-gateway \
    $(openstack network list --external -f value -c ID) \
    router-east

Step Three: Create an IKE and IPSec Policy​

An IKE and IPSec policy will need to be created. It is recommended that you set explicit parameters to provide higher security than the defaults.

openstack vpn ike policy create ikepolicy1 \
--ike-version v2 \
--auth-algorithm sha256 \
--encryption-algorithm aes-256 \
--pfs group14
+-------------------------------+--------------------------------------+
| Field | Value |
+-------------------------------+--------------------------------------+
| Authentication Algorithm | sha256 |
| Description | |
| Encryption Algorithm | aes-256 |
| ID | 2274a56d-c42f-4e60-bdab-a30e572a4baf |
| IKE Version | v2 |
| Lifetime | {'units': 'seconds', 'value': 3600} |
| Name | ikepolicy1 |
| Perfect Forward Secrecy (PFS) | group14 |
| Phase1 Negotiation Mode | main |
| Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
| project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
+-------------------------------+--------------------------------------+
$ openstack vpn ipsec policy create ipsecpolicy1 \
--auth-algorithm sha256 \
--encryption-algorithm aes-256 \
--pfs group14
+-------------------------------+--------------------------------------+
| Field | Value |
+-------------------------------+--------------------------------------+
| Authentication Algorithm | sha256 |
| Description | |
| Encapsulation Mode | tunnel |
| Encryption Algorithm | aes-256 |
| ID | 64eebf8d-7f79-4118-8b9f-0254a9e487d5 |
| Lifetime | {'units': 'seconds', 'value': 3600} |
| Name | ipsecpolicy1 |
| Perfect Forward Secrecy (PFS) | group14 |
| Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
| Transform Protocol | esp |
| project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
+-------------------------------+--------------------------------------+

Step Four: Create VPN Service for Both Sites​

Now create a VPN service for both sites. You will want to take note of the external IP addresses assigned to each.

Note: The VPN services are configured without a subnet defined. This allows you flexibility to configure multiple local subnets in a local endpoint group per IPSec site connection or multiple site connections with different local subnets.

  1. Create VPN west

    $ openstack vpn service create vpn-west \
    --router router-west
    +----------------+--------------------------------------+
    | Field | Value |
    +----------------+--------------------------------------+
    | Description | |
    | Flavor | None |
    | ID | 5fa1384d-8594-468c-a689-e716ae71f9be |
    | Name | vpn-west |
    | Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | Router | e5d611fd-22b6-4da9-bdf4-84eb84d4e6e9 |
    | State | True |
    | Status | PENDING_CREATE |
    | Subnet | None |
    | external_v4_ip | 200.225.46.189 |
    | external_v6_ip | None |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    +----------------+--------------------------------------+

    Take note as the external IP may be different from the router.

  2. Create VPN east

    $ openstack vpn service create vpn-east \
    --router router-east
    +----------------+--------------------------------------+
    | Field | Value |
    +----------------+--------------------------------------+
    | Description | |
    | Flavor | None |
    | ID | 7df8bf8c-03e3-4885-89f3-e6cb3f5d16e4 |
    | Name | vpn-east |
    | Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | Router | 075dc3d1-4587-43b0-9f90-19632f012820 |
    | State | True |
    | Status | PENDING_CREATE |
    | Subnet | None |
    | external_v4_ip | 200.225.46.184 |
    | external_v6_ip | None |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    +----------------+--------------------------------------+

Step Five: Create Endpoint Groups​

  1. Create west local endpoint group

    Local endpoint groups define subnets given by name or UUID. The site west local endpoint contains subnet-west.

    $ openstack vpn endpoint group create subnet-ep-west \
    --type subnet \
    --value subnet-west
    +-------------+------------------------------------------+
    | Field | Value |
    +-------------+------------------------------------------+
    | Description | |
    | Endpoints | ['e4ee7de8-ddfc-43aa-b74b-31e029225603'] |
    | ID | d566c941-e103-492c-8725-d0886133b520 |
    | Name | subnet-ep-west |
    | Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | Type | subnet |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    +-------------+------------------------------------------+
  2. Create west peer endpoint group

    Peer endpoint groups are CIDRs. The site west peer endpoint group will contain the peer subnet CIDR. In this case that's the site east subnet.

    $ openstack vpn endpoint group create peer-ep-west \
    --type cidr \
    --value 10.2.0.0/24
    +-------------+--------------------------------------+
    | Field | Value |
    +-------------+--------------------------------------+
    | Description | |
    | Endpoints | ['10.2.0.0/24'] |
    | ID | 869a2e64-d41d-4996-bd19-0ae4bccdcaee |
    | Name | peer-ep-west |
    | Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | Type | cidr |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    +-------------+--------------------------------------+
  3. Create east local endpoint group

    Local endpoint groups define subnets given by name or UUID. The site east local endpoint contains subnet-east.

    $ openstack vpn endpoint group create subnet-ep-east \
    --type subnet \
    --value subnet-east
    +-------------+------------------------------------------+
    | Field | Value |
    +-------------+------------------------------------------+
    | Description | |
    | Endpoints | ['1f78171d-e1f4-4920-abf2-45e5f9bf9570'] |
    | ID | 1b0a3828-1086-411c-bbfc-96195e76b6ba |
    | Name | subnet-ep-east |
    | Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | Type | subnet |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    +-------------+------------------------------------------+
  4. Create east peer endpoint group

    Peer endpoint groups are CIDRs. The site east peer endpoint group will contain the peer subnet CIDR. In this case that's the site west subnet.

    $ openstack vpn endpoint group create peer-ep-east \
    --type cidr \
    --value 10.1.0.0/24 2>/dev/null
    +-------------+--------------------------------------+
    | Field | Value |
    +-------------+--------------------------------------+
    | Description | |
    | Endpoints | ['10.1.0.0/24'] |
    | ID | a9f46708-ed80-4a83-b4d4-f7d98bc897e7 |
    | Name | peer-ep-east |
    | Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | Type | cidr |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    +-------------+--------------------------------------+

Step Six: Create VPN Site Connections​

  1. Create west site connection

    Create a site connection (conn-west) from site west (VPN service vpn-west) to site east (peer IP address 200.225.46.184) defining the local (subnet-ep-west) and peer (peer-ep-west) endpoint groups.

    $ openstack vpn ipsec site connection create conn-west \
    --vpnservice vpn-west \
    --ikepolicy ikepolicy1 \
    --ipsecpolicy ipsecpolicy1 \
    --peer-address 200.225.46.184 \
    --peer-id 200.225.46.184 \
    --local-endpoint-group subnet-ep-west \
    --peer-endpoint-group peer-ep-west \
    --psk secret
    +--------------------------+----------------------------------------------------+
    | Field | Value |
    +--------------------------+----------------------------------------------------+
    | Authentication Algorithm | psk |
    | Description | |
    | ID | 31a38f73-2c29-452d-a7a8-8990fcde89cf |
    | IKE Policy | 2274a56d-c42f-4e60-bdab-a30e572a4baf |
    | IPSec Policy | 64eebf8d-7f79-4118-8b9f-0254a9e487d5 |
    | Initiator | bi-directional |
    | Local Endpoint Group ID | d566c941-e103-492c-8725-d0886133b520 |
    | Local ID | |
    | MTU | 1500 |
    | Name | conn-west |
    | Peer Address | 200.225.46.184 |
    | Peer CIDRs | |
    | Peer Endpoint Group ID | 869a2e64-d41d-4996-bd19-0ae4bccdcaee |
    | Peer ID | 200.225.46.184 |
    | Pre-shared Key | secret |
    | Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | Route Mode | static |
    | State | True |
    | Status | PENDING_CREATE |
    | VPN Service | 5fa1384d-8594-468c-a689-e716ae71f9be |
    | dpd | {'action': 'hold', 'interval': 30, 'timeout': 120} |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    +--------------------------+----------------------------------------------------+
  2. Create east site connection

    Create a site connection (conn-east) from site east (VPN service vpn-east) to site west (peer IP address 200.225.46.189) defining the local (subnet-ep-east) and peer (peer-ep-east) endpoint groups.

    $ openstack vpn ipsec site connection create conn-east \
    --vpnservice vpn-east \
    --ikepolicy ikepolicy1 \
    --ipsecpolicy ipsecpolicy1 \
    --peer-address 200.225.46.189 \
    --peer-id 200.225.46.189 \
    --local-endpoint-group subnet-ep-east \
    --peer-endpoint-group peer-ep-east \
    --psk secret 2>/dev/null
    +--------------------------+----------------------------------------------------+
    | Field | Value |
    +--------------------------+----------------------------------------------------+
    | Authentication Algorithm | psk |
    | Description | |
    | ID | 324290df-f959-4a52-945f-a3c77466fb01 |
    | IKE Policy | 2274a56d-c42f-4e60-bdab-a30e572a4baf |
    | IPSec Policy | 64eebf8d-7f79-4118-8b9f-0254a9e487d5 |
    | Initiator | bi-directional |
    | Local Endpoint Group ID | 1b0a3828-1086-411c-bbfc-96195e76b6ba |
    | Local ID | |
    | MTU | 1500 |
    | Name | conn-east |
    | Peer Address | 200.225.46.189 |
    | Peer CIDRs | |
    | Peer Endpoint Group ID | a9f46708-ed80-4a83-b4d4-f7d98bc897e7 |
    | Peer ID | 200.225.46.189 |
    | Pre-shared Key | secret |
    | Project | e6fa12aa82f942f199a8cd6f3ee183d1 |
    | Route Mode | static |
    | State | True |
    | Status | PENDING_CREATE |
    | VPN Service | 7df8bf8c-03e3-4885-89f3-e6cb3f5d16e4 |
    | dpd | {'action': 'hold', 'interval': 30, 'timeout': 120} |
    | project_id | e6fa12aa82f942f199a8cd6f3ee183d1 |
    +--------------------------+----------------------------------------------------+

Step Seven: Test Site-to-Site Connection​

Create instances connected to subnet-west and subnet-east and confirm they can communicate via ICMP echo requests to local IPs.