全部產品
Search
文件中心

Cloud Enterprise Network:隔離VPC使用共用服務

更新時間:Jan 01, 2025

雲企業網支援在地區內定義靈活的互連、隔離、引流策略。本文為您介紹如何通過雲企業網實現相互隔離的VPC同時訪問同一個共用服務。

說明

本教程所含範例程式碼支援一鍵運行,您可以直接運行代碼。一鍵運行

背景資訊

本文以下圖情境為例。某企業在阿里雲華東1(杭州)地區已經部署有三個VPC,其中VPC3為部署共用服務的VPC。企業希望VPC1和VPC2均能訪問VPC3使用共用服務,而VPC1和VPC2之間不互連。

網路規劃

為實現上述需求,結合雲企業網自訂路由表、關聯轉寄、路由學習等功能,對企業網段和路由規劃如下:

  • 將VPC3串連到轉寄路由器時,開啟自動關聯至轉寄路由器的預設路由表自動傳播系統路由至轉寄路由器的預設路由表進階功能。

    開啟後,轉寄路由器預設路由表能自動學習到VPC3的系統路由,並且VPC3通過查詢轉寄路由器的預設路由表進行流量轉寄。

  • 將VPC1和VPC2串連到轉寄路由器時,均只開啟自動傳播系統路由至轉寄路由器的預設路由表一個進階配置,然後將VPC1和VPC2關聯到轉寄路由器的自訂路由表,且在自訂路由表中,添加去往VPC3的自訂路由條目。

    完成後,轉寄路由器預設路由表能學習到VPC1和VPC2的全部系統路由。VPC1和VPC2通過查詢自訂路由表將流量轉寄到VPC3。此時,VPC1和VPC2之間不互連。

  • 分別在VPC1、VPC2、VPC3的路由表中添加0.0.0.0/0,下一跳指向轉寄路由器的路由。

  • 在華東1(杭州)地區建立三個VPC,並在指定可用性區域中建立交換器。VPC中的網段規劃,如下表所示。

    重要

    在您進行網段規劃時,請確保VPC之間的網段沒有重疊。

    Virtual Private Cloud

    交換器

    交換器可用性區域

    網段規劃

    Elastic Compute Service

    VPC1

    主網段:192.168.0.0/16

    交換器1

    可用性區域A

    192.168.0.0/24

    ECS1地址:

    192.168.0.224

    交換器2

    可用性區域B

    192.168.1.0/24

    VPC2

    主網段:172.16.0.0/16

    交換器3

    可用性區域A

    172.16.0.0/24

    ECS2地址:

    172.16.0.222

    交換器4

    可用性區域B

    172.16.1.0/24

    VPC3

    主網段:10.0.0.0/16

    交換器5

    可用性區域A

    10.0.0.0/24

    ECS3地址:

    10.0.0.112

    交換器6

    可用性區域B

    10.0.1.0/24

操作步驟

本文提供控制台和Terraform兩種配置方式,請按需選擇。

控制台

步驟一:建立雲企業網執行個體

在您串連網路執行個體前,您需要先建立一個雲企業網執行個體。

  1. 登入雲企業網管理主控台
  2. 雲企業網執行個體頁面,單擊建立雲企業網執行個體

  3. 建立雲企業網執行個體對話方塊,根據以下資訊配置雲企業網執行個體,然後單擊確認

    • 名稱:雲企業網執行個體的名稱。

    • 描述:雲企業網執行個體的描述。

步驟二:建立VPC串連

  1. 雲企業網執行個體頁面,單擊目標執行個體ID。

  2. 在雲企業網執行個體詳情頁面的基本資料頁簽,單擊VPC下的添加網路執行個體表徵圖。

  3. 串連網路執行個體頁面,根據以下資訊進行配置,然後單擊確定建立

    • 執行個體類型:系統預設選擇Virtual Private Cloud

    • 地區:選擇要串連的網路執行個體所在的地區。本樣本選擇華東1(杭州)

    • 轉寄路由器:系統自動為您在該地區建立轉寄路由器。

    • 資源歸屬UID:選擇要串連的網路執行個體所歸屬的帳號類型。本樣本使用預設值同帳號

    • 付費方式:使用預設值隨用隨付。

    • 串連名稱:輸入串連名稱。

    • 網路執行個體:選擇要串連的VPC網路執行個體ID。本樣本選擇VPC3。

    • 交換器:在轉寄路由器支援的可用性區域選擇交換器執行個體。

      • 如果企業版轉寄路由器在當前地區僅支援一個可用性區域,則您需要在當前可用性區域選擇一個交換器執行個體。

      • 如果企業版轉寄路由器在當前地區支援多個可用性區域,則您需要在至少2個可用性區域中各選擇一個交換器執行個體。在VPC和企業版轉寄路由器流量互連的過程中,這2個交換器執行個體可以實現可用性區域層級的容災。

        推薦您在每個可用性區域中都選擇一個交換器執行個體,以減少流量繞行,體驗更低傳輸時延以及更高效能。

    • 進階配置:系統預設幫您選中以下三種進階功能。本樣本中VPC3隻開啟自動關聯至轉寄路由器的預設路由表自動傳播系統路由至轉寄路由器的預設路由表進階功能。

      • 自动关联至转发路由器的默认路由表

        開啟本功能後,VPC串連會自動關聯至轉寄路由器的預設路由表,轉寄路由器通過查詢預設路由錶轉發VPC執行個體的流量。

      • 自动传播系统路由至转发路由器的默认路由表

        開啟本功能後,VPC執行個體會將自身的系統路由傳播至轉寄路由器的預設路由表中,用於網路執行個體的互連。

      • 自动为VPC的所有路由表配置指向转发路由器的路由

        開啟本功能後,系統將在VPC執行個體的所有路由表內自動設定10.0.0.0/8、172.16.0.0/12、192.168.0.0/16三條路由條目,其下一跳均指向VPC串連,用於引導VPC執行個體的IPv4流量進入轉寄路由器。轉寄路由器預設不向VPC執行個體傳播路由。

        重要
        • 如果VPC的路由表中已經存在目標網段為10.0.0.0/8、172.16.0.0/12或192.168.0.0/16的路由條目,則系統無法再自動下發該路由條目,您需要在VPC路由表中手動添加指向VPC串連的路由條目以實現VPC和轉寄路由器之間的流量互連。

          您可以單擊發起路由檢查查看網路執行個體內是否存在上述路由。

        • 如果VPC執行個體需要實現IPv6網路通訊,建立VPC串連後,您需要為VPC串連開啟路由同步功能或者在VPC執行個體的路由表中手動添加指向VPC串連的IPv6路由條目,VPC執行個體的IPv6流量才能進入轉寄路由器。

  4. VPC3串連建立完成後,單擊繼續建立串連

    請重複步驟3,建立VPC1和VPC2串連。其中,在您為VPC1和VPC2建立串連時,均只選中自動傳播系統路由至轉寄路由器的預設路由表一個進階配置。

  5. VPC串連建立完成後,單擊返回列表,返回到雲企業網執行個體詳情頁面。

步驟三:VPC1和VPC2關聯自訂路由表

  1. 在雲企業網執行個體詳情頁面,找到已建立的轉寄路由器,單擊其執行個體ID。

  2. 在轉寄路由器詳情頁面,單擊轉寄路由器路由表頁簽。

  3. 在頁簽左側地區,單擊建立路由表

  4. 建立路由表對話方塊,根據以下資訊進行配置,然後單擊確定

    • 轉寄路由器:系統自動選擇當前地區的轉寄路由器。

    • 路由表名稱:輸入路由表名稱。

    • 路由表描述:輸入路由表描述。

    • 多地區等價路由:保持預設值。

  5. 單擊返迴路由表詳情,返回到轉寄路由器路由表頁簽下。

  6. 轉寄路由器路由表頁簽下,選擇剛剛建立的自訂路由表,單擊關聯轉寄頁簽,然後單擊建立關聯轉寄

  7. 添加關聯轉寄對話方塊,選擇要關聯至該自訂路由表的網路執行個體串連,然後單擊確定

    本文樣本中,分別將VPC1和VPC2關聯至該自訂路由表。關聯後,VPC1和VPC2將通過查詢該路由表進行流量轉寄。

  8. 在自訂路由表詳情頁面,單擊路由條目頁簽,然後單擊建立路由條目

  9. 添加路由條目對話方塊,根據以下資訊進行配置,然後單擊確定

    • 路由表:系統預設選擇當前自訂路由表。

    • 所屬轉寄路由器:系統預設選擇當前地區的轉寄路由器。

    • 路由條目名稱:輸入路由條目名稱。

    • 目的地址CIDR:輸入要添加的路由目標網段。本樣本輸入10.0.0.0/16。

    • 是否為黑洞路由:如果選擇路由為黑洞路由後,所有去往該路由的流量均會被丟棄。本樣本選擇

    • 下一跳串連:選擇路由的下一跳串連。本樣本選擇VPC3串連。

    • 路由條目描述:路由條目描述。

步驟四:為VPC添加預設路由條目

您需要在VPC控制台分別為VPC1、VPC2、VPC3添加網段為0.0.0.0/0,下一跳指向轉寄路由器的路由。

  1. 登入專用網路管理主控台
  2. 在左側導覽列,單擊路由表

  3. 在頂部功能表列,選擇路由表所屬的地區。

  4. 路由表頁面,找到目標路由表,單擊路由表的ID。

    本樣本選擇VPC3的路由表。

  5. 在路由表執行個體詳情頁面,單擊路由條目列表頁簽下的自訂路由條目,然後單擊添加路由條目

  6. 添加路由條目面板,根據以下資訊配置路由條目,然後單擊確定

    • 名稱:輸入路由條目的名稱。

    • 目標網段:輸入要添加的目標網段。本樣本輸入0.0.0.0/0。

    • 下一跳類型:選擇下一跳類型。本樣本選擇轉寄路由器

    • 轉寄路由器:選擇網路執行個體串連。本樣本選擇VPC3串連。

    更多參數說明,請參見使用自訂路由表進行網路流量管理

  7. 請重複步驟4步驟6,分別為VPC1、VPC2添加網段為0.0.0.0/0,下一跳指向轉寄路由器的路由。

    在您完成配置後,您可以在雲企業網控制台轉寄路由器詳情頁面查看VPC1、VPC2、VPC3以及轉寄路由器路由表的路由資訊。

    1. 在轉寄路由器詳情頁面,單擊網路執行個體路由資訊,分別查看VPC1、VPC2和VPC3的路由。

      1. 在轉寄路由器詳情頁面,單擊網路執行個體路由資訊

      2. 網路執行個體後面,選擇VPC1、VPC2或VPC3的執行個體ID,查看路由。

        圖 1. VPC1的路由

        image

        圖 2. VPC2的路由

        image

        圖 3. VPC3的路由

        image

    2. 您可以在轉寄路由器路由表頁簽下,查看轉寄路由器系統路由表已學習到的VPC1、VPC2、VPC3的路由。

      1. 在轉寄路由器詳情頁面,單擊轉寄路由器路由表

      2. 轉寄路由器路由表頁簽下,查看路由表路由條目。

        圖 4. 系統路由表

        image

        圖 5. 自訂路由表

        image

步驟五:驗證測試

完成上述配置後,您可以通過以下步驟,測試VPC1、VP2、VPC3之間的連通性。

說明

在您執行以下步驟前,請您先瞭解您VPC1、VPC2、VPC3中的ECS執行個體所應用的安全性群組規則,確保安全性群組規則允許三個VPC中的ECS執行個體之間可以互連。具體操作,請參見查詢安全性群組規則

  1. 登入VPC1的ECS執行個體。具體操作,請參見ECS遠端連線方式概述

  2. 通過ping命令,ping VPC3下的ECS執行個體的IP地址,測試VPC1和VPC3之間的連通性。

    經驗證,VPC1和VPC3之間可以正常通訊。共用VPC-VPC1-VPC3

  3. 登入VPC2的ECS執行個體,通過ping命令,ping VPC3下的ECS執行個體的IP地址,測試VPC2和VPC3之間的連通性。

    經驗證,VPC2和VPC3之間可以正常通訊。共用VPC-VPC2-VPC3

  4. 登入VPC1的ECS執行個體,通過ping命令,ping VPC2下的ECS執行個體的IP地址,測試VPC1和VPC2之間的連通性。

    經驗證,VPC1和VPC2之間不能通訊。共用VPC-VPC1-VPC2

Terraform

您可以使用Terraform搭建本文樣本環境,關於Terraform的安裝和配置,請參考Install Terraform

下面步驟以Linux主機運行Terraform v1.9.8為例進行介紹,操作前請確保您已經完成Authentication

說明

本教程樣本包含的部分資源會產生一定費用,請在不需要時及時進行釋放或退訂。

第一步:建立資源

  1. 為本文的實踐情境建立一個目錄,並進入該目錄。

    mkdir tf-CenSharedVpc && cd tf-CenSharedVpc
  2. 建立一個main.tf檔案,用於定義資源資訊。

    touch main.tf
  3. 開啟main.tf檔案,複製如下代碼,粘貼到檔案中並儲存。此檔案包含了本文實踐情境中需要用到的資源和對應配置。

    variable "pname" {
      description = "The prefix name for the resources"
      type        = string
      default     = "tf-CenSharedVpc"
    }
    
    variable "default_region" {
      description = "Default region"
      type        = string
      default     = "cn-hangzhou"
    }
    
    variable "az_list" {
      description = "List of availability zones to use"
      type        = list(string)
      default     = ["cn-hangzhou-j", "cn-hangzhou-k"]
    }
    
    variable "vpc_cidr_list" {
      description = "List of VPC CIDR block"
      type        = list(string)
      default     = ["192.168.0.0/16", "172.16.0.0/12", "10.0.0.0/16"]
    }
    
    variable "vsw_cidr_list" {
      description = "List of VSW CIDR block"
      type        = list(string)
      default = [
        "192.168.0.0/24", "192.168.1.0/24",
        "172.16.0.0/24", "172.16.1.0/24",
        "10.0.0.0/24", "10.0.1.0/24"
      ]
    }
    
    variable "ecs_ip_list" {
      description = "List of ECS ip"
      type        = list(string)
      default     = ["192.168.0.124", "172.16.0.222", "10.0.0.112"]
    }
    
    provider "alicloud" {
      region = var.default_region
    }
    
    # --- 3vpc 6vsw 3ecs
    resource "alicloud_vpc" "vpc" {
      count      = length(var.vpc_cidr_list)
      vpc_name   = "${var.pname}-vpc${count.index + 1}"
      cidr_block = var.vpc_cidr_list[count.index]
    }
    
    resource "alicloud_vswitch" "vsw" {
      count        = length(var.vsw_cidr_list)
      vpc_id       = alicloud_vpc.vpc[floor(count.index / length(var.az_list))].id
      cidr_block   = var.vsw_cidr_list[count.index]
      zone_id      = var.az_list[count.index % length(var.az_list)]
      vswitch_name = "${var.pname}-vsw${count.index + 1}"
    }
    
    resource "alicloud_instance" "ecs" {
      count                = length(var.vpc_cidr_list)
      instance_name        = "${var.pname}-ecs${count.index + 1}"
      instance_type        = "ecs.e-c1m1.large"
      security_groups      = [alicloud_security_group.sg[count.index].id]
      vswitch_id           = alicloud_vswitch.vsw[count.index * length(var.az_list)].id
      image_id             = "aliyun_3_x64_20G_qboot_alibase_20230727.vhd"
      system_disk_category = "cloud_essd"
      private_ip           = var.ecs_ip_list[count.index]
      instance_charge_type = "PostPaid"
    }
    
    # --- 3 sg
    resource "alicloud_security_group" "sg" {
      count  = length(var.vpc_cidr_list)
      name   = "${var.pname}-${count.index + 1}"
      vpc_id = alicloud_vpc.vpc[count.index].id
    }
    
    resource "alicloud_security_group_rule" "allow_inbound_ssh" {
      count             = length(var.vpc_cidr_list)
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "22/22"
      priority          = 1
      security_group_id = alicloud_security_group.sg[count.index].id
      cidr_ip           = "0.0.0.0/0"
    }
    
    resource "alicloud_security_group_rule" "allow_inbound_icmp" {
      count             = length(var.vpc_cidr_list)
      type              = "ingress"
      ip_protocol       = "icmp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "-1/-1"
      priority          = 1
      security_group_id = alicloud_security_group.sg[count.index].id
      cidr_ip           = "0.0.0.0/0"
    }
    
    # --- cen and tr
    resource "alicloud_cen_instance" "cen" {
      cen_instance_name = "${var.pname}-cen1"
    }
    resource "alicloud_cen_transit_router" "tr" {
      transit_router_name = "${var.pname}-tr"
      cen_id              = alicloud_cen_instance.cen.id
    }
    data "alicloud_cen_transit_router_route_tables" "tr" { # get tr sys table
      transit_router_id               = alicloud_cen_transit_router.tr.transit_router_id
      transit_router_route_table_type = "System"
    }
    
    # 3 attach
    resource "alicloud_cen_transit_router_vpc_attachment" "attach" {
      count             = length(var.vpc_cidr_list)
      cen_id            = alicloud_cen_instance.cen.id
      transit_router_id = alicloud_cen_transit_router.tr.transit_router_id
      vpc_id            = alicloud_vpc.vpc[count.index].id
      zone_mappings {
        zone_id    = var.az_list[0]
        vswitch_id = alicloud_vswitch.vsw[count.index * length(var.az_list)].id
      }
      zone_mappings {
        zone_id    = var.az_list[1]
        vswitch_id = alicloud_vswitch.vsw[count.index * length(var.az_list) + 1].id
      }
      transit_router_vpc_attachment_name = "attach${count.index + 1}"
    }
    
    # 3 propa
    resource "alicloud_cen_transit_router_route_table_propagation" "propa" {
      count                         = length(var.vpc_cidr_list)
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach[count.index].transit_router_attachment_id
    }
    
    # 1 custom_table
    resource "alicloud_cen_transit_router_route_table" "custom_table" { # create tr custom_table
      transit_router_id               = alicloud_cen_transit_router.tr.transit_router_id
      transit_router_route_table_name = "custom_table"
    }
    
    resource "alicloud_cen_transit_router_route_entry" "tr_entry" {
      transit_router_route_table_id                     = alicloud_cen_transit_router_route_table.custom_table.transit_router_route_table_id
      transit_router_route_entry_destination_cidr_block = "10.0.0.0/16"
      transit_router_route_entry_next_hop_type          = "Attachment"
      transit_router_route_entry_name                   = "entry1_name"
      transit_router_route_entry_description            = "entry1_desc"
      transit_router_route_entry_next_hop_id            = alicloud_cen_transit_router_vpc_attachment.attach[2].transit_router_attachment_id
    }
    
    # associate attach1\2   custom_table
    resource "alicloud_cen_transit_router_route_table_association" "ass1" {
      transit_router_route_table_id = alicloud_cen_transit_router_route_table.custom_table.transit_router_route_table_id
      transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach[0].transit_router_attachment_id
    }
    resource "alicloud_cen_transit_router_route_table_association" "ass2" {
      transit_router_route_table_id = alicloud_cen_transit_router_route_table.custom_table.transit_router_route_table_id
      transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach[1].transit_router_attachment_id
    }
    # ass attach3 sys_table
    resource "alicloud_cen_transit_router_route_table_association" "ass3" {
      transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr.tables[0].id
      transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach[2].transit_router_attachment_id
    }
    
    # vpc entry
    resource "alicloud_route_entry" "vpc_entry" {
      count                 = length(var.vpc_cidr_list)
      route_table_id        = alicloud_vpc.vpc[count.index].route_table_id
      destination_cidrblock = "0.0.0.0/0"
      nexthop_type          = "Attachment"
      nexthop_id            = alicloud_cen_transit_router_vpc_attachment.attach[count.index].transit_router_attachment_id
    }
    
    output "ecs1_login_address" {
      value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.ecs[0].id}"
    }
    
    output "ecs2_login_address" {
      value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.ecs[1].id}"
    }
    
    output "ecs3_login_address" {
      value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.ecs[2].id}"
    }
  4. 初始化目錄,完成Terraform的初始化配置。

    terraform init
  5. 建立資源。執行後Terraform會先預覽將要建立的資源,確認無誤後,輸入yes正式開始建立。

    terraform apply

第二步:驗證測試

您可以通過以下步驟,測試VPC1、VPC2、VPC3之間的連通性。

  1. 登入VPC1下的ECS1執行個體(執行個體名稱為tf-CenSharedVpc-ecs1)。

    您可以在Terraform的Outputs輸出中,找到ECS1的登入地址並複製到瀏覽器開啟,登入時注意認證方式選擇臨時SSH密鑰認證

    image

  2. 通過ping命令,ping VPC3下的ECS3執行個體的IP地址,測試VPC1和VPC3之間的連通性。

    ping 10.0.0.112

    經驗證,VPC1和VPC3之間可以正常通訊。共用VPC-VPC1-VPC3

  3. 登入VPC2下的ECS2執行個體(執行個體名稱為tf-CenSharedVpc-ecs2),通過ping命令,ping VPC3下的ECS3執行個體的IP地址,測試VPC2和VPC3之間的連通性。

    ping 10.0.0.112

    經驗證,VPC2和VPC3之間可以正常通訊。共用VPC-VPC2-VPC3

  4. 登入VPC1下的ECS1執行個體(執行個體名稱為tf-CenSharedVpc-ecs1),通過ping命令,ping VPC2下的ECS2執行個體的IP地址,測試VPC1和VPC2之間的連通性。

    ping 172.16.0.222

    經驗證,VPC1和VPC2之間不能通訊。共用VPC-VPC1-VPC2

第三步:釋放資源

驗證完畢後,如果您不再使用資源,請執行以下命令釋放資源,防止繼續計費。

terraform destroy --auto-approve