共用方式為


在 Linux 上設定點對站(P2S)VPN 以搭配 Azure 檔案服務使用

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

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

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

適用對象

管理模型 計費模型 媒體分層 冗餘性 中小企業 (SMB) NFS
Microsoft 儲存服務 已佈建的 v2 HDD (標準) 本地 (LRS) 是的 否
Microsoft 儲存服務 已佈建的 v2 HDD (標準) 區域 (ZRS) 是的 否
Microsoft 儲存服務 已佈建的 v2 HDD (標準) 異地 (GRS) 是的 否
Microsoft 儲存服務 已佈建的 v2 HDD (標準) GeoZone (GZRS) 是的 否
Microsoft 儲存服務 已佈建的 v1 SSD (進階版) 本地 (LRS) 是的 是的
Microsoft 儲存服務 已佈建的 v1 SSD (進階版) 區域 (ZRS) 是的 是的
Microsoft 儲存服務 隨用隨付 HDD (標準) 本地 (LRS) 是的 否
Microsoft 儲存服務 隨用隨付 HDD (標準) 區域 (ZRS) 是的 否
Microsoft 儲存服務 隨用隨付 HDD (標準) 異地 (GRS) 是的 否
Microsoft 儲存服務 隨用隨付 HDD (標準) GeoZone (GZRS) 是的 否

先決條件

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

  • 您要在內部部署掛接的 Azure 檔案共用。 Azure 檔案共用會部署在記憶體帳戶內,這是管理建構,代表您可以在其中部署多個檔案共用的共用記憶體集區。 您可以在建立 Azure 檔案共用中深入了解如何部署 Azure 檔案共用和儲存體帳戶。

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

安裝必要的軟體

Azure 虛擬網路閘道可以使用數種 VPN 通訊協定來提供 VPN 連線,包括 IPsec 和 OpenVPN。 本文說明如何使用 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

另請參閱