VPNaaS Simplifié sur Fujitsu K5

2017-11-18

VPNaaS Simplifié sur Fujitsu K5

Machine-translated — the English original is authoritative.

Lors de nos appels de « chirurgie Cloud », je reçois souvent des demandes concernant la configuration de Réseaux Privés Virtuels (IPSec VPN) entre les différents clouds publics et les sites clients.

L'objectif de ce blog est de démontrer le processus d'établissement d'un tunnel sécurisé en utilisant la fonctionnalité VPNaaS disponible sur le Cloud Service K5 de Fujitsu.

Prérequis

La clé du succès réside principalement dans la préparation – la plupart des problèmes surviennent lorsque les configurations VPN du client et celles de K5 ne sont pas programmées avec les mêmes prérequis. Afin d'essayer de simplifier ce processus pour vous, nous avons mis en place chez CNETS un modèle VPNaaS simple qui peut être téléchargé en cliquant sur l'image ci-dessous et partagé avec le client. Veuillez vous assurer que ce document est compris, approuvé et complété avant de tenter de créer votre service – cela semble sensé, j'espère – vous seriez surpris de voir à quel point les gens sautent souvent cette étape.

vpndoc

Un autre prérequis pour votre environnement cloud est que vous ayez déjà créé le réseau virtuel, le sous-réseau, le routeur et ajouté une IP Globale (adresse IP publique) au routeur virtuel.

Une fois ces prérequis remplis, il est temps de commencer à construire votre VPN.

Outil OpenStack IPSec VPNaaS

Encore une fois, CNETS vient à la rescousse, à moins que vous n'aimiez construire manuellement tous les appels API nécessaires, nous avons développé une interface utilisateur basée sur Angular pour simplifier tous les appels API nécessaires à la création et à la configuration de votre VPNaaS. L'outil est disponible ici – https://cnets-vpnaas.uk-1.cf-app.net/ et nécessite un compte administratif valide pour le Cloud Service K5 de Fujitsu pour se connecter.

VPNTool

J'ai également créé le diagramme suivant pour illustrer ce qui sera configuré dans une vidéo bientôt publiée… dès que je parviendrai à faire fonctionner correctement mon logiciel d'enregistrement OBS. Je vais relier deux sous-réseaux à travers deux régions K5 – un sous-réseau est situé dans notre région US et l'autre sous-réseau est dans notre région UK. Le processus exact est le même lors de la configuration du VPNaaS de K5 pour se connecter aux offres VPNaaS d'autres clouds publics/privés ou aux appliances VPN des clients.

K5NetworkingInterVPN

Remarque : Un concept fondamental qui doit être compris est que vous reliez un sous-réseau de couche 3 à un autre sous-réseau de couche 3 uniquement. Ce que je veux dire par là, c'est que dans l'exemple suivant, j'ajouterai le sous-réseau 192.168.10.0/24 dans la région UK et le sous-réseau 192.168.0.0/24 dans la région US au VPN IPSec (ces CIDR de sous-réseau ne doivent pas se chevaucher). Une fois le tunnel VPN établi et les groupes de sécurité corrects appliqués, le Serveur A pourra communiquer avec le Serveur C et vice-versa. Cependant, le Serveur B et le Serveur D NE POURRONT PAS communiquer. Un service proxy supplémentaire serait nécessaire sur chaque sous-réseau pair du VPN pour faciliter le routage du trafic du Serveur B et du Serveur D à travers le tunnel VPN.

Comme nous approchons de Noël et que nous sommes pleins d'esprit festif ici chez CNETS cette semaine (du moins moi), j'ai un dernier régal – pour ceux d'entre vous qui aiment suivre le tutoriel, j'ai également inclus ci-dessous les deux modèles Heat que j'ai utilisés pour la démo afin de construire l'infrastructure dans le diagramme ci-dessus. N'oubliez pas de modifier les paramètres d'entrée et les paramètres DNS pour qu'ils correspondent à votre AZ cible si vous les utilisez sur le Cloud Service K5 de Fujitsu. Ces modèles devraient également fonctionner avec d'autres clouds OpenStack.

Modèle Heat Projet A

Ce fichier contient des caractères Unicode cachés ou bidirectionnels qui peuvent être interprétés ou compilés différemment de ce qui apparaît ci-dessous. Pour les examiner, ouvrez le fichier dans un éditeur qui révèle les caractères Unicode cachés.
En savoir plus sur les caractères Unicode bidirectionnels

Afficher les caractères cachés

heat_template_version: 2013-05-23
# Auteur : Graham Land
# Date : 15/11/2017
# Objectif : Démo VPNaaS IPSec – Base pour le Projet A
#
# Twitter : @allthingsclowd
# Blog : https://allthingscloud.eu
#
#
description : Modèle pour la démo VPNaaS (IPSec) Projet A – Deux réseaux et un routeur avec deux serveurs A & B
# Paramètres d'entrée
parameters:
k5_image:
type: string
label: Nom ou ID de l'image
description: Image à utiliser pour l'instance de calcul
default: "Ubuntu Server 16.04 LTS (English) 01"
flavor:
type: string
label: Flavor
description: Type d'instance (flavor) à utiliser
default: "P-1"
ssh_key_pair:
type: string
label: Nom de la clé
description: Nom de la paire de clés à utiliser pour l'instance de calcul
default: "LEMP-KP-AZ1"
availability_zone:
type: string
label: Zone de disponibilité
description: Région AZ à utiliser
default: "uk-1a"
my_ip:
type: string
label: L'adresse IP (format CIDR) de mon PC sur Internet
description: Adresse IP Internet du PC (format CIDR)
default: "31.53.253.24/32"
# Ressources d'infrastructure K5 à créer
resources:
# Créer un réseau privé
private_network_a:
type: OS::Neutron::Net
properties:
availability_zone: { get_param: availability_zone }
name: "Network-A"
# Créer un nouveau sous-réseau sur le réseau privé
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"]
# Créer un deuxième réseau privé
private_network_b:
type: OS::Neutron::Net
properties:
availability_zone: { get_param: availability_zone }
name: "Network-B"
# Créer un nouveau sous-réseau sur le deuxième réseau privé
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"]
# Créer un routeur virtuel
virtual_router:
type: OS::Neutron::Router
properties:
availability_zone: { get_param: availability_zone }
name: "Simple-Virtual-Router"
# Connecter une interface sur le sous-réseau du réseau privé au routeur
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 }
# Connecter une interface sur le sous-réseau du réseau privé au routeur
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 }
# Créer un groupe de sécurité
security_group:
type: OS::Neutron::SecurityGroup
properties:
description: Groupe de sécurité VPN
name: VPN-SG
rules:
# autoriser le trafic entrant depuis le sous-réseau VPN distant
– remote_ip_prefix: 192.168.10.0/24
protocol: tcp
– remote_ip_prefix: 192.168.10.0/24
protocol: icmp
# autoriser le trafic entrant depuis mon PC distant
– 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
################### Serveur A ################################################################
# Créer un volume système à utiliser avec le serveur
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 }]
# Construire un serveur en utilisant le volume système défini ci-dessus
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 }
###########################################################################################################
################### Serveur B ################################################################
# Créer un volume système à utiliser avec le serveur
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 }
# Construire un serveur en utilisant le volume système défini ci-dessus
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 }
###########################################################################################################

voir le code brut
VPNDemoProjectA.YML
hébergé avec ❤ par GitHub

Modèle Heat Projet B

Ce fichier contient des caractères Unicode cachés ou bidirectionnels qui peuvent être interprétés ou compilés différemment de ce qui apparaît ci-dessous. Pour les examiner, ouvrez le fichier dans un éditeur qui révèle les caractères Unicode cachés.
En savoir plus sur les caractères Unicode bidirectionnels

Afficher les caractères cachés

heat_template_version: 2013-05-23
# Auteur : Graham Land
# Date : 15/11/2017
# Objectif : Démo VPNaaS IPSec – Base pour le Projet B – Deux réseaux et un routeur avec deux serveurs C & D
#
# Twitter : @allthingsclowd
# Blog : https://allthingscloud.eu
#
#
description : Modèle pour la démo VPNaaS (IPSec) Projet B – Deux réseaux et un routeur avec deux serveurs C & D
# Paramètres d'entrée
parameters:
k5_image:
type: string
label: Nom ou ID de l'image
description: Image à utiliser pour l'instance de calcul
default: "Ubuntu Server 16.04 LTS (English) 01"
flavor:
type: string
label: Flavor
description: Type d'instance (flavor) à utiliser
default: "P-1"
ssh_key_pair:
type: string
label: Nom de la clé
description: Nom de la paire de clés à utiliser pour l'instance de calcul
default: "LEMP-KP-AZ2"
availability_zone:
type: string
label: Zone de disponibilité
description: Région AZ à utiliser
default: "uk-1b"
my_ip:
type: string
label: L'adresse IP (format CIDR) de mon PC sur Internet
description: Adresse IP Internet du PC (format CIDR)
default: "31.53.253.24/32"
# Ressources d'infrastructure K5 à créer
resources:
# Créer un réseau privé
private_network_a:
type: OS::Neutron::Net
properties:
availability_zone: { get_param: availability_zone }
name: "Network-C"
# Créer un nouveau sous-réseau sur le réseau privé
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"]
# Créer un deuxième réseau privé
private_network_b:
type: OS::Neutron::Net
properties:
availability_zone: { get_param: availability_zone }
name: "Network-D"
# Créer un nouveau sous-réseau sur le deuxième réseau privé
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"]
# Créer un routeur virtuel
virtual_router:
type: OS::Neutron::Router
properties:
availability_zone: { get_param: availability_zone }
name: "Simple-Virtual-Router"
# Connecter une interface sur le sous-réseau du réseau privé au routeur
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 }
# Connecter une interface sur le sous-réseau du réseau privé au routeur
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 }
# Créer un groupe de sécurité
security_group:
type: OS::Neutron::SecurityGroup
properties:
description: Groupe de sécurité VPN
name: VPN-SG
rules:
# autoriser le trafic entrant depuis le sous-réseau VPN distant
– remote_ip_prefix: 192.168.0.0/24
protocol: tcp
– remote_ip_prefix: 192.168.0.0/24
protocol: icmp
# autoriser le trafic entrant depuis mon PC distant
– 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
################### Serveur A ################################################################
# Créer un volume système à utiliser avec le serveur
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 }]
# Construire un serveur en utilisant le volume système défini ci-dessus
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 }
###########################################################################################################
################### Serveur B ################################################################
# Créer un volume système à utiliser avec le serveur
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 }
# Construire un serveur en utilisant le volume système défini ci-dessus
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 }
###########################################################################################################

voir le code brut
VPNDemoProjectB.YML
hébergé avec ❤ par GitHub

La vidéo de démonstration suivra bientôt.

Bons tunnels !

Graham

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

← All posts