VPNaaS Simplifié sur Fujitsu K5
2017-11-18
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.
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.

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.

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