Configurer un VPN point à site (P2S) sous Linux pour une utilisation avec Azure Files

Vous pouvez utiliser une connexion de réseau privé virtuel (VPN) point à site (P2S) pour monter vos partages de fichiers Azure en dehors d’Azure, sans envoyer de données sur l’Internet ouvert. Une connexion VPN point à site est une connexion VPN entre Azure et un client individuel. Pour utiliser une connexion VPN P2S avec Azure Files, vous devez configurer une connexion VPN P2S pour chaque client qui souhaite se connecter. Si de nombreux clients doivent se connecter à vos partages de fichiers Azure depuis votre réseau local, vous pouvez utiliser une connexion VPN site à site (S2S) au lieu d’une connexion point à site pour chaque client. Pour plus d’informations, consultez Configurer un VPN site à site pour une utilisation avec Azure Files.

Avant de poursuivre cet article, nous vous recommandons vivement de lire Vue d’ensemble de la mise en réseau Azure Files qui fournit une description complète des options de mise en réseau disponibles pour Azure Files.

L'article décrit en détail la procédure à suivre pour configurer un VPN point à site sur Linux afin de monter des partages de fichiers Azure directement en local.

S’applique à

Type de partage de fichiers SMB NFS
Partages de fichiers Standard (GPv2), LRS/ZRS Oui Non
Partages de fichiers Standard (GPv2), GRS/GZRS Oui Non
Partages de fichiers Premium (FileStorage), LRS/ZRS Oui Oui

Prérequis

  • Version la plus récente de l'interface Azure CLI. Pour plus d’informations sur l’installation d’Azure CLI, consultez Installer l’interface CLI Azure PowerShell et sélectionnez votre système d’exploitation. Si vous préférez utiliser le module Azure PowerShell sur Linux, vous pouvez le faire. Toutefois, les instructions ci-dessous concernent Azure CLI.

  • Un partage de fichiers Azure que vous voulez monter localement. Les partages de fichiers Azure sont déployés sur des comptes de stockage. Ces comptes sont des constructions de gestion représentant un pool de stockage partagé dans lequel vous pouvez déployer plusieurs partages de fichiers, ainsi que d’autres ressources de stockage, telles que des conteneurs d’objets blob ou des files d’attente. Pour plus d’informations sur le déploiement des partages de fichiers et des comptes de stockage Azure, consultez Créer un partage de fichiers Azure.

  • Un point de terminaison privé pour le compte de stockage sur lequel se trouve le partage de fichiers Azure que vous souhaitez monter localement. Pour plus d’informations sur la création d’un point de terminaison privé, consultez Configuration des points de terminaison réseau Azure Files.

Installer les logiciels nécessaires

La passerelle de réseau virtuel Azure peut fournir des connexions VPN par le biais de plusieurs protocoles VPN, dont IPsec et OpenVPN. Cet article explique comment utiliser IPsec et utilise le package strongSwan pour assurer la prise en charge sous Linux.

Vérifié avec Ubuntu 18.10.

sudo apt update
sudo apt install strongswan strongswan-pki libstrongswan-extra-plugins curl libxml2-utils cifs-utils unzip

INSTALL_DIR="/etc/"

Si l’installation échoue ou si vous obtenez une erreur telle que EAP_IDENTITY non pris en charge, l’envoi de EAP_NAK, vous devrez peut-être installer des plug-ins supplémentaires :

sudo apt install -y libcharon-extra-plugins

Déployer un réseau virtuel

Pour accéder à votre partage de fichiers Azure et à d’autres ressources Azure depuis un environnement local via un VPN point à site, vous devez créer un réseau virtuel. La connexion VPN point à site que vous allez créer automatiquement constitue un pont entre votre ordinateur Linux local et ce réseau virtuel Azure.

Le script suivant crée un réseau virtuel Azure doté de trois sous-réseaux : un pour le point de terminaison de service de votre compte de stockage, un pour le point de terminaison privé de votre compte de stockage (celui-ci est nécessaire pour accéder localement au compte de stockage sans créer de routage personnalisé pour l'adresse IP publique du compte de stockage, qui peut changer), et un pour votre passerelle de réseau virtuel qui fournit le service VPN.

N’oubliez pas de remplacer <region>, <resource-group> et <desired-vnet-name> par les valeurs correspondant à votre environnement.

REGION="<region>"
RESOURCE_GROUP_NAME="<resource-group>"
VIRTUAL_NETWORK_NAME="<desired-vnet-name>"

VIRTUAL_NETWORK=$(az network vnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $VIRTUAL_NETWORK_NAME \
    --location $REGION \
    --address-prefixes "192.168.0.0/16" \
    --query "newVNet.id" | tr -d '"')

SERVICE_ENDPOINT_SUBNET=$(az network vnet subnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --name "ServiceEndpointSubnet" \
    --address-prefixes "192.168.0.0/24" \
    --service-endpoints "Microsoft.Storage" \
    --query "id" | tr -d '"')

PRIVATE_ENDPOINT_SUBNET=$(az network vnet subnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --name "PrivateEndpointSubnet" \
    --address-prefixes "192.168.1.0/24" \
    --query "id" | tr -d '"')

GATEWAY_SUBNET=$(az network vnet subnet create \
    --resource-group $RESOURCE_GROUP_NAME \
    --vnet-name $VIRTUAL_NETWORK_NAME \
    --name "GatewaySubnet" \
    --address-prefixes "192.168.2.0/24" \
    --query "id" | tr -d '"')

Créer des certificats pour l'authentification VPN

Pour que les connexions VPN à partir de vos machines Linux locales soient authentifiées pour accéder à votre réseau virtuel, vous devez créer deux certificats :

  • Un certificat racine, qui sera fourni à la passerelle de machine virtuelle
  • Un certificat client, qui sera signé avec le certificat racine

Le script suivant crée les certificats requis.

ROOT_CERT_NAME="P2SRootCert"
USERNAME="client"
PASSWORD="1234"

mkdir temp
cd temp

sudo ipsec pki --gen --outform pem > rootKey.pem
sudo ipsec pki --self --in rootKey.pem --dn "CN=$ROOT_CERT_NAME" --ca --outform pem > rootCert.pem

ROOT_CERTIFICATE=$(openssl x509 -in rootCert.pem -outform der | base64 -w0 ; echo)

sudo ipsec pki --gen --size 4096 --outform pem > "clientKey.pem"
sudo ipsec pki --pub --in "clientKey.pem" | \
    sudo ipsec pki \
        --issue \
        --cacert rootCert.pem \
        --cakey rootKey.pem \
        --dn "CN=$USERNAME" \
        --san $USERNAME \
        --flag clientAuth \
        --outform pem > "clientCert.pem"

openssl pkcs12 -in "clientCert.pem" -inkey "clientKey.pem" -certfile rootCert.pem -export -out "client.p12" -password "pass:$PASSWORD"

Déployer une passerelle de réseau virtuel

La passerelle de réseau virtuel Azure correspond au service auquel vos ordinateurs Linux locaux se connecteront. Le déploiement de ce service nécessite deux composants de base :

  • Adresse IP publique qui identifie la passerelle pour vos clients où qu’ils se trouvent dans le monde
  • Le certificat racine que vous avez créé précédemment, qui sera utilisé pour authentifier vos clients

N’oubliez pas de remplacer <desired-vpn-name-here> par le nom que vous souhaitez donner à ces ressources.

Notes

Le déploiement de la passerelle de réseau virtuel Azure peut prendre jusqu’à 45 minutes. Pendant le déploiement de cette ressource, ce script bash bloquera l’exécution du déploiement.

Les connexions P2S IKEv2/OpenVPN ne sont pas prises en charge avec la référence SKU Essentiel. Ce script utilise la référence SKU VpnGw1 pour la passerelle de réseau virtuel.

VPN_NAME="<desired-vpn-name-here>"
PUBLIC_IP_ADDR_NAME="$VPN_NAME-PublicIP"

PUBLIC_IP_ADDR=$(az network public-ip create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $PUBLIC_IP_ADDR_NAME \
    --location $REGION \
    --sku "Basic" \
    --allocation-method "Dynamic" \
    --query "publicIp.id" | tr -d '"')

az network vnet-gateway create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $VPN_NAME \
    --vnet $VIRTUAL_NETWORK_NAME \
    --public-ip-addresses $PUBLIC_IP_ADDR \
    --location $REGION \
    --sku "VpnGw1" \
    --gateway-typ "Vpn" \
    --vpn-type "RouteBased" \
    --address-prefixes "172.16.201.0/24" \
    --client-protocol "IkeV2" > /dev/null

az network vnet-gateway root-cert create \
    --resource-group $RESOURCE_GROUP_NAME \
    --gateway-name $VPN_NAME \
    --name $ROOT_CERT_NAME \
    --public-cert-data $ROOT_CERTIFICATE \
    --output none

Configurer le client VPN

La passerelle de réseau virtuel Azure crée un package téléchargeable avec les fichiers de configuration nécessaires à l'initialisation de la connexion VPN sur votre ordinateur Linux local. Le script suivant place les certificats que vous avez créés à l'emplacement approprié et configure le fichier ipsec.conf avec les valeurs qui conviennent à partir du fichier de configuration contenu dans le package téléchargeable.

VPN_CLIENT=$(az network vnet-gateway vpn-client generate \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $VPN_NAME \
    --authentication-method EAPTLS | tr -d '"')

curl $VPN_CLIENT --output vpnClient.zip
unzip vpnClient.zip

VPN_SERVER=$(xmllint --xpath "string(/VpnProfile/VpnServer)" Generic/VpnSettings.xml)
VPN_TYPE=$(xmllint --xpath "string(/VpnProfile/VpnType)" Generic/VpnSettings.xml | tr '[:upper:]' '[:lower:]')
ROUTES=$(xmllint --xpath "string(/VpnProfile/Routes)" Generic/VpnSettings.xml)

sudo cp "${INSTALL_DIR}ipsec.conf" "${INSTALL_DIR}ipsec.conf.backup"
sudo cp "Generic/VpnServerRoot.cer_0" "${INSTALL_DIR}ipsec.d/cacerts"
sudo cp "${USERNAME}.p12" "${INSTALL_DIR}ipsec.d/private" 

sudo tee -a "${installDir}ipsec.conf" <<EOF
conn $VIRTUAL_NETWORK_NAME
    keyexchange=$VPN_TYPE
    type=tunnel
    leftfirewall=yes
    left=%any
    leftauth=eap-tls
    leftid=%client
    right=$vpnServer
    rightid=%$vpnServer
    rightsubnet=$routes
    leftsourceip=%config
    auto=add
EOF

echo ": P12 client.p12 '$PASSWORD'" | sudo tee -a "${INSTALL_DIR}ipsec.secrets" > /dev/null

sudo ipsec restart
sudo ipsec up $VIRTUAL_NETWORK_NAME 

Monter le partage de fichiers Azure

Maintenant que vous avez configuré votre VPN point à site, vous pouvez monter votre partage de fichiers Azure. Consultez Monter des partages de fichiers SMB sur Linux ou Monter un partage de fichiers NFS sur Linux.

Voir aussi