企業版轉寄路由器執行個體建立後預設支援轉寄IPv6流量、學習並傳播IPv6路由。本文介紹如何使用企業版轉寄路由器實現跨地區VPC間的IPv6網路通訊。
本教程所含範例程式碼支援一鍵運行,您可以直接運行代碼。一鍵運行
情境樣本
本文以上圖情境為例。某企業在阿里雲華東1(杭州)地區擁有VPC1(IPv4)、在華東2(上海)地區擁有VPC2(IPv4)。VPC執行個體下均使用Elastic Compute Service(Elastic Compute Service)產品部署了相關應用。因業務發展,企業希望VPC之間可以實現IPv6網路通訊。
操作步驟
本文提供控制台和Terraform兩種配置方式,請按需選擇。
控制台
準備工作
您已經在阿里雲華東1(杭州)地區、華東2(上海)地區分別建立了一個VPC執行個體(IPv4),VPC執行個體中均使用ECS部署了相關應用。具體操作,請參見搭建IPv4專用網路。
您已經建立了雲企業網執行個體。具體操作,請參見建立雲企業網執行個體。
步驟一:為VPC執行個體開啟IPv6功能
VPC執行個體需開啟IPv6功能後才支援IPv6網路通訊。根據以下步驟,分別為VPC1和VPC2開啟IPv6功能。
建立VPC執行個體時支援為VPC執行個體和交換器執行個體開啟IPv6功能,如果您建立的VPC執行個體和交換器執行個體已經開啟了IPv6功能並分配了IPv6位址區段,可跳過本步驟。
登入專用網路管理主控台。
在頂部功能表列,選擇VPC執行個體的地區。
在專用網路頁面,找到目標VPC執行個體,在IPv6網段列單擊開通IPv6。
在開通IPv6對話方塊中,IPv6網段類型選擇分配BGP(多線),並選中自動開啟VPC內所有交換器IPv6功能,然後單擊確定。
如果您未選中自動開啟VPC內所有交換器IPv6功能,您需要為每個交換器單獨開通IPv6網段。具體操作,請參見交換器開通IPv6。
為VPC執行個體和交換器執行個體開啟IPv6功能後,系統會為VPC執行個體和交換器執行個體分配IPv6網段,您可以在專用網路和交換器頁面的IPv6網段列查看已指派的IPv6網段資訊。下圖展示如何查看VPC執行個體的IPv6網段,交換器執行個體的IPv6網段查看方式與VPC執行個體類似,此處不再展示。

步驟二:為ECS執行個體配置IPv6地址
在進行IPv6網路互連前,請確保要互連的資源已經擁有IPv6地址。本文情境中需要為ECS1和ECS2分別配置IPv6地址,ECS1和ECS2均使用Alibaba Cloud Linux 3.2104 LTS 64位作業系統。
為ECS執行個體分配IPv6地址。具體操作,請參見為已有實例分配IPv6地址。
說明如果您在建立ECS執行個體時已經為其分配了IPv6地址,可跳過本步驟。
為ECS執行個體配置IPv6地址。具體操作,請參見IPv6通訊。
配置完成後,ECS1和ECS2的IPv6地址如下圖所示。
ECS1的IPv6地址

ECS2的IPv6地址

步驟三:建立轉寄路由器執行個體
在雲企業網執行個體下,分別在華東1(杭州)地區和華東2(上海)地區建立轉寄路由器執行個體,以便通過轉寄路由器實現VPC執行個體間的跨地區互連。
登入雲企業網管理主控台。
在云企业网实例頁面,找到目標雲企業網執行個體,單擊目標執行個體ID。
在頁簽,單擊建立轉寄路由器。
在建立轉寄路由器對話方塊,配置轉寄路由器執行個體資訊,然後單擊確認。
建立轉寄路由器執行個體時僅需要配置地區,其餘配置項保持預設狀態。更多資訊,請參見建立轉寄路由器執行個體。
步驟四:建立VPC串連
在實現VPC執行個體跨地區互連前,您需要先將VPC執行個體串連至轉寄路由器中。
登入雲企業網管理主控台。
在云企业网实例頁面,找到目標雲企業網執行個體,單擊目標執行個體ID。
在頁簽,找到步驟三中建立的任意一個轉寄路由器執行個體,在操作列單擊创建网络实例连接。
在连接网络实例頁面,根據以下資訊配置待串連的網路執行個體資訊,然後單擊确定创建。
根據下表資訊,將VPC1串連至華東1(杭州)地區的轉寄路由器、將VPC2串連至華東2(上海)地區的轉寄路由器。以下僅列舉本文強相關的配置項,其餘配置項保持預設狀態。更多資訊,請參見建立VPC串連。
配置項
說明
VPC1
VPC2
实例类型
選擇Virtual Private Cloud。
地域
選擇待串連的網路執行個體所在的地區。
選擇華東1(杭州)。
選擇華東2(上海)。
IPv6支援
選擇是否為VPC串連開啟IPv6功能。系統預設關閉該功能。
如果VPC執行個體需通過企業版轉寄路由器實現IPv6網路通訊,則需開啟本功能。
說明對於已經建立的VPC串連,支援單獨開啟IPv6功能。具體操作,請參見為VPC串連單獨開啟IPv6功能。
選擇開啟IPv6功能。
選擇開啟IPv6功能。
转发路由器
系統自動顯示當前地區下已建立的轉寄路由器執行個體。
资源归属UID
選擇待串連的網路執行個體所屬的帳號類型。
選擇同帳號。
選擇同帳號。
網路執行個體
選擇待串連的VPC執行個體。
選擇VPC1。
選擇VPC2。
交換器
在轉寄路由器支援的可用性區域選擇交換器執行個體。
如果企業版轉寄路由器在當前地區僅支援一個可用性區域,則您需要在當前可用性區域選擇一個交換器執行個體。
如果企業版轉寄路由器在當前地區支援多個可用性區域,則您需要在至少2個可用性區域中各選擇一個交換器執行個體。在VPC和企業版轉寄路由器流量互連的過程中,這2個交換器執行個體可以實現可用性區域層級的容災。
推薦您在每個可用性區域中都選擇一個交換器執行個體,以減少流量繞行,體驗更低傳輸時延以及更高效能。
如果您在對應的可用性區域沒有交換器執行個體,需建立交換器執行個體。具體操作,請參見建立交換器。
高级配置
本文保持預設配置,即選擇開啟三種進階功能。
步驟五:建立跨地區串連
將VPC執行個體串連至企業版轉寄路由器後,您還要建立跨地區串連才能實現VPC執行個體間的跨地區互連。
登入雲企業網管理主控台。
在云企业网实例頁面,找到目標雲企業網執行個體,單擊目標執行個體ID。
在頁簽下,找到步驟三中建立的任意一個轉寄路由器執行個體,在轉寄路由器執行個體的操作列單擊创建网络实例连接。
在连接网络实例頁面,配置跨地區串連資訊,然後單擊确定创建。
以下僅列舉本文強相關的配置項,其餘配置項保持預設狀態。更多資訊,請參見使用企業版轉寄路由器建立跨地區串連。
配置項
說明
实例类型
選擇跨地域连接。
地域
選擇要互連的地區。
本文選擇華東1(杭州)。
對端地區
選擇要互連的對端地區。
本文選擇華東2(上海)。
頻寬分配方式
選擇跨地區串連的頻寬分配方式。
本文選擇按流量付費,系統將按照跨地區串連實際使用的流量計費。
頻寬
輸入跨地區串連的頻寬值。單位:Mbps。
在按流量付費的頻寬分配方式下,該配置項表示跨地區串連的限速頻寬值。
預設鏈路類型
選擇跨地區串連的鏈路類型。
本文保持預設值。鏈路類型說明,請參見鏈路類型。
高级配置
本文保持預設配置,即選擇開啟三種進階功能。
步驟六:開啟路由同步
企業版轉寄路由器預設不向VPC執行個體傳播IPv6路由,您需要分別為VPC1串連和VPC2串連開啟路由同步功能,使企業版轉寄路由器可以向VPC執行個體傳播IPv6路由。
登入雲企業網管理主控台。
在雲企業網執行個體頁面,找到目標雲企業網執行個體,單擊目標執行個體ID。
在頁簽,找到華東1(杭州)地區的轉寄路由器執行個體,單擊轉寄路由器執行個體ID。
在地區內串連管理頁簽,找到VPC1串連,在路由同步列為網路執行個體開啟路由同步。
執行相同的操作,在華東2(上海)地區的轉寄路由器執行個體下為VPC2串連開啟路由同步功能。
網路執行個體串連開啟路由同步後, 企業版轉寄路由器將自動向網路執行個體同步路由。您可以在路由同步列單擊詳情,跳轉至網路執行個體路由資訊頁簽查看路由同步情況。
VPC1的路由條目

VPC2的路由條目

步驟七:測試連通性
完成上述步驟後,VPC1和VPC2之間已經可以實現IPv6網路通訊了。以下內容介紹如何測試VPC執行個體間的IPv6網路連通性。
登入VPC1下的ECS1執行個體。具體操作,請參見ECS遠端連線方式概述。
執行以下命令,嘗試使用ECS1的IPv6地址訪問VPC2下的ECS3執行個體,驗證通訊是否正常。
ping6 <ECS3的IPv6地址>如果ECS1可以收到如下所示的回複報文,則證明VPC執行個體之間已經可以進行IPv6網路通訊了。

Terraform
您可以使用Terraform搭建本文樣本環境,關於Terraform的安裝和配置,請參考Install Terraform。
下面步驟以Linux主機運行Terraform v1.9.8為例進行介紹,操作前請確保您已經完成Authentication。
本教程樣本包含的部分資源會產生一定費用,請在不需要時及時進行釋放或退訂。
第一步:建立資源
為本文的實踐情境建立一個目錄,並進入該目錄。
mkdir tf-CenIpv6 && cd tf-CenIpv6建立一個
main.tf檔案,用於定義資源資訊。touch main.tf開啟
main.tf檔案,複製如下代碼,粘貼到檔案中並儲存。此檔案包含了本文實踐情境中需要用到的資源和對應配置。variable "pname" { description = "The prefix name for resources" type = string default = "tf-CenIpv6" } variable "default_region_id" { description = "The default region id" type = string default = "cn-hangzhou" } variable "hangzhou_region_id" { description = "The hangzhou region id" type = string default = "cn-hangzhou" } variable "shanghai_region_id" { description = "The shanghai region id" type = string default = "cn-shanghai" } variable "hangzhou_az_list" { description = "List of availability zones to use" type = list(string) default = ["cn-hangzhou-j", "cn-hangzhou-k"] } variable "shanghai_az_list" { description = "List of availability zones to use" type = list(string) default = ["cn-shanghai-m", "cn-shanghai-n"] } # --- provider --- provider "alicloud" { # default hangzhou region = var.default_region_id } provider "alicloud" { alias = "hangzhou" region = var.hangzhou_region_id } provider "alicloud" { alias = "shanghai" region = var.shanghai_region_id } # --- 2 vpc and 4 vsw --- resource "alicloud_vpc" "vpc1" { provider = alicloud.hangzhou vpc_name = "${var.pname}-vpc1" cidr_block = "10.0.0.0/16" enable_ipv6 = true } resource "alicloud_vpc" "vpc2" { provider = alicloud.shanghai vpc_name = "${var.pname}-vpc2" cidr_block = "172.16.0.0/16" enable_ipv6 = true } resource "alicloud_vswitch" "vsw1-1" { provider = alicloud.hangzhou vpc_id = alicloud_vpc.vpc1.id cidr_block = "10.0.0.0/24" zone_id = var.hangzhou_az_list[0] vswitch_name = "${var.pname}-vsw1-1" enable_ipv6 = true ipv6_cidr_block_mask = 1 # existed } resource "alicloud_vswitch" "vsw1-2" { provider = alicloud.hangzhou vpc_id = alicloud_vpc.vpc1.id cidr_block = "10.0.1.0/24" zone_id = var.hangzhou_az_list[1] vswitch_name = "${var.pname}-vsw1-2" enable_ipv6 = true ipv6_cidr_block_mask = 2 } resource "alicloud_vswitch" "vsw2-1" { provider = alicloud.shanghai vpc_id = alicloud_vpc.vpc2.id cidr_block = "172.16.0.0/24" zone_id = var.shanghai_az_list[0] vswitch_name = "${var.pname}-vsw2-1" enable_ipv6 = true ipv6_cidr_block_mask = 3 } resource "alicloud_vswitch" "vsw2-2" { provider = alicloud.shanghai vpc_id = alicloud_vpc.vpc2.id cidr_block = "172.16.1.0/24" zone_id = var.shanghai_az_list[1] vswitch_name = "${var.pname}-vsw2-2" enable_ipv6 = true ipv6_cidr_block_mask = 4 } # --- ecs1 --- resource "alicloud_instance" "ecs1" { provider = alicloud.hangzhou instance_name = "${var.pname}-ecs1" instance_type = "ecs.e-c1m1.large" security_groups = [alicloud_security_group.sg1.id] vswitch_id = alicloud_vswitch.vsw1-1.id image_id = "aliyun_3_x64_20G_qboot_alibase_20230727.vhd" system_disk_category = "cloud_essd" private_ip = "10.0.0.1" ipv6_address_count = 1 instance_charge_type = "PostPaid" user_data = base64encode(<<-EOT #!/bin/bash echo ecs_ok > /root/ok.txt sudo acs-plugin-manager --exec --plugin=ecs-utils-ipv6 EOT ) } # --- ecs2 --- resource "alicloud_instance" "ecs2" { provider = alicloud.shanghai instance_name = "${var.pname}-ecs2" instance_type = "ecs.e-c1m1.large" security_groups = [alicloud_security_group.sg2.id] vswitch_id = alicloud_vswitch.vsw2-1.id image_id = "aliyun_3_x64_20G_qboot_alibase_20230727.vhd" system_disk_category = "cloud_essd" private_ip = "172.16.0.1" ipv6_address_count = 1 instance_charge_type = "PostPaid" user_data = base64encode(<<-EOT #!/bin/bash echo ecs_ok > /root/ok.txt sudo acs-plugin-manager --exec --plugin=ecs-utils-ipv6 EOT ) } # sg resource "alicloud_security_group" "sg1" { provider = alicloud.hangzhou name = "${var.pname}-sg1" vpc_id = alicloud_vpc.vpc1.id } resource "alicloud_security_group_rule" "allow_inbound_ssh1" { provider = alicloud.hangzhou type = "ingress" ip_protocol = "tcp" nic_type = "intranet" policy = "accept" port_range = "22/22" priority = 1 security_group_id = alicloud_security_group.sg1.id cidr_ip = "0.0.0.0/0" } resource "alicloud_security_group_rule" "allow_inbound_icmp1" { provider = alicloud.hangzhou type = "ingress" ip_protocol = "icmp" nic_type = "intranet" policy = "accept" port_range = "-1/-1" priority = 1 security_group_id = alicloud_security_group.sg1.id cidr_ip = "0.0.0.0/0" } resource "alicloud_security_group_rule" "allow_inbound_ipv6_icmp1" { provider = alicloud.hangzhou type = "ingress" ip_protocol = "all" nic_type = "intranet" policy = "accept" port_range = "-1/-1" priority = 1 security_group_id = alicloud_security_group.sg1.id ipv6_cidr_ip = "::/0" } resource "alicloud_security_group" "sg2" { provider = alicloud.shanghai name = "${var.pname}-sg2" vpc_id = alicloud_vpc.vpc2.id } resource "alicloud_security_group_rule" "allow_inbound_ssh2" { provider = alicloud.shanghai type = "ingress" ip_protocol = "tcp" nic_type = "intranet" policy = "accept" port_range = "22/22" priority = 1 security_group_id = alicloud_security_group.sg2.id cidr_ip = "0.0.0.0/0" } resource "alicloud_security_group_rule" "allow_inbound_icmp2" { provider = alicloud.shanghai type = "ingress" ip_protocol = "icmp" nic_type = "intranet" policy = "accept" port_range = "-1/-1" priority = 1 security_group_id = alicloud_security_group.sg2.id cidr_ip = "0.0.0.0/0" } resource "alicloud_security_group_rule" "allow_inbound_ipv6_icmp2" { provider = alicloud.shanghai type = "ingress" ip_protocol = "all" nic_type = "intranet" policy = "accept" port_range = "-1/-1" priority = 1 security_group_id = alicloud_security_group.sg2.id ipv6_cidr_ip = "::/0" } # --- cen and tr --- resource "alicloud_cen_instance" "cen1" { cen_instance_name = "${var.pname}-cen1" } resource "alicloud_cen_transit_router" "tr1" { provider = alicloud.hangzhou transit_router_name = "${var.pname}-tr1" cen_id = alicloud_cen_instance.cen1.id } resource "alicloud_cen_transit_router" "tr2" { provider = alicloud.shanghai transit_router_name = "${var.pname}-tr2" cen_id = alicloud_cen_instance.cen1.id } # get tr sys table id data "alicloud_cen_transit_router_route_tables" "tr1" { # get tr sys table transit_router_id = alicloud_cen_transit_router.tr1.transit_router_id transit_router_route_table_type = "System" } data "alicloud_cen_transit_router_route_tables" "tr2" { transit_router_id = alicloud_cen_transit_router.tr2.transit_router_id transit_router_route_table_type = "System" } # tr-peer resource "alicloud_cen_transit_router_peer_attachment" "peer" { provider = alicloud.hangzhou cen_id = alicloud_cen_instance.cen1.id transit_router_id = alicloud_cen_transit_router.tr1.transit_router_id peer_transit_router_region_id = var.shanghai_region_id peer_transit_router_id = alicloud_cen_transit_router.tr2.transit_router_id bandwidth_type = "DataTransfer" bandwidth = 1 auto_publish_route_enabled = true # default is false } resource "alicloud_cen_transit_router_route_table_association" "ass_peer1" { transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr1.tables[0].id transit_router_attachment_id = alicloud_cen_transit_router_peer_attachment.peer.transit_router_attachment_id } resource "alicloud_cen_transit_router_route_table_propagation" "propa_peer1" { transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr1.tables[0].id transit_router_attachment_id = alicloud_cen_transit_router_peer_attachment.peer.transit_router_attachment_id } resource "alicloud_cen_transit_router_route_table_association" "ass_peer2" { transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id transit_router_attachment_id = alicloud_cen_transit_router_peer_attachment.peer.transit_router_attachment_id } resource "alicloud_cen_transit_router_route_table_propagation" "propa_peer2" { transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id transit_router_attachment_id = alicloud_cen_transit_router_peer_attachment.peer.transit_router_attachment_id } # cidr_list variable "cidr_list" { description = "The list of Private CIDR block" type = list(string) default = ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"] } # attach1 resource "alicloud_cen_transit_router_vpc_attachment" "attach1" { provider = alicloud.hangzhou cen_id = alicloud_cen_instance.cen1.id transit_router_id = alicloud_cen_transit_router.tr1.transit_router_id vpc_id = alicloud_vpc.vpc1.id zone_mappings { zone_id = var.hangzhou_az_list[0] vswitch_id = alicloud_vswitch.vsw1-1.id } zone_mappings { zone_id = var.hangzhou_az_list[1] vswitch_id = alicloud_vswitch.vsw1-2.id } transit_router_vpc_attachment_name = "attach1" transit_router_vpc_attachment_options = { ipv6Support : "enable" } auto_publish_route_enabled = true # default is false } resource "alicloud_cen_transit_router_route_table_association" "ass1" { transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr1.tables[0].id transit_router_attachment_id = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id } resource "alicloud_cen_transit_router_route_table_propagation" "propa1" { transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr1.tables[0].id transit_router_attachment_id = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id } resource "alicloud_route_entry" "vpc1_to_tr1" { provider = alicloud.hangzhou count = 3 route_table_id = alicloud_vpc.vpc1.route_table_id destination_cidrblock = var.cidr_list[count.index] nexthop_type = "Attachment" nexthop_id = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id } # attach2 resource "alicloud_cen_transit_router_vpc_attachment" "attach2" { provider = alicloud.shanghai cen_id = alicloud_cen_instance.cen1.id transit_router_id = alicloud_cen_transit_router.tr2.transit_router_id vpc_id = alicloud_vpc.vpc2.id zone_mappings { zone_id = var.shanghai_az_list[0] vswitch_id = alicloud_vswitch.vsw2-1.id } zone_mappings { zone_id = var.shanghai_az_list[1] vswitch_id = alicloud_vswitch.vsw2-2.id } transit_router_vpc_attachment_name = "attach2" transit_router_vpc_attachment_options = { ipv6Support : "enable" } auto_publish_route_enabled = true # default is false } resource "alicloud_cen_transit_router_route_table_association" "ass2" { transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id transit_router_attachment_id = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id } resource "alicloud_cen_transit_router_route_table_propagation" "propa2" { transit_router_route_table_id = data.alicloud_cen_transit_router_route_tables.tr2.tables[0].id transit_router_attachment_id = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id } resource "alicloud_route_entry" "vpc2_to_tr2" { provider = alicloud.shanghai count = 3 route_table_id = alicloud_vpc.vpc2.route_table_id destination_cidrblock = var.cidr_list[count.index] nexthop_type = "Attachment" nexthop_id = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id } output "ecs1_login_address" { value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=${var.hangzhou_region_id}&instanceId=${alicloud_instance.ecs1.id}" } output "ecs2_login_address" { value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs®ionId=${var.shanghai_region_id}&instanceId=${alicloud_instance.ecs2.id}" }初始化目錄,完成Terraform的初始化配置。
terraform init建立資源。執行後Terraform會先預覽將要建立的資源,確認無誤後,輸入
yes正式開始建立。terraform apply
第二步:驗證測試
完成上述步驟後,VPC1和VPC2之間已經可以實現IPv6網路通訊了。以下內容介紹如何測試VPC執行個體間的IPv6網路連通性。
登入ECS2執行個體(執行個體名稱為
tf-CenIpv6-ecs2)。您可以在Terraform的Outputs輸出中,找到ECS2的登入地址並複製到瀏覽器開啟,登入時注意認證方式選擇臨時SSH密鑰認證。

在ECS2執行個體中,輸入如下命令查看ECS2的IPv6地址
ifconfig
登入ECS1執行個體(執行個體名稱為
tf-CenIpv6-ecs1)。您可以在Terraform的Outputs輸出中,找到ECS1的登入地址並複製到瀏覽器開啟,登入時注意認證方式選擇臨時SSH密鑰認證。

執行以下命令,嘗試使用ECS1的IPv6地址訪問VPC2下的ECS3執行個體,驗證通訊是否正常。
ping6 <ECS2的IPv6地址>
如果ECS1可以收到如圖所示的回複報文,則證明VPC執行個體之間已經可以進行IPv6網路通訊了。
第三步:釋放資源
驗證完畢後,如果您不再使用資源,請執行以下命令釋放資源,防止繼續計費。
terraform destroy --auto-approve