Een punt-naar-site-VPN (P2S) configureren in Linux voor gebruik met Azure Files

U kunt een punt-naar-site-VPN-verbinding (P2S) gebruiken om uw Azure-bestandsshares van buiten Azure te koppelen zonder gegevens via het open internet te verzenden. Een punt-naar-site-VPN-verbinding is een VPN-verbinding tussen Azure en een afzonderlijke client. Als u een punt-naar-site-VPN-verbinding met Azure Files wilt gebruiken, moet er een punt-naar-site-VPN-verbinding worden geconfigureerd voor elke client die verbinding wil maken. Als u veel clients hebt die verbinding moeten maken met uw Azure-bestandsshares vanuit uw on-premises netwerk, kunt u een site-naar-site-VPN-verbinding (S2S) gebruiken in plaats van een punt-naar-site-verbinding voor elke client. Zie Een site-naar-site-VPN configureren voor gebruik met Azure Files voor meer informatie.

We raden u ten zeerste aan azure Files-netwerkoverzicht te lezen voordat u verdergaat met dit artikel voor een volledige bespreking van de beschikbare netwerkopties voor Azure Files.

In het artikel worden de stappen beschreven voor het configureren van een punt-naar-site-VPN op Linux om Azure-bestandsshares rechtstreeks on-premises te koppelen.

Van toepassing op

Bestands sharetype SMB NFS
Standaardbestandsshares (GPv2), LRS/ZRS Yes No
Standaardbestandsshares (GPv2), GRS/GZRS Yes No
Premium bestandsshares (FileStorage), LRS/ZRS Yes Yes

Vereisten

  • De meest recente versie van de Azure CLI. Zie De Azure PowerShell CLI installeren en uw besturingssysteem selecteren voor meer informatie over het installeren van de Azure CLI. Als u liever de Azure PowerShell-module op Linux gebruikt, kunt u dat doen. De onderstaande instructies zijn echter voor Azure CLI.

  • Een Azure-bestandsshare die u on-premises wilt koppelen. Azure-bestandsshares worden geïmplementeerd binnen opslagaccounts. Dit zijn beheerconstructies die een gedeelde opslaggroep vertegenwoordigen waarin u meerdere bestandsshares kunt implementeren, evenals andere opslagbronnen, zoals blobcontainers of wachtrijen. Meer informatie over het implementeren van Azure-bestandsshares en opslagaccounts vindt u in Een Azure-bestandsshare maken.

  • Een privé-eindpunt voor het opslagaccount met de Azure-bestandsshare die u on-premises wilt koppelen. Zie Azure Files-netwerkeindpunten configureren voor meer informatie over het maken van een privé-eindpunt.

Vereiste software installeren

De gateway van het virtuele Azure-netwerk kan VPN-verbindingen bieden met behulp van verschillende VPN-protocollen, waaronder IPsec en OpenVPN. In dit artikel wordt beschreven hoe u IPsec gebruikt en het strongSwan-pakket gebruikt om de ondersteuning op Linux te bieden.

Geverifieerd met Ubuntu 18.10.

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

INSTALL_DIR="/etc/"

Als de installatie mislukt of er een fout optreedt, zoals EAP_IDENTITY niet wordt ondersteund, EAP_NAK moet u mogelijk extra invoegtoepassingen installeren:

sudo apt install -y libcharon-extra-plugins

Een virtueel netwerk implementeren

Als u toegang wilt krijgen tot uw Azure-bestandsshare en andere Azure-resources van on-premises via een punt-naar-site-VPN, moet u een virtueel netwerk of VNet maken. De P2S VPN-verbinding die u automatisch maakt, is een brug tussen uw on-premises Linux-machine en dit virtuele Azure-netwerk.

Met het volgende script maakt u een virtueel Azure-netwerk met drie subnetten: één voor het service-eindpunt van uw opslagaccount, één voor het privé-eindpunt van uw opslagaccount. Dit is vereist voor toegang tot het opslagaccount on-premises zonder aangepaste routering te maken voor het openbare IP-adres van het opslagaccount dat kan worden gewijzigd en één voor uw virtuele netwerkgateway die de VPN-service biedt.

Vergeet niet om te vervangen <region>, <resource-group>en <desired-vnet-name> door de juiste waarden voor uw omgeving.

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 '"')

Certificaten maken voor VPN-verificatie

Als u wilt dat VPN-verbindingen van uw on-premises Linux-machines worden geverifieerd voor toegang tot uw virtuele netwerk, moet u twee certificaten maken: een basiscertificaat dat wordt verstrekt aan de gateway van de virtuele machine en een clientcertificaat, dat wordt ondertekend met het basiscertificaat. Met het volgende script worden de vereiste certificaten gemaakt.

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"

Virtuele netwerkgateway implementeren

De gateway van het virtuele Azure-netwerk is de service waarmee uw on-premises Linux-machines verbinding maken. Voor het implementeren van deze service zijn twee basisonderdelen vereist: een openbaar IP-adres waarmee de gateway naar uw clients wordt geïdentificeerd waar ze zich ook ter wereld bevinden en een basiscertificaat dat u eerder hebt gemaakt, die wordt gebruikt om uw clients te verifiëren.

Vergeet niet om deze resources te vervangen door <desired-vpn-name-here> de naam die u voor deze resources wilt gebruiken.

Notitie

Het implementeren van de gateway van het virtuele Azure-netwerk kan tot 45 minuten duren. Terwijl deze resource wordt geïmplementeerd, wordt dit bash-script geblokkeerd om de implementatie te voltooien.

P2S IKEv2/OpenVPN-verbindingen worden niet ondersteund met de Basic-SKU . Dit script maakt gebruik van de VpnGw1-SKU voor de gateway van het virtuele netwerk, dienovereenkomstig.

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

De VPN-client configureren

De gateway van het virtuele Azure-netwerk maakt een downloadbaar pakket met configuratiebestanden die nodig zijn om de VPN-verbinding op uw on-premises Linux-machine te initialiseren. Met het volgende script worden de certificaten die u op de juiste plek hebt gemaakt, op de juiste plek opgeslagen en het bestand geconfigureerd ipsec.conf met de juiste waarden uit het configuratiebestand in het downloadbare pakket.

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 

Azure-bestandsshare koppelen

Nu u uw punt-naar-site-VPN hebt ingesteld, kunt u uw Azure-bestandsshare koppelen. Zie SMB-bestandsshares koppelen aan Linux of NFS-bestandsshare koppelen aan Linux.

Zie ook