雲企業網支援在地區內定義靈活的互連、隔離、引流策略。本文為您介紹如何通過雲企業網實現相互隔離的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兩種配置方式,請按需選擇。
控制台
步驟一:建立雲企業網執行個體
在您串連網路執行個體前,您需要先建立一個雲企業網執行個體。
登入雲企業網管理控制。
在Cloud Enterprise Network執行個體頁面,單擊建立Cloud Enterprise Network執行個體。
在建立Cloud Enterprise Network執行個體對話方塊,根據以下資訊配置雲企業網執行個體,然後單擊确认。
名稱:雲企業網執行個體的名稱。
描述:雲企業網執行個體的描述。
步驟二:建立VPC串連
在Cloud Enterprise Network執行個體頁面,單擊目標執行個體ID。
在雲企業網執行個體詳情頁面的基本資料頁簽,單擊VPC下的
表徵圖。在连接网络实例頁面,根據以下資訊進行配置,然後單擊确定创建。
執行個體類型:系統預設選擇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執行個體傳播路由。
VPC3串連建立完成後,單擊继续创建连接。
VPC串連建立完成後,單擊返回列表,返回到雲企業網執行個體詳情頁面。
步驟三:VPC1和VPC2關聯自訂路由表
在雲企業網執行個體詳情頁面,找到已建立的轉寄路由器,單擊其執行個體ID。
在轉寄路由器詳情頁面,單擊转发路由器路由表頁簽。
在頁簽左側地區,單擊创建路由表。
在创建路由表對話方塊,根據以下資訊進行配置,然後單擊確定。
转发路由器:系統自動選擇當前地區的轉寄路由器。
路由表名稱:輸入路由表名稱。
路由表描述:輸入路由表描述。
多地域等价路由:保持預設值。
單擊返回路由表详情,返回到转发路由器路由表頁簽下。
在转发路由器路由表頁簽下,選擇剛剛建立的自訂路由表,單擊关联转发頁簽,然後單擊创建关联转发。
在添加关联转发對話方塊,選擇要關聯至該自訂路由表的網路執行個體串連,然後單擊確定。
本文樣本中,分別將VPC1和VPC2關聯至該自訂路由表。關聯後,VPC1和VPC2將通過查詢該路由表進行流量轉寄。
在自訂路由表詳情頁面,單擊路由条目頁簽,然後單擊创建路由条目。
在添加路由条目對話方塊,根據以下資訊進行配置,然後單擊確定。
路由表:系統預設選擇當前自訂路由表。
所屬轉寄路由器:系統預設選擇當前地區的轉寄路由器。
路由条目名称:輸入路由條目名稱。
目的地址CIDR:輸入要添加的路由目標網段。本樣本輸入10.0.0.0/16。
是否为黑洞路由:如果選擇路由為黑洞路由後,所有去往該路由的流量均會被丟棄。本樣本選擇否。
下一跳连接:選擇路由的下一跳串連。本樣本選擇VPC3串連。
路由条目描述:路由條目描述。
步驟四:為VPC添加預設路由條目
您需要在VPC控制台分別為VPC1、VPC2、VPC3添加網段為0.0.0.0/0,下一跳指向轉寄路由器的路由。
- 登入專用網路管理主控台。
在左側導覽列,單擊路由表。
在頂部功能表列,選擇路由表所屬的地區。
在路由表頁面,找到目標路由表,單擊路由表的ID。
本樣本選擇VPC3的路由表。
在路由表執行個體詳情頁面,單擊路由條目列表頁簽下的自訂路由條目,然後單擊添加路由条目。
在添加路由条目面板,根據以下資訊配置路由條目,然後單擊確定。
名稱:輸入路由條目的名稱。
目标网段:輸入要添加的目標網段。本樣本輸入0.0.0.0/0。
下一跳类型:選擇下一跳類型。本樣本選擇转发路由器。
转发路由器:選擇網路執行個體串連。本樣本選擇VPC3串連。
更多參數說明,請參見使用自訂路由表進行網路流量管理。
請重複步驟4到步驟6,分別為VPC1、VPC2添加網段為0.0.0.0/0,下一跳指向轉寄路由器的路由。
在您完成配置後,您可以在雲企業網控制台轉寄路由器詳情頁面查看VPC1、VPC2、VPC3以及轉寄路由器路由表的路由資訊。
在轉寄路由器詳情頁面,單擊网络实例路由信息,分別查看VPC1、VPC2和VPC3的路由。
在轉寄路由器詳情頁面,單擊网络实例路由信息。
在網路執行個體後面,選擇VPC1、VPC2或VPC3的執行個體ID,查看路由。
圖 1. VPC1的路由

圖 2. VPC2的路由

圖 3. VPC3的路由

您可以在转发路由器路由表頁簽下,查看轉寄路由器系統路由表已學習到的VPC1、VPC2、VPC3的路由。
在轉寄路由器詳情頁面,單擊转发路由器路由表。
在转发路由器路由表頁簽下,查看路由表路由條目。
圖 4. 系統路由表

圖 5. 自訂路由表

步驟五:驗證測試
完成上述配置後,您可以通過以下步驟,測試VPC1、VP2、VPC3之間的連通性。
在您執行以下步驟前,請您先瞭解您VPC1、VPC2、VPC3中的ECS執行個體所應用的安全性群組規則,確保安全性群組規則允許三個VPC中的ECS執行個體之間可以互連。具體操作,請參見查詢安全性群組規則。
登入VPC1的ECS執行個體。具體操作,請參見選擇ECS遠端連線方式。
通過ping命令,ping VPC3下的ECS執行個體的IP地址,測試VPC1和VPC3之間的連通性。
經驗證,VPC1和VPC3之間可以正常通訊。

登入VPC2的ECS執行個體,通過ping命令,ping VPC3下的ECS執行個體的IP地址,測試VPC2和VPC3之間的連通性。
經驗證,VPC2和VPC3之間可以正常通訊。

登入VPC1的ECS執行個體,通過ping命令,ping VPC2下的ECS執行個體的IP地址,測試VPC1和VPC2之間的連通性。
經驗證,VPC1和VPC2之間不能通訊。

Terraform
您可以使用Terraform搭建本文樣本環境,關於Terraform的安裝和配置,請參考Install Terraform。
下面步驟以Linux主機運行Terraform v1.9.8為例進行介紹,操作前請確保您已經完成Authentication。
本教程樣本包含的部分資源會產生一定費用,請在不需要時及時進行釋放或退訂。
第一步:建立資源
本文情境對應的Terraform代碼:
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®ionId=${var.default_region}&instanceId=${alicloud_instance.ecs[0].id}"
}
output "ecs2_login_address" {
value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=${var.default_region}&instanceId=${alicloud_instance.ecs[1].id}"
}
output "ecs3_login_address" {
value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=${var.default_region}&instanceId=${alicloud_instance.ecs[2].id}"
}第二步:驗證測試
您可以通過以下步驟,測試VPC1、VPC2、VPC3之間的連通性。
登入VPC1下的ECS1執行個體(執行個體名稱為
tf-CenSharedVpc-ecs1)。您可以在Terraform的Outputs輸出中,找到ECS1的登入地址並複製到瀏覽器開啟,登入時注意認證方式選擇臨時SSH密鑰認證。

通過ping命令,ping VPC3下的ECS3執行個體的IP地址,測試VPC1和VPC3之間的連通性。
ping 10.0.0.112經驗證,VPC1和VPC3之間可以正常通訊。

登入VPC2下的ECS2執行個體(執行個體名稱為
tf-CenSharedVpc-ecs2),通過ping命令,ping VPC3下的ECS3執行個體的IP地址,測試VPC2和VPC3之間的連通性。ping 10.0.0.112經驗證,VPC2和VPC3之間可以正常通訊。

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

第三步:釋放資源
驗證完畢後,如果您不再使用資源,請執行以下命令釋放資源,防止繼續計費。
terraform destroy --auto-approve