VPNaaS Semplificato su Fujitsu K5
2017-11-18
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.
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.

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.

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
| 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
| 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).
