企业版转发路由器实例创建后默认支持转发IPv6流量、学习并传播IPv6路由。本文介绍如何使用企业版转发路由器实现跨地域VPC间的IPv6网络通信。
本教程所含示例代码支持一键运行,您可以直接运行代码。一键运行
场景示例
本文以上图场景为例。某企业在阿里云华东1(杭州)地域拥有VPC1(IPv4)、在华东2(上海)地域拥有VPC2(IPv4)。VPC实例下均使用云服务器 ECS(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实例间的跨地域互通。
步骤四:创建VPC连接
在实现VPC实例跨地域互通前,您需要先将VPC实例连接至转发路由器中。
- 登录云企业网管理控制台。
- 在云企业网实例页面,找到目标云企业网实例,单击目标实例ID。
在步骤三中创建的任意一个转发路由器实例,在操作列单击创建网络实例连接。
页签,找到在连接网络实例页面,根据以下信息配置待连接的网络实例信息,然后单击确定创建。
根据下表信息,将VPC1连接至华东1(杭州)地域的转发路由器、将VPC2连接至华东2(上海)地域的转发路由器。以下仅列举本文强相关的配置项,其余配置项保持默认状态。更多信息,请参见创建VPC连接。
配置项
说明
VPC1
VPC2
实例类型
选择专有网络(VPC)。
地域
选择待连接的网络实例所在的地域。
选择华东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的安装和配置,请参考Provider 使用。
下面步骤以Linux主机运行Terraform v1.9.8为例进行介绍,操作前请确保您已经完成Terraform 身份认证。
本教程示例包含的部分资源会产生一定费用,请在不需要时及时进行释放或退订。
第一步:创建资源
为本文的实践场景创建一个目录,并进入该目录。
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