共用方式為


在 Linux 上設定點對站 (P2S) VPN 以用於 Azure 檔案儲存體

您可以使用點對站 (P2S) 虛擬專用網 (VPN) 連線,從 Azure 外部掛接 Azure 檔案共用,而不需透過開放式因特網傳送數據。 點對站 VPN 連線是 Azure 與個別用戶端之間的 VPN 連線。 若要將 P2S VPN 連線用於 Azure 檔案儲存體,您必須針對各個要連接的用戶端設定 P2S VPN 連線。 如果您有許多用戶端需要從內部部署網路連線至 Azure 檔案共用,您可以對每個用戶端使用站對站 (S2S) VPN 連線,而不使用點對站連線。 若要深入了解,請參閱設定站對站 VPN 以用於 Azure 檔案儲存體

強烈建議您先閱讀 Azure 檔案儲存體網路概觀,再繼續閱讀此文章,以充分了解適用於 Azure 檔案儲存體的網路選項。

本文詳述在Linux上設定點對站 VPN 的步驟,以直接在內部部署掛接 Azure 檔案共用。

適用於

檔案共用類型 SMB NFS
標準檔案共用 (GPv2)、LRS/ZRS 是 否
標準檔案共用 (GPv2)、GRS/GZRS 是 否
進階檔案共用 (FileStorage)、LRS/ZRS Yes Yes

必要條件

  • 最新版本的 Azure CLI。 如需如何安裝 Azure CLI 的相關資訊,請參閱安裝 Azure PowerShell CLI,並選取您的作業系統。 如果您想要的話,可以在 Linux 上使用 Azure PowerShell 模組。 不過,下列指示適用於 Azure CLI。

  • 您要在內部部署掛接的 Azure 檔案共用。 Azure 檔案共用會部署在儲存體帳戶中,也就是代表儲存體共用集區的管理結構,您可以在此集區中部署多個檔案共用,以及其他儲存體資源 (例如,Blob 容器或佇列)。 您可以在建立 Azure 檔案共用中深入了解如何部署 Azure 檔案共用和儲存體帳戶。

  • 要在內部部署掛接的 Azure 檔案共用所屬的儲存體帳戶私人端點。 若要了解如何建立私人端點,請參閱設定 Azure 檔案儲存體網路端點

安裝必要軟體

Azure 虛擬網路閘道可使用數個 VPN 通訊協定 (包括 IPsec 和 OpenVPN) 來提供 VPN 連線。 本文說明如何使用 IPsec 和 strongSwan 套件來提供 Linux 上的支援。

已使用 Ubuntu 18.10 進行驗證。

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

INSTALL_DIR="/etc/"

如果安裝失敗,或您收到錯誤,例如不支援 EAP_IDENTITY,傳送 EAP_NAK,您可能需要安裝額外的外掛程式:

sudo apt install -y libcharon-extra-plugins

部署虛擬網路

若要透過點對站 VPN 從內部部署存取您的 Azure 檔案共用和其他 Azure 資源,您必須建立虛擬網路或 VNet。 您會自動建立的 P2S VPN 連線是內部部署 Linux 機器與此 Azure 虛擬網路之間的網橋。

下列指令碼會建立具有三個子網路的 Azure 虛擬網路:一個用於儲存體帳戶的服務端點,一個用於儲存體帳戶的私人端點 (必須要有此端點,才能存取內部部署儲存體帳戶,而無須針對可能會變更的儲存體帳戶公用 IP 建立自訂路由),另一個則用於提供 VPN 服務的虛擬網路閘道。

請記得將 <region><resource-group><desired-vnet-name> 取代為您的環境適用的值。

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

建立 VPN 驗證的憑證

若要讓來自內部部署 Linux 電腦的 VPN 連線經過驗證才能存取您的虛擬網路,您必須建立兩個憑證:

  • 根憑證,將提供給虛擬機器閘道
  • 用戶端憑證,將會使用根憑證簽署

下列指令碼會建立必要的憑證。

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"

部署虛擬網路閘道

Azure 虛擬網路閘道是您的內部部署 Linux 機器所將連線到的服務。 部署此服務需要兩個基本元件:

  • 一個公用 IP 位址,用於識別用戶端在世界各地的閘道
  • 您稍早建立的跟證書,將用來驗證用戶端

請記得將 <desired-vpn-name-here> 取代為您要用於這些資源的名稱。

注意

部署 Azure 虛擬網路閘道最多可能需要 45 分鐘的時間。 部署此資源時,此Bash腳本將會封鎖部署完成。

基本 SKU 不支援 P2S IKEv2/OpenVPN 連線。 此腳本會 針對虛擬網路閘道使用 VpnGw1 SKU。

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

設定 VPN 用戶端

Azure 虛擬網路閘道會建立可供下載的套件,其中包含在您的內部部署 Linux 機器上初始化 VPN 連線所需的組態檔。 下列指令碼會將您建立的憑證放在正確的位置中,並使用可下載套件中的組態檔所含的正確值來設定 ipsec.conf 檔案。

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 檔案共用

在您已設定點對站 VPN 後,即可掛接 Azure 檔案共用。 請參閱將 SMB 檔案共用掛接至 Linux將 NFS 檔案共用掛接至 Linux

另請參閱