VPNaaS Semplificato su Fujitsu K5

2017-11-18

VPNaaS Semplificato su Fujitsu K5

Machine-translated — the English original is authoritative.

Spesso, durante le nostre chiamate di "chirurgia cloud", ricevo richieste su come configurare le Reti Private Virtuali (IPSec VPN) tra le varie cloud pubbliche e i siti dei clienti.

Lo scopo di questo blog è dimostrare il processo di creazione di un tunnel sicuro utilizzando la funzionalità VPNaaS disponibile sul Cloud Service K5 di Fujitsu.

Prerequisiti

La chiave principale per il successo qui è la preparazione: la maggior parte dei problemi si verifica quando le configurazioni VPN del cliente e le configurazioni VPN di K5 non sono programmate con gli stessi prerequisiti. Per cercare di semplificare questo processo per voi, qui da CNETS abbiamo creato un semplice modello VPNaaS che può essere scaricato facendo clic sull'immagine sottostante e condiviso con il cliente. Assicurati che questo documento sia compreso, concordato e completato prima di provare a creare il tuo servizio: sembra sensato, spero, ma rimarresti sorpreso da quanto spesso le persone saltano questo passaggio.

vpndoc

Un altro prerequisito per il tuo ambiente cloud è che tu abbia già creato la rete virtuale, la subnet, il router e aggiunto un IP Globale (indirizzo IP pubblico) al router virtuale.

Una volta completati questi prerequisiti, è ora di iniziare a costruire la tua VPN.

Strumento OpenStack IPSec VPNaaS

Di nuovo, CNETS viene in soccorso: a meno che tu non goda nel costruire manualmente tutte le chiamate API necessarie, abbiamo creato un'interfaccia utente basata su Angular per semplificare tutte le chiamate API necessarie per creare e configurare la tua VPNaaS. Lo strumento si trova qui – https://cnets-vpnaas.uk-1.cf-app.net/ e richiede un account amministrativo valido per Fujitsu Cloud Service K5 per accedere.

VPNTool

Ho anche creato il diagramma seguente per illustrare cosa verrà configurato in un video che sarà pubblicato a breve... non appena riesco a far funzionare nuovamente bene il mio software di registrazione OBS. Collegerò due subnet attraverso due regioni K5: una subnet si trova nella nostra regione USA e l'altra subnet è nella nostra regione UK. Lo stesso identico processo viene utilizzato se si configura la VPNaaS di K5 quando ci si connette alle offerte VPNaaS di altre cloud pubbliche/private o appliance VPN dei clienti.

K5NetworkingInterVPN

Nota: Un concetto fondamentale che deve essere compreso è che stai collegando una subnet di livello 3 a un'altra subnet di livello 3 solo. Cosa intendo con questo? Nell'esempio seguente, aggiungerò la subnet 192.168.10.0/24 nella regione UK e la subnet 192.168.0.0/24 nella regione USA alla VPN IPSec (questi CIDR di subnet non devono sovrapporsi). Una volta stabilito il tunnel VPN e applicati i corretti gruppi di sicurezza, il Server A sarà in grado di comunicare con il Server C e viceversa. Tuttavia, il Server B e il Server D NON saranno in grado di comunicare. Sarebbe necessario un servizio proxy aggiuntivo su ciascuna delle subnet peer della VPN per facilitare l'instradamento del traffico dal Server B e dal Server D attraverso il tunnel VPN.

Visto che siamo vicini a Natale e qui da CNETS questa settimana siamo pieni di spirito festivo (almeno io), ho un ultimo regalo: per coloro che vi piace seguire passo passo, di seguito ho incluso anche i due modelli Heat che ho utilizzato per la demo per costruire l'infrastruttura nel diagramma sopra. Non dimenticare di modificare i parametri di input e le impostazioni DNS per corrispondere alla tua AZ di destinazione se li utilizzi su Fujitsu Cloud Service K5. Questi modelli dovrebbero funzionare anche con altre cloud OpenStack.

Modello Heat Progetto A

Questo file contiene caratteri Unicode nascosti o bidirezionali che potrebbero essere interpretati o compilati in modo diverso da quanto appare di seguito. Per rivederli, apri il file in un editor che riveli i caratteri Unicode nascosti.
Maggiori informazioni sui caratteri Unicode bidirezionali

Mostra caratteri nascosti

heat_template_version: 2013-05-23
# Autore: Graham Land
# Data: 15/11/2017
# Scopo: Demo IPSec VPNaaS – Base per Progetto A
#
# Twitter: @allthingsclowd
# Blog: https://allthingscloud.eu
#
#
description: Template per VPNaaS (IPSec) Demo Progetto A – Due Reti e un Router con due Server A & B
# Parametri di input
parameters:
k5_image:
type: string
label: Nome o ID dell'immagine
description: Immagine da utilizzare per l'istanza di calcolo
default: "Ubuntu Server 16.04 LTS (English) 01"
flavor:
type: string
label: Flavor
description: Tipo di istanza (flavor) da utilizzare
default: "P-1"
ssh_key_pair:
type: string
label: Nome della chiave
description: Nome della coppia di chiavi da utilizzare per l'istanza di calcolo
default: "LEMP-KP-AZ1"
availability_zone:
type: string
label: Zona di disponibilità
description: AZ della regione da utilizzare
default: "uk-1a"
my_ip:
type: string
label: L'indirizzo IP (formato CIDR) del mio PC su Internet
description: Indirizzo IP Internet del PC (formato CIDR)
default: "31.53.253.24/32"
# Risorse infrastrutturali K5 da costruire
resources:
# Crea una rete privata
private_network_a:
type: OS::Neutron::Net
properties:
availability_zone: { get_param: availability_zone }
name: "Network-A"
# Crea una nuova subnet sulla rete privata
private_subnet_a:
type: OS::Neutron::Subnet
depends_on: private_network_a
properties:
availability_zone: { get_param: availability_zone }
name: "Subnetwork-A"
network_id: { get_resource: private_network_a }
cidr: "192.168.0.0/24"
gateway_ip: "192.168.0.254"
allocation_pools:
– start: "192.168.0.100"
end: "192.168.0.150"
dns_nameservers: ["62.60.39.9", "62.60.42.9"]
# Crea una seconda rete privata
private_network_b:
type: OS::Neutron::Net
properties:
availability_zone: { get_param: availability_zone }
name: "Network-B"
# Crea una nuova subnet sulla seconda rete privata
private_subnet_b:
type: OS::Neutron::Subnet
depends_on: private_network_b
properties:
availability_zone: { get_param: availability_zone }
name: "Subnetwork-B"
network_id: { get_resource: private_network_b }
cidr: "10.0.0.0/24"
gateway_ip: "10.0.0.254"
allocation_pools:
– start: "10.0.0.100"
end: "10.0.0.150"
dns_nameservers: ["62.60.39.9", "62.60.42.9"]
# Crea un router virtuale
virtual_router:
type: OS::Neutron::Router
properties:
availability_zone: { get_param: availability_zone }
name: "Simple-Virtual-Router"
# Connetti un'interfaccia sulla subnet della rete privata al router
virtual_router_interface_1:
type: OS::Neutron::RouterInterface
depends_on: virtual_router
properties:
router_id: { get_resource: virtual_router }
subnet_id: { get_resource: private_subnet_a }
# Connetti un'interfaccia sulla subnet della rete privata al router
virtual_router_interface_2:
type: OS::Neutron::RouterInterface
depends_on: virtual_router
properties:
router_id: { get_resource: virtual_router }
subnet_id: { get_resource: private_subnet_b }
# Crea un gruppo di sicurezza
security_group:
type: OS::Neutron::SecurityGroup
properties:
description: Gruppo di sicurezza VPN
name: VPN-SG
rules:
# consenti traffico in entrata dalla subnet VPN remota
– remote_ip_prefix: 192.168.10.0/24
protocol: tcp
– remote_ip_prefix: 192.168.10.0/24
protocol: icmp
# consenti traffico in entrata dal mio PC remoto
– remote_ip_prefix: { get_param: my_ip }
protocol: icmp
– remote_ip_prefix: { get_param: my_ip }
protocol: tcp
port_range_min: 22
port_range_max: 22
################### Server A ################################################################
# Crea un volume di sistema da utilizzare con il server
server-A-sys-vol:
type: OS::Cinder::Volume
properties:
availability_zone: { get_param: availability_zone }
name: "Server-A-boot-vol"
size: 3
volume_type: "M1"
image : { get_param: k5_image }
server-A-port:
type: OS::Neutron::Port
depends_on: private_network_a
properties:
availability_zone: { get_param: availability_zone }
network_id: { get_resource: private_network_a }
name: "Server-A-Port"
fixed_ips:
– subnet_id: { get_resource: private_subnet_a }
security_groups: [{ get_resource: security_group }]
# Costruisci un server utilizzando il volume di sistema definito sopra
server-A:
type: OS::Nova::Server
depends_on: server-A-port
properties:
availability_zone: { get_param: availability_zone }
key_name: { get_param: ssh_key_pair }
image: { get_param: k5_image }
flavor: { get_param: flavor }
admin_user: ubuntu
metadata: { "fcx.autofailover": True }
block_device_mapping: [{"volume_size": "3", "volume_id": {get_resource: server-A-sys-vol}, "delete_on_termination": True, "device_name": "/dev/vda"}]
name: "Server-A"
networks:
– port: { get_resource: server-A-port }
###########################################################################################################
################### Server B ################################################################
# Crea un volume di sistema da utilizzare con il server
server-B-sys-vol:
type: OS::Cinder::Volume
depends_on: private_network_b
properties:
availability_zone: { get_param: availability_zone }
name: "Server-B-boot-vol"
size: 3
volume_type: "M1"
image : { get_param: k5_image }
# Costruisci un server utilizzando il volume di sistema definito sopra
server-B:
type: OS::Nova::Server
properties:
availability_zone: { get_param: availability_zone }
key_name: { get_param: ssh_key_pair }
image: { get_param: k5_image }
flavor: { get_param: flavor }
admin_user: ubuntu
metadata: { "fcx.autofailover": True }
block_device_mapping: [{"volume_size": "3", "volume_id": {get_resource: server-B-sys-vol}, "delete_on_termination": True, "device_name": "/dev/vda"}]
name: "Server-B"
networks:
– network: { get_resource: private_network_b }
###########################################################################################################

visualizza raw
VPNDemoProjectA.YML
ospitato con ❤ da GitHub

Modello Heat Progetto B

Questo file contiene caratteri Unicode nascosti o bidirezionali che potrebbero essere interpretati o compilati in modo diverso da quanto appare di seguito. Per rivederli, apri il file in un editor che riveli i caratteri Unicode nascosti.
Maggiori informazioni sui caratteri Unicode bidirezionali

Mostra caratteri nascosti

heat_template_version: 2013-05-23
# Autore: Graham Land
# Data: 15/11/2017
# Scopo: Demo IPSec VPNaaS – Base per Progetto B – Due Reti e un Router con due Server C & D
#
# Twitter: @allthingsclowd
# Blog: https://allthingscloud.eu
#
#
description: Template per VPNaaS (IPSec) Demo Progetto B – Due Reti e un Router con due Server C & D
# Parametri di input
parameters:
k5_image:
type: string
label: Nome o ID dell'immagine
description: Immagine da utilizzare per l'istanza di calcolo
default: "Ubuntu Server 16.04 LTS (English) 01"
flavor:
type: string
label: Flavor
description: Tipo di istanza (flavor) da utilizzare
default: "P-1"
ssh_key_pair:
type: string
label: Nome della chiave
description: Nome della coppia di chiavi da utilizzare per l'istanza di calcolo
default: "LEMP-KP-AZ2"
availability_zone:
type: string
label: Zona di disponibilità
description: AZ della regione da utilizzare
default: "uk-1b"
my_ip:
type: string
label: L'indirizzo IP (formato CIDR) del mio PC su Internet
description: Indirizzo IP Internet del PC (formato CIDR)
default: "31.53.253.24/32"
# Risorse infrastrutturali K5 da costruire
resources:
# Crea una rete privata
private_network_a:
type: OS::Neutron::Net
properties:
availability_zone: { get_param: availability_zone }
name: "Network-C"
# Crea una nuova subnet sulla rete privata
private_subnet_a:
type: OS::Neutron::Subnet
depends_on: private_network_a
properties:
availability_zone: { get_param: availability_zone }
name: "Subnetwork-C"
network_id: { get_resource: private_network_a }
cidr: "192.168.10.0/24"
gateway_ip: "192.168.10.254"
allocation_pools:
– start: "192.168.10.100"
end: "192.168.10.150"
dns_nameservers: ["62.60.39.9", "62.60.42.9"]
# Crea una seconda rete privata
private_network_b:
type: OS::Neutron::Net
properties:
availability_zone: { get_param: availability_zone }
name: "Network-D"
# Crea una nuova subnet sulla seconda rete privata
private_subnet_b:
type: OS::Neutron::Subnet
depends_on: private_network_b
properties:
availability_zone: { get_param: availability_zone }
name: "Subnetwork-D"
network_id: { get_resource: private_network_b }
cidr: "10.0.10.0/24"
gateway_ip: "10.0.10.254"
allocation_pools:
– start: "10.0.10.100"
end: "10.0.10.150"
dns_nameservers: ["62.60.39.9", "62.60.42.9"]
# Crea un router virtuale
virtual_router:
type: OS::Neutron::Router
properties:
availability_zone: { get_param: availability_zone }
name: "Simple-Virtual-Router"
# Connetti un'interfaccia sulla subnet della rete privata al router
virtual_router_interface_1:
type: OS::Neutron::RouterInterface
depends_on: virtual_router
properties:
router_id: { get_resource: virtual_router }
subnet_id: { get_resource: private_subnet_a }
# Connetti un'interfaccia sulla subnet della rete privata al router
virtual_router_interface_2:
type: OS::Neutron::RouterInterface
depends_on: virtual_router
properties:
router_id: { get_resource: virtual_router }
subnet_id: { get_resource: private_subnet_b }
# Crea un gruppo di sicurezza
security_group:
type: OS::Neutron::SecurityGroup
properties:
description: Gruppo di sicurezza VPN
name: VPN-SG
rules:
# consenti traffico in entrata dalla subnet VPN remota
– remote_ip_prefix: 192.168.0.0/24
protocol: tcp
– remote_ip_prefix: 192.168.0.0/24
protocol: icmp
# consenti traffico in entrata dal mio PC remoto
– remote_ip_prefix: { get_param: my_ip }
protocol: icmp
– remote_ip_prefix: { get_param: my_ip }
protocol: tcp
port_range_min: 22
port_range_max: 22
################### Server A ################################################################
# Crea un volume di sistema da utilizzare con il server
server-A-sys-vol:
type: OS::Cinder::Volume
properties:
availability_zone: { get_param: availability_zone }
name: "Server-C-boot-vol"
size: 3
volume_type: "M1"
image : { get_param: k5_image }
server-A-port:
type: OS::Neutron::Port
properties:
availability_zone: { get_param: availability_zone }
network_id: { get_resource: private_network_a }
name: "Server-C-Port"
fixed_ips:
– subnet_id: { get_resource: private_subnet_a }
security_groups: [{ get_resource: security_group }]
# Costruisci un server utilizzando il volume di sistema definito sopra
server-A:
type: OS::Nova::Server
depends_on: private_network_a
properties:
availability_zone: { get_param: availability_zone }
key_name: { get_param: ssh_key_pair }
image: { get_param: k5_image }
flavor: { get_param: flavor }
admin_user: ubuntu
metadata: { "fcx.autofailover": True }
block_device_mapping: [{"volume_size": "3", "volume_id": {get_resource: server-A-sys-vol}, "delete_on_termination": True, "device_name": "/dev/vda"}]
name: "Server-C"
networks:
– port: { get_resource: server-A-port }
###########################################################################################################
################### Server B ################################################################
# Crea un volume di sistema da utilizzare con il server
server-B-sys-vol:
type: OS::Cinder::Volume
depends_on: private_network_b
properties:
availability_zone: { get_param: availability_zone }
name: "Server-D-boot-vol"
size: 3
volume_type: "M1"
image : { get_param: k5_image }
# Costruisci un server utilizzando il volume di sistema definito sopra
server-B:
type: OS::Nova::Server
properties:
availability_zone: { get_param: availability_zone }
key_name: { get_param: ssh_key_pair }
image: { get_param: k5_image }
flavor: { get_param: flavor }
admin_user: ubuntu
metadata: { "fcx.autofailover": True }
block_device_mapping: [{"volume_size": "3", "volume_id": {get_resource: server-B-sys-vol}, "delete_on_termination": True, "device_name": "/dev/vda"}]
name: "Server-D"
networks:
– network: { get_resource: private_network_b }
###########################################################################################################

visualizza raw
VPNDemoProjectB.YML
ospitato con ❤ da GitHub

Video demo a breve.

Tunneling felice!

Graham

Originally published on allthingscloud.eu (2017-11-18).

← All posts