Lab 07 : Connexion VPN entre OKS et un réseau de VM
Objectifs du TP
Section intitulée « Objectifs du TP »À la fin de ce lab, vous serez capable de :
- Créer une connexion VPN IPsec depuis un cluster OKS
- Comprendre le rôle des composants :
- Virtual Gateway
- Client Gateway
- Tunnel VPN
- Configurer un client VPN StrongSwan côté VM
- Tester la connectivité Pod OKS ↔ VM via le tunnel VPN
Préparation de l’environnement
Section intitulée « Préparation de l’environnement »Avant de commencer ce TP, assurez-vous de disposer des éléments suivants :
-
Un cluster OKS. 👉 Cliquez ici pour accéder au TP de création d’un cluster OKS si ce n’est pas encore fait.
-
Une machine virtuelle (VM) dans un réseau privé, hébergée dans un autre NET. 👉 Cliquez ici pour accéder au TP de création d’une VM dans un réseau privé si ce n’est pas encore fait.
Création de la connexion VPN depuis le cluster OKS
Section intitulée « Création de la connexion VPN depuis le cluster OKS »La connexion VPN est créée à l’aide d’une ressource Kubernetes personnalisée de type VpnConnection.
Cette ressource permet à OKS de configurer automatiquement :
- un Virtual Gateway
- une connexion VPN IPsec
- la génération automatique de la clé pré-partagée (PSK)
- le stockage de la configuration du client VPN
Étape 1 : Créer la ressource VpnConnection
Section intitulée « Étape 1 : Créer la ressource VpnConnection »Créez un fichier nommé vpn-connection.yaml avec le contenu suivant :
apiVersion: oks.dev/v1betakind: VpnConnectionmetadata: name: oks-vpnspec: publicIp: <IP_PUBLIQUE_DE_LA_VM> bgpAsn: 65000 staticRoutesOnly: true vpnRoutes: - 10.10.0.0/16 clientGatewayConfigurationStorage: namespace: default configMapName: oks-vpn-config secretName: oks-vpn-secretDescription des champs principaux
Section intitulée « Description des champs principaux »- publicIp : adresse IP publique de la VM jouant le rôle de Client Gateway
- bgpAsn : numéro d’ASN utilisé pour identifier le client gateway
- staticRoutesOnly : indique que le routage est statique
- vpnRoutes : plage CIDR du réseau distant (réseau des VM)
- clientGatewayConfigurationStorage :
- définit l’emplacement où OKS stocke la configuration VPN côté client
Appliquez la configuration sur le cluster OKS :
kubectl apply -f vpn-connection.yamlVérifier l’état de la connexion VPN
Section intitulée « Vérifier l’état de la connexion VPN »Après la création de la ressource, vérifiez que la connexion VPN est correctement prise en compte par OKS.
kubectl get vpncExemple de sortie attendue :
NAME VPN CONNECTION ID VPN CONNECTION STATE VGW PUBLIC IP TUNNEL STATE TUNNEL STATE DESCRIPTIONoks-vpn vpn-2210a74d available 142.44.58.83 DOWN IPSEC IS DOWNRessources créées automatiquement par OKS
Section intitulée « Ressources créées automatiquement par OKS »Après la création de la ressource VpnConnection, OKS crée automatiquement deux objets Kubernetes dans le namespace concerné :
- un Secret pour stocker la clé pré-partagée (PSK)
- un ConfigMap pour stocker la configuration du Client Gateway (IP du Virtual Gateway, paramètres des tunnels, etc.)
Secret : PRE_SHARED_KEY (PSK)
Section intitulée « Secret : PRE_SHARED_KEY (PSK) »Le Secret oks-vpn-secret contient la clé pré-partagée utilisée pour l’authentification IPsec entre le Client Gateway et le Virtual Gateway OKS.
Affichage du Secret :
kubectl get secret oks-vpn-secret -o yamlExtrait significatif :
data: PRE_SHARED_KEY: XXXXXXXXXXXXXXXXXXXXkind: Secrettype: Opaque- La valeur est encodée en Base64.
- Cette clé devra être utilisée côté VM lors de la configuration de StrongSwan.
ConfigMap : configuration du Client Gateway
Section intitulée « ConfigMap : configuration du Client Gateway »Le ConfigMap oks-vpn-config contient l’ensemble des paramètres nécessaires à la configuration du client VPN.
Affichage du ConfigMap :
kubectl get configmap oks-vpn-config -o yamlLe champ principal est :
data: CGW_CONFIGURATION_JSON: '{...}'Ce JSON contient notamment :
- l’ID du Client Gateway
- l’ID du Virtual Gateway
- les IP publiques des endpoints VPN
- les IP internes des tunnels
- les paramètres IKE et IPsec :
- algorithmes de chiffrement
- authentification
- lifetimes
- DPD (Dead Peer Detection)
- Perfect Forward Secrecy
Configuration du Client Gateway (StrongSwan) sur la VM
Section intitulée « Configuration du Client Gateway (StrongSwan) sur la VM »Dans cette étape, nous allons configurer la machine virtuelle afin qu’elle établisse le tunnel VPN IPsec avec le Virtual Gateway OKS, en utilisant les informations fournies dans le ConfigMap et le Secret.
Récupérer la clé pre_shared_key (PSK)
Section intitulée « Récupérer la clé pre_shared_key (PSK) »La clé pré-partagée est stockée dans le Secret oks-vpn-secret sous forme encodée en Base64.
Récupérez la clé :
kubectl get secret oks-vpn-secret \ -o jsonpath='{.data.PRE_SHARED_KEY}' | base64 -dNotez cette valeur : elle sera utilisée dans la configuration StrongSwan.
Identifier les paramètres du tunnel VPN
Section intitulée « Identifier les paramètres du tunnel VPN »À partir du ConfigMap oks-vpn-config, identifiez les informations suivantes :
- l’IP publique du Virtual Gateway
- l’IP publique du Client Gateway
- les plages IP internes des tunnels (
169.254.x.x/30) - les paramètres cryptographiques IKE / IPsec
Ces informations sont contenues dans le champ CGW_CONFIGURATION_JSON.
Configurer StrongSwan
Section intitulée « Configurer StrongSwan »👉 Cliquez ici pour accéder au TP pour installer et configurer StrongSwan
Vérifier l’état du tunnel côté OKS
Section intitulée « Vérifier l’état du tunnel côté OKS »Retournez côté cluster OKS et vérifiez l’état du tunnel VPN :
kubectl get vpnc oks-vpn
# OutputNAME VPN CONNECTION ID VPN CONNECTION STATE VGW PUBLIC IP TUNNEL STATE TUNNEL STATE DESCRIPTIONoks-vpn vpn-2210a74d available 142.44.58.83 UP IPSEC IS UPTester la connectivité
Section intitulée « Tester la connectivité »Déployez un pod de test dans le cluster OKS :
kubectl run vpn-test-pod \ --image=alpine \ --restart=Never \ -it -- shDepuis le pod, testez la connectivité vers la VM :
ping <IP_PRIVEE_VM>Si la configuration est correcte, les paquets doivent être reçus.
If you don't see a command prompt, try pressing enter./ # ping 10.1.0.32PING 10.1.0.32 (10.1.0.32): 56 data bytes64 bytes from 10.1.0.32: seq=0 ttl=60 time=2.250 ms64 bytes from 10.1.0.32: seq=1 ttl=60 time=2.112 ms64 bytes from 10.1.0.32: seq=2 ttl=60 time=2.183 ms64 bytes from 10.1.0.32: seq=3 ttl=60 time=2.001 ms64 bytes from 10.1.0.32: seq=4 ttl=60 time=2.031 ms64 bytes from 10.1.0.32: seq=5 ttl=60 time=2.053 ms