đŸ”„ Mise en place d’une solution VPN pour intĂ©gration API

déc. 5, 2024·
Louis QUES
Louis QUES
· 7 min. de lecture

L’entreprise (mon client) m’a contactĂ© afin de mettre en place une solution VPN pour pouvoir faire des requĂȘtes API depuis ses locaux et machines de production sur un serveur nĂ©cessitant une connection VPN IKEv2/IPSec.

Il ‘s’agit d’une entreprise de gestion de patrimoine et placements financiers qui proposent des produits financiers a ces clients.

Ils viennent de signer un contrat de collaboration avec un grand groupe financier (le fournisseur d’API). L’entreprise propose dans son catalogue client les produits fournis par ce groupe financier.

A fin que le client finial puisse faire des simulations de prix en ligne ils doivent intégrer le catalogue du groupe financier dans leur site web a travers une API.

Le seul soucis est que cette API est accessible uniquement par VPN.

Or les dĂ©veloppeurs travaillent depuis leurs postes et depuis des instances Heroku donc installer un VPN directement sur leur ordinateur n’était pas une solution.

AprĂšs rĂ©flexion et en tenant compte du besoin du client, j’ai dĂ©cidĂ© de crĂ©er une infrastructure sur aws qui puisse rĂ©soudre ce problĂšme.

J’ai d’abord crĂ©e un environnement rĂ©seau avec une passerelle par default (IGW) et une passerelle VPN.

Dans cet environnement j’y ai placĂ© une Instance EC2 Ubuntu server 22.04 afin qu’il agisse comme reverse proxy.

Puis j’ai fait pointer un nom de domaine propre a l’entreprise vers cette instance EC2

Donc a chaque fois que une requĂȘte API est rĂ©alisĂ©e avec notre nom de domaine, le proxy qui est connectĂ© au VPN du groupe financier change l’URL afin que le nom de domaine de l’endpoint soit appelĂ© avec le bon URL.

De cette façon mon client peut rĂ©aliser des requĂȘtes API depuis n’importe quel poste ou instance cloud en utilisant uniquement son nom de domaine.

J’ai rĂ©solu ce problĂšme en 3 Ă©tapes:

  • Creation de l’infrastructure
  • ParamĂ©trage du VPN
  • CrĂ©ation et paramĂ©trage du reverse proxy
    image.png

1) Creation de l’infrastructure sur AWS

Dans cette Ă©tape, Il s’agit de crĂ©er le “tĂ©rreau” pour que l’ensemble des Ă©lĂ©ments puisse fonctionner correctement.

Changement de Zone

Nous allons commencer par changer de Zone. Personnellement, si j’ai le choix, je prĂ©fĂšre bĂątir des projets sur des zones aux USA (par exemple N. Virginia) au lieu de Europe car certains produits ne sont pas disponibles, comme des t2.micro.

image.png

Création du VPC

Je choisis un block en /24 qui sera largement suffisant pour 1 VM sur le projet !

image.png

Création du subnet

Dans ce block CIDR de /24 qui me donne une plage de 256 addresses IP, je le fragmente en un sous-domaine en /28 ce qui me donne une plage de 16 IP.

(Question: combien de sous-domaines en /28 je peux créer dans le block CIDR en /24 ? Réponse : Dans un block CIDR de /24 avec plage de 256 adresses IP je peux créer 16 sous-réseaux /28 comprenant 16 adresses IP chacun)

J’aurais souhaitĂ©e crĂ©er un sous-domaine en /30 pour me donner que 4 addresses IP mais aws n’accepte pas au delĂ  de 28/

image.png

Création du IGW (Internet GateWay)

C’est la passerelle par dĂ©faut de notre ensemble.

image.png

on l’attache au bon VPC

image.png

Création des routes tables

Nous allons crĂ©er les rĂšgles de routage pour l’ensemble du VPC. De base nous avons la route qui permet d’acceder dans tout le block CIDR /24 10.0.0.0/24 —> local

Nous allons rajouter, dans un premier temps, la route pour accĂ©der Ă  l’extĂ©rieur du rĂ©seau (c’est Ă  dire Internet). Pour toute les routes correspondant Ă  la destination 0.0.0.0/0 qui reprĂ©sente la totalitĂ© du trafic internet sortant, ce trafic sera dirigĂ© via la Internet Gateway.

image.png

Tunnel VPN IKEv2/IPSec

Dans cette Ă©tape je vais crĂ©er la partie qui me concerne pour l’tablissement du tunnel VPN IKEv2/IPSec. Voici le chahier des charges fourni pour la crĂ©ation du tunnel:

image.png

Création du Custommer Gateways

On renseigne l’IP publique de notre partenaire dans l’autre bout du tunnel

image.png

Création du VPG

Puis on nomme notre VPG (Virtual Private Gateway) et on l’attache à notre VPC

image.png

Création de la connection VPN

image.png

Static IP préfixes correspond aux plages IP qui pourront avoir accÚs a votre site à travers du tunnel. Dans notre cas 192.168.22.188/30 est le LAN de notre partenaire 10.0.0.0/28 est notre LAN

image.png

Au niveau des Tunnel Options, vous rentrerez la PSK (PrĂ© Shared Key) qui permet l’authentification du Tunnel VPN

image.png

A la fin de ces Ă©tapes, aws, crĂ©e 2 tunnels VPN avec 2 IP diffĂ©rentes. Dans mon cas j’ai partagĂ© uniquement la deuxiĂšme IP. Vous pouvez partager les 2 et avoir plus de redondance. Si un tunnel n’est plus actif le deuxiĂšme prends le relais.

image.png

Modifier la table de routage

Vous devez modifier la table de routage du VPC pour que les paquets a destination de 192.168.22.188/30 (rĂ©seau LAN de l’autre bout du tunnel) passent par la VPG (Virtual Private Gateway)

La rùgle sera la suivante: 192.168.22.188/30 —→ vgw-xxxxxxxx

Création du Reverse Proxy

Il ne nous reste que crĂ©er et paramĂ©trer le reverse proxy qui sera responsable de modifier les domaines dans les requĂȘtes API.

imaginons que le endpoint API officiel soit: api.company.com/edp/products nous ne pouvons acceder Ă  cet endpoint que par VPN. Or si je suis a mon domicile il m’est impossible d’acceder a cet API. J’ai donc besoin d’un intermĂ©diaire qui lui sera bien connectĂ© au VPN et en mĂȘme temps sera connectĂ© a internet. Donc, ce reverse proxy, fera le pont, (le messager) entre le VPN en mon domicile grace a mon nom de domaine.

CrĂ©ation d’une VM Ubuntu

On va aller chercher dans le catalogue AMI un Ubuntu 22.04 ou 24.04 en 64-bit (x86)

image.png

Donnez lui un nom

image.png

Choissisez une intsance t2.micro

image.png

crééez une paire de clés (privé, publique). Si vous utilisez Putty comme client SSH utilisez .ppk si vous utilisez le CMD ou un terminal bash utilisez .pem

image.png

le fichier va télécharger sur votre ordinateur. gardez-le précizeusement car sans lui vous ne pourrez pas vous connecter a votre VM.

Au niveau des Network Settings: Choissez le bon VPC et subnet puis créez un nouveau groupe de sécurité avec seulement 2 rÚgles.

SSH depuis votre IP publique pour administrer votre VM

et HTTPS anywhere pour laisser passer les packets de vos requettes API

Vous pouvez rajouter ICMP pour réaliser des pings si besoin et tester les tunnel VPN avec votre partennaire.

image.png

Puis lancez la crĂ©ation de l’instance:

image.png

on attribue une adresse IP externe fixe a notre VM avec Elastic IP

image.png

et associez cette IP a votre nouvelle instance (VM).

image.png

Paramétrer le notre nom de domaine:

Dans cette Ă©tape, nous devons faire pointer notre nom de sous-domaine vers l’IP publique de notre VM.

Pourcela il faut se rendre dans l’interface de votre bureau d’enregistrement de domaines (OVH, Route53, gandi,
) trouvez la zone DNS et crĂ©ez une entrĂ©e de type A avec le sous doimaine de voter choix (ex: apitest.lousques.com) qui pointe vers l’IP de votre VM

Configurer la VM

Une fois ces Ă©tapes accomplies et la VM dĂ©marrĂ©e on va se connecter a celle-ci au travers d’un terminal avec la commande suivante:

ssh -i /chemin/vers/votre/cle.pem utilisateur@adresse-ip-ou-nom-de-domaine

exemple: ssh -i c:\Downloads\ubuntu-key.pem ubuntu@32.15.65.22

ubuntu est le nom utilisateur de votre VM

On va commencer par mettre a jour la VM avec cette commande:

sudo apt update

on installe nginx qui fera office de reverse proxy sudo apt install nginx

Nous allons immédiatement créer un backup du fichier default se trouvant dans /etc/nginx/sites-vailable/default avec cette commande **sudo cp default default.bak**

image.png

Installation de Certbot pour certificat SSL

sudo apt install python3-certbot-nginx

certbot --version

image.png

Obtenir et installer le Certificat SSL:

sudo certbot --nginx -d apitest.louisques.fr

Renseignez votre adresse email et répondez poar oui / non a certaines questions.

image.png

Modification du fichier de configuration Nginx

Nous allons maintenant transformer nginx en reverse proxy. Retournez sue le ficher default sur /etc/ngnix/sites-available/default et ouvrez le :

sudo nano default

remplacez apitest.louisques.fr par votre sous-domaine

server {
listen 80;
server_name apitest.louisques.fr;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
server_name apitest.louisques.fr;

ssl_certificate /etc/letsencrypt/live/apitest.louisques.fr/fullchain.pem; # Managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/apitest.louisques.fr/privkey.pem; # Managed by Certbot

location / {
proxy_pass https://apitest.louisques.fr:
proxy_set_header Host apitest.louisques.fr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

}
}

enregistrez control^X YES et redémarrez le service nginx

sudo systemctl reload nginx

vĂ©rifie que les fichiers nginx sont lisibles et ne comportent pas d’erreur

sudo nginx -t

Si tout ok on passe à la derniÚre étape.

Modifier le fichier hosts

Modifier le fichier hosts de notre Ubuntu afin qui résolve la bonne adresse IP à partir de domaine fourni par le reverse proxy.

image.png

Toutes les Ă©tapes nĂ©cessaires a la rĂ©alisation de cette mission ont Ă©tĂ©s effectuĂ©s. Normalement a ce stade, mon client peut rĂ©aliser des requĂȘtes API de n’importe quel poste ou instance cloud en utilisant un sous-domaine personnalisĂ© et recevoir la rĂ©ponse.