创建 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 和密码提供了一层额外的安全保障,访问账户时需要提供额外的登录凭据。

        可选择上传 PEM 格式的证书吊销列表 (CRL)。 上传 CRL 后,PEM 文件将显示为 VPN 服务器的名称。

      • 用户标识和验证码-为 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隧道,而公共流量则通过现有的局域网接口传输。

        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 命令查找资源组标识,然后填充变量:
       export ResourceGroupId=<your_resourcegroup_id>
    
    • SubnetId-使用 get subnet 命令查找子网标识,然后填充变量:
       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注册表

后续步骤

  1. 要验证是否已成功创建 VPN 服务器,请等待几分钟,然后转至 客户机到站点服务器 表,以确保 VPN 服务器状态为 Stable,运行状况状态为 Healthy
  2. 创建 VPN 路由
  3. 设置 VPN 客户机环境并连接到 VPN 服务器