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 と少なくとも 1 つのサブネットを作成 します。

    高可用性のために、1 つの VPC と 2 つのサブネットを 2 つの異なるゾーンに作成します。 VPN サーバーは 2 つのサブネット内にあります。

コンソールで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 サーバー・モードを選択します。

      • 高可用性モード - 異なるゾーンにある 2 つのサブネットにわたって VPN サーバーをデプロイします。 クライアントの VPN アクセスが重要なマルチゾーン・デプロイメントおよびソリューションに最適です。
      • スタンドアロン・モード - VPN サーバーを単一のサブネットおよびゾーンにデプロイします。 マルチゾーンの回復力が不要な単一ゾーン・デプロイメントに最適です。
    • VPC の 1 つのサブネット (スタンドアロン・モード) または複数のサブネット (HA モード) を指定します。

      「VPN サブネット」セクション
      「VPN サブネット」セクション

  8. 「認証」セクションで次の情報を指定します。

    • VPN サーバー認証- Secrets Manager からサーバー SSL 証明書を選択します。 すべての必須フィールドに入力します。

      VPN サーバー認証セクション
      VPN サーバー認証セクション

    • クライアント認証モード - クライアント証明書、ユーザー ID とパスコード、またはその両方を選択し、それを使用したユーザー認証を構成します。

      • クライアント証明書 - クライアント証明書を選択してユーザー ID とパスコードを構成することにより、最適なセキュリティーを実現できます。 ユーザーIDとパスコードは、 アカウントアクセスする際に追加のログイン認証情報を必要とする、セキュリティの追加の層を提供します。

        オプションで、証明書失効リスト (CRL) を PEM 形式でアップロードできます。 CRL をアップロードすると、PEM ファイルは VPN サーバーの名前として表示されます。

      • ユーザー ID とパスコード-VPN クライアント・ユーザーの追加認証を構成します。 この認証方式は、 IBM Cloud のIAMと連携してクライアント認証を完了させることで、セキュリティをさらに強化します。 認証が完了すると、システムは認証のためにそのコードを openVPN クライアントに渡します。

      VPN クライアント認証セクション
      VPN クライアント認証セクション

  9. 「セキュリティー・グループ」セクションで、少なくとも 1 つのセキュリティー・グループを選択します。

    1つまたは複数のセキュリティグループとそのルールを設定したり、VPNサーバを配置する予定のサブネットや、VPNトンネルを介して通信する他のVPCサブネットにアクセス制御リスト(ACL)を設定したりするには、「 VPNサーバで使用するACLの設定 」を参照してください。

    「VPN セキュリティー・グループ」セクション
    「VPN セキュリティー・グループ」セクション

    VPN サーバーの詳細ページ (「セキュリティー・グループ」タブ) からプロビジョニング後にセキュリティー・グループを関連付けることができます。

  10. **「追加構成 (Additional configuration)」**セクションで次の情報を指定します。

    • DNS サーバーの IP アドレス - オプションで、ドメイン・ネーム解決のために 1 つまたは 2 つの DNS サーバー IP アドレスを指定します。

    • アイドル・タイムアウト・セッション (秒数) - この期間が経過しても VPN サーバーにトラフィックがない場合、自動的に切断されます。 この値は 0 秒から 28800 秒の間の値を指定できます。 デフォルト値は 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。 高可用性を確保するには異なるゾーンのサブネットを使用します。最大で 2 つのサブネットを設定できます。
  • --client-ip-pool: CIDR 形式で表される VPN クライアントの IPv4 アドレス・プール。 要求は、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: この VPN サーバーに接続された VPN クライアントに提供される、コンマ区切りの DNS サーバー・アドレス。 最大で 2 つの 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. 1つのサブネットで1つの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 サーバーに接続します