Konfigurieren eines Point-to-Site-VPN unter Linux für die Verwendung mit Azure Files

✔️ Gilt für: Klassische SMB- und NFS-Dateifreigaben, die mit dem Microsoft.Storage-Ressourcenanbieter erstellt wurden

✖️ Gilt nicht für: Dateifreigaben, die mit dem Ressourcenanbieter Microsoft.FileShares erstellt wurden

Sie können eine VPN-Verbindung (Point-to-Site Virtual Private Network) verwenden, um Ihre Azure-Dateifreigaben von außerhalb von Azure zu bereitstellen, ohne Daten über das offene Internet zu senden. Eine Point-to-Site-VPN-Verbindung ist eine VPN-Verbindung zwischen Azure und einem einzelnen Clientcomputer. Um eine Point-to-Site-VPN-Verbindung mit Azure Files zu verwenden, müssen Sie eine Point-to-Site-VPN-Verbindung für jeden Clientcomputer konfigurieren, der eine Verbindung herstellen möchte. Wenn Sie über viele Clientcomputer verfügen, die eine Verbindung mit Ihren Azure-Dateifreigaben über Ihr lokales Netzwerk herstellen müssen, können Sie eine Standort-zu-Standort-VPN-Verbindung anstelle einer Point-to-Site-Verbindung für jeden Clientcomputer verwenden. Weitere Informationen finden Sie unter Konfigurieren eines S2S-VPN (Site-to-Site) zur Verwendung mit Azure Files.

Eine vollständige Erläuterung der für Azure Files verfügbaren Netzwerkoptionen finden Sie in der Azure Files-Netzwerkübersicht.

Dieser Artikel beschreibt die Schritte zur Konfiguration eines Point-to-Site-VPN unter Linux, um Azure-Dateifreigaben direkt lokal einzubinden.

Voraussetzungen

  • Die neueste Version der Azure CLI. Um die Azure CLI zu installieren, siehe Install the Azure CLI und wähle dein Betriebssystem aus. Sie können stattdessen das Azure PowerShell-Modul unter Linux verwenden, aber die Anweisungen in diesem Artikel gelten für Azure CLI.

  • Eine Azure-Dateifreigabe, die Sie lokal einbinden möchten. Azure-Dateifreigaben werden in Speicherkonten bereitgestellt, die Verwaltungskonstrukte sind, die einen freigegebenen Speicherpool darstellen, in dem Sie mehrere Dateifreigaben bereitstellen können. Um zu erfahren, wie man Azure-Dateifreigaben und Speicherkonten bereitstellt, siehe Erstellung einer Azure-Dateifreigabe.

  • Ein privater Endpunkt für das Speicherkonto mit der Azure-Dateifreigabe, die Sie lokal bereitstellen möchten. Informationen zum Erstellen eines privaten Endpunkts finden Sie unter Konfigurieren von Azure Files-Netzwerkendpunkten.

Installieren der erforderlichen Software

Das virtuelle Netzwerk-Gateway von Azure kann VPN-Verbindungen über mehrere VPN-Protokolle bereitstellen, darunter IPsec und OpenVPN. In diesem Artikel wird gezeigt, wie Sie IPsec verwenden und das strongSwan-Paket verwenden, um die Unterstützung für Linux bereitzustellen.

Hinweis

Diese Anweisungen sollten auf Ubuntu 20.04 LTS und später sowie auf Debian 10+ funktionieren. Andere Verteilungen, die strongSwan (z. B. Fedora, CentOS oder openSUSE) unterstützen, erfordern möglicherweise unterschiedliche Paketnamen oder Installationsbefehle.

# For Ubuntu/Debian-based distributions (Ubuntu 18.04+, Debian 10+)
sudo apt update
sudo apt install strongswan strongswan-pki libstrongswan-extra-plugins curl libxml2-utils cifs-utils unzip

Wenn die Installation fehlschlägt oder Sie einen Fehler wie EAP_IDENTITY not supported, sending EAP_NAK erhalten, müssen Sie möglicherweise zusätzliche Plug-Ins installieren.

sudo apt install -y libcharon-extra-plugins

Bereitstellen eines virtuellen Netzwerks

Um über ein Point-to-Site-VPN auf Ihre Azure-Dateifreigabe und andere Azure-Ressourcen zuzugreifen, müssen Sie ein virtuelles Netzwerk erstellen. Die Point-to-Site-VPN-Verbindung stellt einen sicheren Tunnel zwischen Ihrem lokalen Linux-Clientcomputer und diesem virtuellen Azure-Netzwerk her.

Das folgende Skript erstellt ein Azure-virtuelles Netzwerk mit drei Subnetzen:

  • Einer für den Service-Endpunkt Ihres Speicherkontos
  • Einer für den privaten Endpunkt Ihres Speicherkontos (erforderlich, um das Speicherkonto vor Ort zu nutzen, ohne benutzerdefiniertes Routing für die öffentliche IP-Adresse zu erstellen, was sich ändern kann)
  • Eine für dein virtuelles Netzwerk-Gateway, das den VPN-Dienst bereitstellt.
# Variables - replace <region>, <resource-group>, and <desired-vnet-name> with your values
REGION="<region>"
RESOURCE_GROUP_NAME="<resource-group>"
VIRTUAL_NETWORK_NAME="<desired-vnet-name>"

Erstellen Sie das virtuelle Netzwerk:

# Requires: REGION, RESOURCE_GROUP_NAME, VIRTUAL_NETWORK_NAME defined above
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 '"')

Erstellen Sie die Subnetze für Dienstendpunkte, private Endpunkte und das Gateway:

# Requires: RESOURCE_GROUP_NAME, VIRTUAL_NETWORK_NAME defined above
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 '"')

Überprüfen: Führen Sie az network vnet subnet list --resource-group $RESOURCE_GROUP_NAME --vnet-name $VIRTUAL_NETWORK_NAME --output table aus und bestätigen Sie, dass drei Subnetze angezeigt werden: ServiceEndpointSubnet, PrivateEndpointSubnet und GatewaySubnet.

Erstellen von Zertifikaten für die VPN-Authentifizierung

Für VPN-Verbindungen von Ihren lokalen Linux-Clientcomputern zur Authentifizierung beim virtuellen Netzwerkgateway müssen Sie zwei Zertifikate erstellen:

  • Ein Root-Zertifikat, das Sie dem virtuellen Netzwerk-Gateway bereitstellen
  • Ein Clientzertifikat, das mit dem Stammzertifikat signiert und auf jedem Clientcomputer installiert ist

Legen Sie die Zertifikatvariablen fest, und erstellen Sie ein Arbeitsverzeichnis:

# Variables
ROOT_CERT_NAME="P2SRootCert"
USERNAME="client"              # Client certificate identity (not a machine login)
PASSWORD="1234"                # Password for the client certificate PKCS#12 file

mkdir temp
cd temp

Generieren Sie das Stammzertifikat:

# Requires: ROOT_CERT_NAME defined above; run from temp directory
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)

Generieren Sie das vom Stammzertifikat signierte Clientzertifikat:

# Requires: USERNAME, PASSWORD defined; rootCert.pem and rootKey.pem from previous step
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"

Überprüfen: Führen Sie ls -la *.pem client.p12 aus und bestätigen Sie, dass fünf Dateien vorhanden sind: rootKey.pem, rootCert.pem, clientKey.pem, clientCert.pem und client.p12.

Bereitstellen eines Gateways für virtuelle Netzwerke

Das virtuelle Azure-Netzwerkgateway ist der Dienst, mit dem Ihr lokaler Linux-Clientcomputer eine Verbindung herstellt. Für die Bereitstellung dieses Diensts sind zwei Komponenten erforderlich:

  • Eine öffentliche IP-Adresse, die das Gateway zu Ihren Clientcomputern identifiziert.
  • Das zuvor erstellte Stammzertifikat, das Ihre Clientcomputer mithilfe ihrer Clientzertifikate authentifiziert.

Hinweis

Die Bereitstellung des virtuellen Azure-Netzwerkgateways kann bis zu 45 Minuten dauern. Während diese Ressource bereitgestellt wird, blockiert dieses Skript den Abschluss der Bereitstellung.

Point-to-Site IKEv2/OpenVPN-Verbindungen werden von der Basic-Gateway-SKU nicht unterstützt. Dieses Skript verwendet die VpnGw1-SKU für das virtuelle Netzwerkgateway, bei dem es sich um die mindestens erforderliche SKU für IKEv2-Verbindungen handelt. Die öffentliche IP-Adresse kann die Einfache SKU mit dynamischer Zuordnung verwenden.

# Variables - replace <desired-vpn-name-here> with your value
VPN_NAME="<desired-vpn-name-here>"
PUBLIC_IP_ADDR_NAME="$VPN_NAME-PublicIP"

Erstellen Sie die öffentliche IP-Adresse für das Gateway:

# Requires: RESOURCE_GROUP_NAME, REGION from 'Deploy a virtual network'; VPN_NAME, PUBLIC_IP_ADDR_NAME defined above
# Note: Basic SKU with dynamic allocation is sufficient for the public IP; the gateway SKU (VpnGw1) is what matters for IKEv2 support
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 '"')

Erstellen Sie das virtuelle Netzwerkgateway:

# Requires: RESOURCE_GROUP_NAME, REGION, VIRTUAL_NETWORK_NAME from 'Deploy a virtual network'; VPN_NAME, PUBLIC_IP_ADDR defined above
# Note: VpnGw1 is the minimum SKU required for IKEv2/OpenVPN; Basic SKU doesn't support point-to-site IKEv2
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-type "Vpn" \
    --vpn-type "RouteBased" \
    --address-prefixes "172.16.201.0/24" \
    --client-protocol "IkeV2" > /dev/null

Laden Sie das Stammzertifikat auf das Gateway hoch:

# Requires: RESOURCE_GROUP_NAME from 'Deploy a virtual network'; VPN_NAME defined above; ROOT_CERT_NAME, ROOT_CERTIFICATE from 'Create certificates'
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

Überprüfen: Führen Sie az network vnet-gateway show --resource-group $RESOURCE_GROUP_NAME --name $VPN_NAME --query "provisioningState" aus und bestätigen Sie, dass die Ausgabe "Succeeded" ist.

Konfigurieren des VPN-Clients

Das virtuelle Azure-Netzwerkgateway erstellt ein herunterladbares Paket mit Konfigurationsdateien, die erforderlich sind, um die VPN-Verbindung auf Ihrem lokalen Linux-Clientcomputer zu initialisieren. Das folgende Skript kopiert das Clientzertifikat in die strongSwan-Zertifikatverzeichnisse (/etc/ipsec.d/) und konfiguriert die ipsec.conf Datei mit den Werten aus dem heruntergeladenen Konfigurationspaket.

# Requires: RESOURCE_GROUP_NAME from 'Deploy a virtual network'; VPN_NAME from 'Deploy virtual network gateway'
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

Extrahieren Sie die VPN-Konfigurationswerte:

# Requires: vpnClient.zip extracted in current directory
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)

Kopieren Sie Zertifikate in die strongSwan-Verzeichnisse:

# Requires: USERNAME from 'Create certificates'; client.p12 (client certificate) from temp directory
INSTALL_DIR="/etc/"

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"

Konfigurieren der IPsec-Verbindung:

# Requires: VIRTUAL_NETWORK_NAME from 'Deploy a virtual network'; VPN_SERVER, VPN_TYPE, ROUTES extracted above; INSTALL_DIR defined above
sudo tee -a "${INSTALL_DIR}ipsec.conf" <<EOF
conn $VIRTUAL_NETWORK_NAME
    keyexchange=$VPN_TYPE
    type=tunnel
    leftfirewall=yes
    left=%any
    leftauth=eap-tls
    leftid=%client
    right=$VPN_SERVER
    rightid=%$VPN_SERVER
    rightsubnet=$ROUTES
    leftsourceip=%config
    auto=add
EOF

Konfigurieren Sie die geheimen IPsec-Schlüssel, und starten Sie die VPN-Verbindung:

# Requires: PASSWORD from 'Create certificates'; INSTALL_DIR, VIRTUAL_NETWORK_NAME defined above
echo ": P12 client.p12 '$PASSWORD'" | sudo tee -a "${INSTALL_DIR}ipsec.secrets" > /dev/null

sudo ipsec restart
sudo ipsec up $VIRTUAL_NETWORK_NAME

Überprüfen: Führen Sie sudo ipsec status aus und bestätigen Sie, dass die Ausgabe ESTABLISHED für die Verbindung enthält, die nach Ihrem virtuellen Netzwerk benannt ist.

Einbinden einer Azure-Dateifreigabe

Nachdem Sie Ihr Point-to-Site-VPN eingerichtet haben, können Sie Ihre Azure-Dateifreigabe einbinden. Siehe SMB-Dateifreigaben unter Linux einbinden oder NFS-Dateifreigaben unter Linux einbinden.

Überprüfen: Führen Sie den folgenden Befehl aus: df -h | grep <mount-point> (ersetzen Sie <mount-point> durch Ihren Bereitstellungspfad), und bestätigen Sie, dass die Azure-Dateifreigabe mit der erwarteten Größe angezeigt wird.

Siehe auch