Delen via


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

U kunt een punt-naar-site-verbinding (P2S) virtueel particulier netwerk (VPN) 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 P2S VPN-verbinding met Azure Files wilt gebruiken, moet u een P2S VPN-verbinding configureren 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 Ja Nee
Standaardbestandsshares (GPv2), GRS/GZRS Ja Nee
Premium bestandsshares (FileStorage), LRS/ZRS Ja Ja

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
  • 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
  • Het basiscertificaat dat u eerder hebt gemaakt, dat 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. Hoewel deze resource wordt geïmplementeerd, blokkeert dit bash-script dat de implementatie wordt voltooid.

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.

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