建立 VPN 伺服器

建立 VPN 伺服器,以容許來自網際網路的用戶端連接至 VPC 網路,同時維護安全連線功能。

您可以使用主控台、CLI、API 或 Terraform 建立 VPN 伺服器。

開始之前

在佈建 VPN 伺服器之前,請依下列順序完成下列必要條件:

  1. 檢閱 VPN 伺服器的規劃考量

  2. 決定要使用哪種 VPN 客戶端驗證模式:基於憑證、使用者 ID 與密碼,或是兩者皆用。 如需相關資訊,請參閱 設定用戶端至網站鑑別

  3. 建立 Secrets Manager 服務實例管理憑證

    建議您在 這些考量 的情況下 建立專用憑證

  4. 為您的 VPN 伺服器和IBM Cloud Secrets Manager建立 IAM 服務到服務授權

  5. 在您選取的 VPC 中 建立 VPC 及至少一個子網路

    若要取得高可用性,請在兩個不同區域中建立一個 VPC 及兩個子網路。 VPN 伺服器位於兩個子網路中。

在主控台中建立 VPN 伺服器

若要在主控台中建立 VPN 伺服器,請遵循下列步驟:

  1. 完成「開始之前」一節中的所有必要條件。

  2. 請在瀏覽器中開啟 IBM Cloud 控制台,並登入您的帳戶。

  3. 選取導覽功能表 導覽功能表圖示,然後按一下基礎結構 VPC 圖示 > 網路 > VPN

  4. 按一下頁面右上方的 建立

  5. 在 VPN 類型區段中,按一下 用戶端至網站伺服器

    VPN 類型區段
    VPN 類型區段

    「位置」區段會顯示 VPC 所在的地區,以及將佈建 VPN 伺服器的位置。

  6. 在「詳細資訊」區段中,請填寫以下資訊:

    • VPN 伺服器名稱-輸入 VPN 伺服器的名稱,例如 my-vpn-server

    • 資源群組 — 為 VPN 伺服器選取一個資源群組。

    • 標籤-選擇性地新增標籤,以組織、追蹤使用成本或管理對資源的存取權。

    • 存取管理標籤-選擇性地將存取管理標籤新增至資源,以協助組織存取控制關係。 存取權管理標籤唯一支援的格式是 key:value。 如需相關資訊,請參閱 使用標籤控制對資源的存取權

    • 虛擬專用雲端-選取 VPN 伺服器的 VPC。

    • 用戶端 IPv4 位址儲存區-輸入 CIDR 範圍。 用戶端會從這個位址儲存區為其階段作業指派一個 IP 位址。

      VPN 詳細資料區段
      VPN 詳細資料區段

  7. 在「子網」區段中,請指定以下資訊:

    • 選擇 VPN 伺服器模式:

      • 高可用性模式 — 將 VPN 伺服器部署於不同區域內的兩個子網中。 最適合於用戶端 VPN 存取非常重要的多區域部署及解決方案。
      • 獨立模式 — 將 VPN 伺服器部署於單一子網和區域中。 最適合於不需要多區域備援的單一區域部署。
    • 指定 VPC 的子網路 (獨立式模式) 或子網路 (HA 模式)。

      VPN 子網路區段
      VPN 子網路區段

  8. 在「驗證」區段中,請指定以下資訊:

    • VPN 伺服器驗證- 從 Secrets Manager 中選擇伺服器 SSL 憑證。 完成所有必要欄位。

      VPN 伺服器鑑別區段
      VPN 伺服器鑑別區段

    • 用戶端鑑別模式-選取此選項可透過使用用戶端憑證、使用者 ID 及/或通行碼來配置使用者鑑別。

      • 客戶端憑證 — 您可以選取一個客戶端憑證,並設定使用者 ID 和密碼,以確保最佳安全性。 使用者 ID 和密碼提供了一層額外的安全防護,需提供額外的登入憑證才能存取帳戶。

        您可以選擇上傳 PEM 格式的憑證撤銷清單 (CRL)。 上傳 CRL 後,PEM 檔案會顯示為 VPN 伺服器的名稱。

      • 使用者 ID 及通行碼-配置 VPN 用戶端使用者的已新增鑑別。 此鑑別方法提供與 IBM Cloud IAM 整合的新增安全層,以完成用戶端鑑別。 當驗證完成後,系統會將該代碼傳遞給 openVPN 客戶端進行驗證。

      VPN 用戶端鑑別區段
      VPN 用戶端鑑別區段

  9. 在「安全群組」區段中,至少選取一個安全群組。

    若要在計劃部署 VPN 伺服器的子網路和其他透過 VPN 通道通訊的 VPC 子網路上設定一個或多個安全群組及其規則,或選擇性地設定存取控制清單 (ACL),請參閱 設定與 VPN 伺服器搭配使用的 ACL

    VPN 安全群組區段
    VPN 安全群組區段

    您可以在從 VPN 伺服器的詳細資料頁面 (「安全群組」標籤) 佈建之後連接安全群組。

  10. 其他配置 區段中,指定下列資訊:

    • DNS 伺服器 IP 位址-選擇性地指定一或兩個 DNS 伺服器 IP 位址,以進行網域名稱解析。

    • 閒置超時時長(秒) ——若在此時間間隔結束前,VPN 伺服器未偵測到任何流量,系統將自動斷開連線。 此數值的範圍為 028800 秒。 預設值為 600 秒。

    • 傳輸通訊協定-選取下列其中一個通訊協定,並輸入有效的 VPN 埠 (1 - 65535)。

      • UDP 是執行錯誤檢查但會捨棄錯誤封包的無連線通訊協定。 快於 TCP。
      • TCP 是一種連線導向的通訊協定,含有錯誤檢查和錯誤回復。 比 UDP 更可靠。
    • 通道模式-指定下列其中一項:

      • 全隧道模式 — 所有流量皆透過 VPN 介面傳輸至 VPN 隧道。

      • 分割隧道 — 私人流量透過 VPN 介面流向 VPN 隧道,而公共流量則透過現有的 LAN 介面傳輸。

        VPN 其他配置區段
        VPN 其他配置區段

從 CLI 建立 VPN 伺服器

開始之前,請 設定 CLI 環境

若要從 CLI 建立 VPN 伺服器,請輸入下列指令:

ibmcloud is vpn-server-create --subnets SUBNETS --client-ip-pool CLIENT_IP_POOL --cert CERT (--client-auth-methods certificate | username | certificate,username | username,certificate) [--client-ca CLIENT_CA] [--client-crl CLIENT_CRL] [--client-dns CLIENT_DNS] [--client-idle-timeout CLIENT_IDLE_TIMEOUT] [--enable-split-tunnel false | true] [--port PORT] [--protocol udp | tcp] [--sg SECURITY_GROUP1 --sg SECURITY_GROUP2 ...] [--name NAME] [--resource-group-id RESOURCE_GROUP_ID | --resource-group-name RESOURCE_GROUP_NAME] [--output JSON] [-q, --quiet]

指令選項

  • --subnets:要為此 VPN 伺服器進行配置的子網,其 ID 需以逗號分隔。 為確保高可用性,請在不同區域中使用子網,最多可設定兩個子網。
  • --client-ip-pool:VPN 客戶端 IPv4 的位址池,以 CIDR 格式表示。 要求不得與 VPC 中的任何現有位址字首或者下列任何保留位址重疊:127.0.0.0/8(IPv4 迴圈位址)、161.26.0.0/16(IBM 服務)、166.8.0.0/14(雲端服務端點)、169.254.0.0/16(IPv4 鏈結-本端位址)、224.0.0.0/4(IPv4 多重播送位址)。 用戶端 IP 位址儲存區 CIDR 的字首長度必須介於 /9(8,388,608 個位址)和 /22(1024 個位址)之間。 建議使用包含兩倍於啟用並行連線數上限所需的 IP 位址數的 CIDR 區塊。
  • --cert:此 VPN 伺服器的憑證實例 CRN。
  • --client-auth-methods: 以逗點區隔的用戶端鑑別方法清單。 下列其中一項: certificateusernamecertificate、usernameusername、certificate
  • --client-ca:用於 VPN 客戶端憑證授權機構 (CA) 的憑證實例之 CRN。
  • -- client-crl:CRL | @CRL-file。 以 PEM 格式編碼的憑證撤銷清單內容。
  • --client-dns:以逗號分隔的 DNS 伺服器位址清單,這些位址將提供給連線至此 VPN 伺服器的 VPN 客戶端。 最多可設定兩台 DNS 伺服器。
  • --client-idle-timeout:VPN 客戶端處於閒置狀態的秒數,超過此時間後,此 VPN 伺服器將斷開其連線。 設定為 0 可防止伺服器斷開閒置客戶端的連線(預設值:600 )。
  • --enable-split-tunnel:指示此 VPN 伺服器是否已啟用分割隧道功能。 下列其中一項: falsetrue (預設值: false)。
  • --port:此 VPN 伺服器要使用的埠號(預設:443 )。
  • --protocol:此 VPN 伺服器應使用的傳輸協定。 下列其中一項: udptcp (預設值: udp)。
  • --sg:VPN 伺服器的安全群組 ID 或名稱(以逗號分隔)。
  • --name:VPN 伺服器的新名稱。
  • --resource-group-id:資源群組的 ID。 此選項與 --resource-group-name 互斥。
  • --resource-group-name:資源群組的名稱。 此選項與 --resource-group-id 互斥。
  • --output:指定輸出格式,僅支援 JSON。 下列其中一項: JSON
  • -q, --quiet:抑制詳細輸出。

指令範例

ibmcloud is vpn-server-create --subnets 0717-a7191f77-7c87-4ad4-bb11-a37f9e9fc0f0,0736-4b871e22-e819-4f87-bb17-e457a88246a2 --cert crn:v1:bluemix:public:cloudcerts:us-south:a/aa5a471f75bc456fac416bf02c4ba6de:1862b0b4-c1f8-4eef-a6b5-e9c00c9f593d:certificate:6c801ef768c139d986b4c6f91175e8cc --client-ip-pool 190.165.7.0/20 --client-auth-methods certificate --client-ca crn:v1:bluemix:public:cloudcerts:us-south:a/aa5a471f75bc456fac416bf02c4ba6de:1862b0b4-c1f8-4eef-a6b5-e9c00c9f593d:certificate:6c801ef768c139d986b4c6f91175e8cc
ibmcloud is vpn-server-create --name myvpnserver --subnets 0717-a7191f77-7c87-4ad4-bb11-a37f9e9fc0f0,0736-4b871e22-e819-4f87-bb17-e457a88246a2 --cert crn:v1:bluemix:public:cloudcerts:us-south:a/aa5a471f75bc456fac416bf02c4ba6de:1862b0b4-c1f8-4eef-a6b5-e9c00c9f593d:certificate:6c801ef768c139d986b4c6f91175e8cc --client-ip-pool 190.166.7.0/20 --client-auth-methods username
ibmcloud is vpn-server-create --name myvpnserver2 --subnets 0717-a7191f77-7c87-4ad4-bb11-a37f9e9fc0f0 --cert crn:v1:bluemix:public:cloudcerts:us-south:a/aa5a471f75bc456fac416bf02c4ba6de:1862b0b4-c1f8-4eef-a6b5-e9c00c9f593d:certificate:6c801ef768c139d986b4c6f91175e8cc --client-ip-pool 190.167.7.0/20 --client-auth-methods username --client-dns 9.9.9.9,8.8.8.8 --protocol tcp --port 8888 --enable-split-tunnel true --client-idle-timeout 1200
ibmcloud is vpn-server-create --name myvpnserver3 --subnets 0717-a7191f77-7c87-4ad4-bb11-a37f9e9fc0f0 --cert crn:v1:bluemix:public:cloudcerts:us-south:a/aa5a471f75bc456fac416bf02c4ba6de:1862b0b4-c1f8-4eef-a6b5-e9c00c9f593d:certificate:6c801ef768c139d986b4c6f91175e8cc --client-ip-pool 190.168.7.0/20 --client-auth-methods username --sg r006-e32f671c-463d-4f93-88e3-2dd0413476b4 --sg r006-3af7a9db-d9bc-43d4-bced-93e0a33fee25
ibmcloud is vpn-server-create  --subnets 0736-4b871e22-e819-4f87-bb17-e457a88246a2 --client-ip-pool 192.170.0.0/22 --client-dns 172.34.1.100 --cert crn:v1:bluemix:public:cloudcerts:us-south:a/0046b57b897f419080c4ed3e011b86d4:5f1a72bc-b4c2-413f-bd22-011cfa4be5db:certificate:c81627a1bf6f766379cc4b98fd21ccd6 --client-auth-methods certificate,username --client-ca crn:v1:bluemix:public:cloudcerts:us-south:a/0046b57b897f419080c4ed3e011b86d4:5f1a72bc-b4c2-413f-bd22-011cfa4be5db:certificate:c81627a1bf6f766379cc4b98fd21ccd6 --client-crl @./openvpn/crl.pem --name vpnswithcrl --sg r006-5744b689-e5c4-461d-9f9b-ce5e7e8dbed6

使用 API 建立 VPN 伺服器

若要使用 API 建立用戶端至網站 VPN 伺服器,請遵循下列步驟:

  1. 使用正確的變數來設定 API 環境

  2. 儲存要在 API 指令中使用的任何其他變數; 例如:

    • ResourceGroupId-使用 get resource groups 指令尋找資源群組 ID,然後移入變數:
       export ResourceGroupId=<your_resourcegroup_id>
    
    • SubnetId-使用 get subnet 指令尋找子網路 ID,然後移入變數:
       export SubnetId=<your_subnet_id>
    
  3. 起始所有變數時,請建立 VPN 伺服器:

       curl -X POST "$vpc_api_endpoint/v1/vpn_servers?version=$api_version&generation=2" \
         -H "Authorization: Bearer $iam_token" \
         -d '{
            "certificate": {
                "crn": "crn:v1:bluemix:public:cloudcerts:us-south:a/aa5a471f75bc456fac416bf02c4ba6de:1862b0b4-c1f8-4eef-a6b5-e9c00c9f593d:certificate:6c801ef768c139d986b4c6f91175e8cc"
             },
            "client_ip_pool": "192.168.50.0/22",
            "name": "my-new-vpn-server",
            "subnets": [
                {
                      "id": "0716-046c3fd3-1cc5-40f6-b0ad-bbc305308f6d"
                },
                {
                      "id": "0717-30ff71ff-3e90-42a9-aa93-96a062081f18"
                }
             ],
            "client_authentication": [
                {
                      "method": "certificate",
                      "client_ca": {
                         "crn": "crn:v1:bluemix:public:cloudcerts:us-south:a/aa5a471f75bc456fac416bf02c4ba6de:1862b0b4-c1f8-4eef-a6b5-e9c00c9f593d:certificate:6c801ef768c139d986b4c6f91175e8cc"
                      }
                },
                {
                      "method": "username",
                      "identity_provider": {
                         "provider_type": "iam"
                      }
                }
             ]
            "resource_group": {
              "id": "'$ResourceGroupId'"
            }
          }'
    

若要檢視用戶端到站 VPN 伺服器的完整 API 集,請參閱 VPC API 參考資料

使用 Terraform 建立 VPN 伺服器

要使用 Terraform 設定 VPN 伺服器,請遵循以下步驟:

  1. 建立一個 IBM Cloud Secrets Manager 實例。

  2. 在本地產生伺服器憑證/金鑰和用戶端憑證/金鑰,並將其匯入 Secrets Manager 範例,或使用 Secrets Manager 服務的私人憑證功能產生憑證/金鑰。

    resource "ibm_resource_instance" "sec_mgr" {
      name              = "vpc-secmgr"
      service           = "secrets-manager"
      plan              = var.service_plan
      location          = var.region_name
      resource_group_id = data.ibm_resource_group.group.id
      timeouts {
       create = "30m"
       update = "30m"
       delete = "30m"
      }
    }
    resource "ibm_sm_secret_group" "sm_secret_group" {
      instance_id = ibm_resource_instance.sec_mgr[0].guid
      region      = var.region_name
      name        = "vpc-sec-group"
      description = "default secret group"
    }
    output "import_cert_server_crn" {
      value = ibm_sm_imported_certificate.sm_imported_certificate_server.crn
    }
    output "import_cert_client_crn" {
      value = ibm_sm_imported_certificate.sm_imported_certificate_client.crn
    }
    
  3. 使用一個子網路建立一個 VPC。

    resource "ibm_is_vpc" "vpc" {
      name = "vpc-vpnserver"
     }
    resource "ibm_is_subnet" "subnet" {
      name                     = "mysubnet-tf"
      vpc                      = ibm_is_vpc.vpc.id
      zone                     = var.zone_name
      total_ipv4_address_count = 256
     }
    
  4. 建立具有入站和出站規則的安全群組,以允許所有流量。

    resource "ibm_is_security_group" "sg_all" {
      name = "vpc-sg-all"
      vpc  = ibm_is_vpc.vpc.id
    }
    resource "ibm_is_security_group_rule" "sg_rule1" {
      group     = ibm_is_security_group.sg_all.id
      direction = "inbound"
      remote    = "0.0.0.0/0"
    }
    resource "ibm_is_security_group_rule" "sg_rule2" {
      group     = ibm_is_security_group.sg_all.id
      direction = "outbound"
      remote    = "0.0.0.0/0"
    }
    
  5. 在 Secrets Manager 範例的子網路、安全群組和伺服器/用戶端憑證中建立 VPN 伺服器。

    resource "ibm_is_vpn_server" "example" {
      certificate_crn = ibm_sm_imported_certificate.sm_imported_certificate_server.crn
    client_authentication {
      method        = "certificate"
    client_ca_crn = ibm_sm_imported_certificate.sm_imported_certificate_client.crn
    }
     client_ip_pool         = "198.168.0.0/16"
     enable_split_tunneling = true
     name                   = "terry-vpn-server"
     port                   = 443
     protocol               = "tcp"
     subnets                = [ibm_is_subnet.subnet.id]
     security_groups        = [ibm_is_security_group.sg_all.id]
     }
    resource "ibm_is_vpn_server_route" "cse1" {
      vpn_server  = ibm_is_vpn_server.example.id
      destination = "166.8.0.0/14"
      name        = "vpn-server-route-cse1"
     }
    resource "ibm_is_vpn_server_route" "cse2" {
      vpn_server  = ibm_is_vpn_server.example.id
      destination = "161.26.0.0/16"
      name        = "vpn-server-route-cse2"
     }
    
  6. 下載 VPN 用戶端設定檔,並在用戶端設定檔中設定用戶端證書和金鑰。

    data "ibm_is_vpn_server_client_configuration" "my_vpn_client_conf" {
      vpn_server = ibm_is_vpn_server.example.id
    }
    resource "local_file" "my_vpn_client_conf" {
      content  = "${data.ibm_is_vpn_server_client_configuration.my_vpn_client_conf.vpn_server_client_configuration}\ncert ${path.cwd}/import_certs/client_cert.pem\nkey ${path.cwd}/import_certs/client_key.pem"
      filename = "my_vpn_server.ovpn"
    }
    

    然後,使用者就可以使用 OpenVPN 用戶端的 VPN 用戶端設定檔,將其用戶端系統連線至已建立的 VPN 伺服器。

如需更多資訊,請參閱 IBM Terraform Registry

下一步

  1. 若要驗證 VPN 伺服器已順利建立,請等待幾分鐘,然後跳至 用戶端至網站伺服器 表格,以確保 VPN 伺服器狀態為 Stable 且「性能」狀態為 Healthy
  2. 建立 VPN 路由
  3. 設定 VPN 用戶端環境並連接至 VPN 伺服器