使用企业版转发路由器实现流量安全互访

更新时间:
复制 MD 格式

企业版转发路由器提供灵活的路由管理能力,通过企业版转发路由器,您可以构建服务链(Service Chaining),将访问流量引导至安全管控服务器上进行流量过滤,只允许过滤后的流量相互通信,提高网络的安全性。

场景示例

本文以同地域网络互通为例,为您介绍如何使用企业版转发路由器实现流量安全互访。某企业在阿里云华东1(杭州)地域已经部署了3VPC,其中 VPC-secure 部署有安全管控服务,3VPC之间互不相通。出于业务发展和网络环境安全性考虑,企业希望 VPC-workload-a 和 VPC-workload-b 之间可以相互通信,且 VPC-workload-a 和 VPC-workload-b 之间的访问流量,需先经过 VPC-secure 中的安全管控服务过滤后,再进行通信。

企业可以将要互相通信的 VPC-workload-a 和 VPC-workload-b 连接至企业版转发路由器中,通过在企业版转发路由器中自定义路由规则,实现 VPC-workload-a 和 VPC-workload-b 之间安全互访的需求。

image

前提条件

  • 在您应用本场景时,需确保安全管控服务所属的专有网络VPC(Virtual Private Cloud)实例所在的地域支持企业版转发路由器,以便实现流量安全互访。企业版转发路由器支持的地域和可用区,请参见企业版转发路由器支持的地域和可用区

  • 您已经在华东1(杭州)地域创建了3VPC,且3VPC中均部署有云服务器ECS实例。具体操作,请参见搭建IPv4专有网络

    请确保每个VPC在企业版转发路由器支持的可用区中拥有足够的交换机实例,且每个交换机实例拥有至少一个空闲的IP地址。

    • 对于企业版转发路由器仅支持一个可用区的地域(例如华东5(南京-本地地域)地域),VPC实例需在当前可用区下拥有至少一个交换机实例。

    • 对于企业版转发路由器支持多个可用区的地域(例如华东2(上海)地域),VPC实例需在这些可用区中拥有至少2个交换机实例,2个交换机实例需位于不同的可用区。

    例如,您在华东1(杭州)地域创建了1VPC,则该VPC需在可用区B和可用区C中各拥有至少一个交换机实例,且每个交换机实例拥有至少一个空闲的IP地址。

    说明

    企业版转发路由器会在可用区的交换机实例上创建弹性网卡ENI(Elastic Network Interface),作为VPC向企业版转发路由器实例发送流量的入口,每个ENI会占用一个IP地址。

    本示例中,VPC-secure 中拥有3个交换机实例,交换机1 用于部署安全管控服务,交换机2 和交换机3 用于连接企业版转发路由器。本示例3VPC网络规划如下表所示,在您规划网络时请确保要互通的网段没有重叠。3ECS的镜像都选择Alibaba Cloud Linux

    VPC

    交换机

    交换机可用区

    网段规划

    ECS地址

    VPC-secure

    网段:10.0.0.0/16

    交换机1

    可用区I

    10.0.0.0/24

    ECS-secure: 10.0.0.1

    交换机2

    可用区J

    10.0.1.0/24

    交换机3

    可用区K

    10.0.2.0/24

    VPC-workload-a

    网段:10.1.0.0/16

    交换机4

    可用区I

    10.1.0.0/24

    ECS-workload-a: 10.1.0.1

    交换机5

    可用区J

    10.1.1.0/24

    交换机6

    可用区K

    10.1.2.0/24

    VPC-workload-b

    网段:10.2.0.0/16

    交换机7

    可用区I

    10.2.0.0/24

    ECS-workload-b: 10.2.0.1

    交换机8

    可用区J

    10.2.1.0/24

    交换机9

    可用区K

    10.2.2.0/24

  • 您已经了解 VPC-secure、VPC-workload-a、VPC-workload-b 中的ECS实例所应用的安全组规则,并确保安全组规则允许入方向ICMP协议。具体操作,请参见查询安全组规则添加安全组规则

开始配置

本文提供控制台和Terraform两种配置方式,请按需选择。

控制台

步骤一:创建云企业网实例

云企业网实例是创建和管理一体化网络的基础资源,在企业版转发路由器连接网络实例前,需要先创建一个云企业网实例。

  1. 登录云企业网管理控制台

  2. 云企业网实例页面,单击创建云企业网实例

  3. 创建云企业网实例对话框,根据以下信息进行配置,然后单击确认

    • 名称:输入云企业网实例的名称。本文输入CEN-intra-region-secure-communication

    • 描述:输入云企业网实例的描述信息。

    • 资源组:选择云企业网实例所属的资源组。

      本文不选择,云企业网实例创建完成后将归属于默认资源组。

    • 标签:输入云企业网实例的标签。本文保持为空值。

创建完成后,云企业网实例列表包含一个名称为CEN-intra-region-secure-communication、状态可用的云企业网实例。

步骤二:创建转发路由器实例

在企业版转发路由器连接网络实例前,您需要在云企业网实例中在网络实例所属地域创建转发路由器实例。

  1. 登录云企业网管理控制台

  2. 云企业网实例页面,选择在步骤一中创建的云企业网实例,单击云企业网实例ID。

  3. 基本信息 > 转发路由器页签,单击创建转发路由器

  4. 创建转发路由器对话框,配置转发路由器实例信息,然后单击确认

    配置项

    说明

    配置

    地域

    选择转发路由器实例所属的地域。

    本文选择华东1(杭州)地域。

    版本

    转发路由器实例的版本。

    系统自动判断并显示当前地域下转发路由器实例的版本。

    开启组播

    选择是否打开转发路由器实例的组播功能。

    本文保持默认值,即不打开组播功能。

    名称

    输入转发路由器实例的名称。

    本文输入TR-intra-region-secure-communication

    描述

    输入转发路由器实例的描述信息。

    请自定义转发路由器实例的描述信息。

    标签

    为企业版转发路由器实例添加标签。

    本文保持为空值。

    TR地址段

    输入转发路由器地址段。

    更多信息,请参见转发路由器地址段

    本文不输入转发路由器地址段。

创建完成后,转发路由器列表包含一个名称为TR-intra-region-secure-communication、地域为华东1(杭州)、状态可用的企业版转发路由器实例。

步骤三:连接VPC实例

将要互通的网络实例,连接至企业版转发路由器。

  1. 登录云企业网管理控制台

  2. 云企业网实例页面,找到目标云企业网实例,单击目标实例ID。

  3. 基本信息 > 转发路由器页签,找到目标地域的转发路由器实例,在操作列单击创建网络实例连接 > 创建地域内连接

  4. 创建地域内连接页面,根据以下信息进行配置,然后单击确定创建

    下表罗列了各个配置项的说明以及 VPC-secure、VPC-workload-a、VPC-workload-b 对应的参数值,请依据下表中的数据,分别将3个 VPC 连接至企业版转发路由器。

    配置项

    配置项说明

    VPC-secure

    VPC-workload-a

    VPC-workload-b

    实例类型

    选择待连接的网络实例类型。

    专有网络(VPC)

    专有网络(VPC)

    专有网络(VPC)

    地域

    选择待连接的网络实例所在的地域。

    华东1(杭州)

    华东1(杭州)

    华东1(杭州)

    转发路由器

    系统自动显示在该地域已创建的转发路由器实例。

    资源归属UID

    选择待连接的网络实例所属的账号类型。

    同账号

    同账号

    同账号

    付费方式

    默认值按量付费

    连接名称

    输入网络实例连接的名称。

    attachment-secure

    attachment-workload-a

    attachment-workload-b

    标签

    为网络实例连接添加标签。

    本文保持为空值。

    本文保持为空值。

    本文保持为空值。

    网络实例

    选择待连接的网络实例。

    选择VPC-secure

    选择VPC-workload-a

    选择VPC-workload-b

    交换机

    在转发路由器支持的可用区选择一个交换机实例。

    如果您在转发路由器支持的多个可用区均拥有交换机实例,您可以同时选择多个可用区并在每个可用区下选择一个交换机实例以实现可用区级别的容灾。

    • 杭州 可用区J:选择交换机2

    • 杭州 可用区K:选择交换机3

    • 杭州 可用区I:选择交换机4

    • 杭州 可用区J:选择交换机5

    • 杭州 可用区I:选择交换机7

    • 杭州 可用区J:选择交换机8

    高级配置

    VPC-secure、VPC-workload-a、VPC-workload-b 均关闭以下三项高级配置。

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

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

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

    说明

    开启高级配置后,VPC-secure、VPC-workload-a 和 VPC-workload-b 将会自动学习到对方的路由,实现相互通信,但无法达到流量安全互访的目的。因此,本示例不启用VPC的高级配置,后续步骤通过手动创建路由表、添加路由条目等方式,自定义网络实例的连通性,以实现流量的安全互访。

创建完成后,地域内连接管理页签包含 3 条 VPC 连接,信息如下:

名称

包含网络实例

连接详情-交换机

attachment-secure

VPC-secure

交换机2

交换机3

attachment-workload-a

VPC-workload-a

交换机4

交换机5

attachment-workload-b

VPC-workload-a

交换机7

交换机8

步骤四:为VPC实例添加路由条目

在 VPC-secure、VPC-workload-a 和 VPC-workload-b 中添加路由条目,引导VPC的流量进入企业版转发路由器,在企业版转发路由器中引导和管理流量实现流量的安全互访。

  1. 配置VPC-secure中的路由表:

    1. 在 VPC-secure 中,创建2张自定义路由表绑定对象类型交换机,分别命名为routetable_secure-to-workload、routetable_workload-to-secure。

    2. routetable_secure-to-workload绑定交换机1,并添加路由条目

      • 目标网段:输入0.0.0.0/0

      • 下一跳类型:选择转发路由器

      • 转发路由器:选择attachment-secure

    3. routetable_workload-to-secure绑定交换机2和交换机3,并添加路由条目:

      • 目标网段:输入0.0.0.0/0

      • 下一跳类型:选择ECS实例

      • ECS实例:选择ECS-secure(安全管控实例)。

  2. 在 VPC-workload-a 和 VPC-workload-b 的系统路由表中,均添加如下路由条目,使VPC-workload-a 和 VPC-workload-b 的互访流量引导至转发路由器:

    • 目标网段:输入0.0.0.0/0

    • 下一跳类型:选择转发路由器

    • 转发路由器:配置 VPC-workload-a 系统路由表时,选择attachment-workload-a;配置 VPC-workload-b 系统路由表时,选择attachment-workload-b

创建完成后,各个VPC中新添加的路由条目的信息如下表所示:

网络实例

交换机

交换机绑定的路由表

路由条目

下一跳

VPC-secure

交换机1

routetable_secure-to-workload

0.0.0.0/0

attachment-secure(转发路由器)

交换机2

routetable_workload-to-secure

0.0.0.0/0

ECS-secure

交换机3

VPC-workload-a

  • 交换机4

  • 交换机5

  • 交换机6

系统路由表

0.0.0.0/0

attachment-workload-a(转发路由器)

VPC-workload-b

  • 交换机7

  • 交换机8

  • 交换机9

系统路由表

0.0.0.0/0

attachment-workload-b(转发路由器)

步骤五:在转发路由器中配置路由

VPC的流量进入企业版转发路由器后,在企业版转发路由器通过创建路由表、添加路由条目等方式自定义连通性,引导 VPC-workload-a 和 VPC-workload-b 的流量进入VPC-secure,并将经过 VPC-secure 过滤后的流量引导至目的地。

  1. 登录云企业网管理控制台

  2. 云企业网实例页面,单击目标实例ID。

  3. 基本信息 > 转发路由器页签,找到目标地域的转发路由器实例,单击目标实例ID。

  4. 转发路由器路由表页签下,为企业版转发路由器创建两张自定义路由表,分别命令为 TR_routetable_workload-to-secure 和 TR_routetable_secure-to-workload。具体操作,请参见自定义路由表

  5. attachment-workload-aattachment-workload-b关联至企业版转发路由器的自定义路由表并为其配置路由条目。

    1. 转发路由器路由表页签下,选择自定义路由表 TR_routetable_workload-to-secure,单击关联转发页签,然后单击创建关联转发

    2. 添加关联转发对话框,选择要关联至该自定义路由表的网络实例连接,然后单击确定

      本示例中,请将attachment-workload-aattachment-workload-b连接关联至该自定义路由表。

    3. 保持在该路由表详情页面,单击路由条目页签,然后单击创建路由条目

    4. 添加路由条目对话框,根据以下信息进行配置,然后单击确定

      • 目的地址CIDR:本示例输入0.0.0.0/0

      • 是否为黑洞路由:如果选择路由为黑洞路由后,所有去往该路由的流量均会被丢弃。本示例选择

      • 下一跳连接:本示例选择attachment-secure

      更多信息,请参见自定义路由条目

    完成上述操作后,VPC-workload-a 和 VPC-workload-b 的所有访问流量将被转发到 VPC-secure。

  6. 为 VPC-secure 关联自定义路由表并配置路由条目。

    1. 转发路由器路由表页签下,选择自定义路由表 TR_routetable_secure-to-workload,单击关联转发页签,然后单击创建关联转发

    2. 添加关联转发对话框,选择要关联至该自定义路由表的网络实例连接,然后单击确定

      本示例中,请将attachment-secure关联至该自定义路由表。

    3. 保持在该路由表详情页面,单击路由学习页签,然后单击创建路由学习

    4. 添加路由学习对话框,选择该路由表要学习其路由的网络实例连接,然后单击确定

      本示例中,关联连接选择attachment-workload-aattachment-workload-b。关联后,该路由表将能学习到 VPC-workload-a 和 VPC-workload-b 的路由。VPC-secure 通过查询该路由表和 VPC-workload-a 及 VPC-workload-b 互通。

    创建完成后,企业版转发路由器的路由条目信息如下表所示:

    路由表名称

    目标网段

    下一跳

    TR_routetable_workload-to-secure

    0.0.0.0/0

    attachment-secure

    TR_routetable_secure-to-workload

    10.1.0.0/24

    attachment-workload-a

    10.1.1.0/24

    attachment-workload-a

    10.1.2.0/24

    attachment-workload-a

    10.2.0.0/24

    attachment-workload-b

    10.2.1.0/24

    attachment-workload-b

    10.2.2.0/24

    attachment-workload-b

步骤六:测试验证

完成上述操作后,VPC-secure、VPC-workload-a 和 VPC-workload-b 之间已可以按照期望的路径进行安全互访,以下内容为您介绍如何测试 VPC 实例之间的流量路径。

  1. 登录ECS-secure,执行以下命令启用允许转发。关于如何登录ECS实例,请参见选择ECS远程连接方式

    说明

    在不设置允许转发的情况下,VPC-workload-a 和 VPC-secure 之间、VPC-workload-b 和 VPC-secure 之间可以互相访问,但 VPC-workload-a和 VPC-workload-b 之间无法互访。

    echo 1 > /proc/sys/net/ipv4/ip_forward   #启用允许转发。当前命令临时生效,重启后会丢失。
  2. 登录 ECS-workload-a,在 ECS-workload-a 上安装mtr软件。mtr是一种结合了 Ping 和 Traceroute 功能的网络诊断工具,用于实时分析网络路径的延迟和数据包丢失,在本文中可以帮助我们识别流量路径。

    yum install -y mtr
  3. 在 ECS-workload-a 执行mtr命令,测试 ECS-workload-a 到 ECS-workload-b 的流量路径:

    mtr 10.2.0.1 -i 5

    参数说明:-i 5指的是每5秒发送一次ping请求。

    My traceroute  [v0.92]
    iZxxxvZ (10.1.0.1)                              2024-12-04T20:40:46+0800
    Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                           Packets               Pings
     Host                                Loss%   Snt   Last   Avg  Best  Wrst StDev
     1. 10.0.0.1                          0.0%     9    3.8   3.8   3.8   4.1   0.1
     2. 10.0.0.1                          0.0%     9    5.0   4.0   3.8   5.0   0.4
     3. 10.2.0.1                          0.0%     9    8.2   8.3   8.2   8.6   0.1

    命令执行结果显示,从 ECS-workload-a 发往 ECS-workload-b 的报文,经过了10.0.0.1(ECS-secure)转发,表明 VPC-workload-a 和 VPC-workload-b 之间互访的流量已经绕行 ECS-secure(安全ECS)。

Terraform

您可以使用Terraform搭建本文示例环境,关于Terraform的安装和配置,请参考Provider 使用

下面步骤以Linux主机运行Terraform v1.9.8为例进行介绍,操作前请确保您已经完成Terraform 身份认证

说明

本教程示例包含的部分资源会产生一定费用,请在不需要时及时进行释放或退订。

第一步:创建资源

本文场景对应的Terraform代码如下:

variable "pname" {
  description = "The prefix name for the resources"
  type        = string
  default     = "tf-CenSec"
}
variable "default_region" {
  description = "Default region"
  type        = string
  default     = "cn-hangzhou"
}
variable "az" {
  description = "List of availability zones to use"
  type        = list(string)
  default     = ["cn-hangzhou-i", "cn-hangzhou-j", "cn-hangzhou-k"]
}
variable "vpc_count" {
  description = "Number of VPCs to create"
  type        = number
  default     = 3
}
provider "alicloud" {
  region = var.default_region
}
# vpc
resource "alicloud_vpc" "main" {
  count      = var.vpc_count
  vpc_name   = "${var.pname}-vpc${count.index + 1}"
  cidr_block = "10.${count.index}.0.0/16"
}
# vsw
resource "alicloud_vswitch" "main" {
  count        = var.vpc_count * length(var.az)
  vpc_id       = alicloud_vpc.main[floor(count.index / length(var.az))].id
  cidr_block   = "10.${floor(count.index / length(var.az))}.${count.index % length(var.az)}.0/24"
  zone_id      = var.az[count.index % length(var.az)]
  vswitch_name = "${var.pname}-vsw${count.index + 1}"
}
# ecs
resource "alicloud_instance" "main" {
  count                = var.vpc_count
  instance_name        = "${var.pname}-ecs${count.index + 1}"
  instance_type        = "ecs.e-c1m1.large"
  security_groups      = [alicloud_security_group.main[count.index].id]
  vswitch_id           = alicloud_vswitch.main[count.index * length(var.az)].id
  image_id             = "aliyun_3_x64_20G_qboot_alibase_20230727.vhd"
  system_disk_category = "cloud_essd"
  private_ip           = "10.${count.index}.0.1"
  instance_charge_type = "PostPaid"
  user_data = base64encode(<<-EOT
    #!/bin/bash
    ${count.index == 0 ? "echo 1 > /proc/sys/net/ipv4/ip_forward" : ""} 
    yum install -y traceroute
    yum install -y mtr
  EOT
  ) # ecs1 enable ip_forward
}
# sg
resource "alicloud_security_group" "main" {
  count               = var.vpc_count
  security_group_name = "${var.pname}-${count.index + 1}"
  vpc_id              = alicloud_vpc.main[count.index].id
}
resource "alicloud_security_group_rule" "allow_inbound_ssh" {
  count             = var.vpc_count
  type              = "ingress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "22/22"
  priority          = 1
  security_group_id = alicloud_security_group.main[count.index].id
  cidr_ip           = "0.0.0.0/0"
}
resource "alicloud_security_group_rule" "allow_inbound_icmp" {
  count             = var.vpc_count
  type              = "ingress"
  ip_protocol       = "icmp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "-1/-1"
  priority          = 1
  security_group_id = alicloud_security_group.main[count.index].id
  cidr_ip           = "0.0.0.0/0"
}
resource "alicloud_security_group_rule" "allow_all_outbound" {
  count             = var.vpc_count
  type              = "egress"
  ip_protocol       = "tcp"
  nic_type          = "intranet"
  policy            = "accept"
  port_range        = "1/65535"
  priority          = 1
  security_group_id = alicloud_security_group.main[count.index].id
  cidr_ip           = "0.0.0.0/0"
}
# cen
resource "alicloud_cen_instance" "cen1" {
  cen_instance_name = var.pname
}
# tr
resource "alicloud_cen_transit_router" "tr1" {
  transit_router_name = var.pname
  cen_id              = alicloud_cen_instance.cen1.id
}
# attach1  to vsw2 vsw3 in vpc1
resource "alicloud_cen_transit_router_vpc_attachment" "attach1" {
  cen_id            = alicloud_cen_instance.cen1.id
  transit_router_id = alicloud_cen_transit_router.tr1.transit_router_id
  vpc_id            = alicloud_vpc.main[0].id
  zone_mappings {
    zone_id    = var.az[1]
    vswitch_id = alicloud_vswitch.main[1].id # vsw2, vpc1-2
  }
  zone_mappings {
    zone_id    = var.az[2]
    vswitch_id = alicloud_vswitch.main[2].id # vsw3, vpc1-3
  }
  transit_router_vpc_attachment_name = "attach1"
}
# attach2 to vsw1 vsw2 in vpc2
resource "alicloud_cen_transit_router_vpc_attachment" "attach2" {
  cen_id            = alicloud_cen_instance.cen1.id
  transit_router_id = alicloud_cen_transit_router.tr1.transit_router_id
  vpc_id            = alicloud_vpc.main[1].id
  zone_mappings {
    zone_id    = var.az[0]
    vswitch_id = alicloud_vswitch.main[3].id # vsw4, vpc2-1
  }
  zone_mappings {
    zone_id    = var.az[1]
    vswitch_id = alicloud_vswitch.main[4].id # vsw5, vpc2-2
  }
  transit_router_vpc_attachment_name = "attach2"
}
# attach3 to vsw1 vsw2 in vpc3
resource "alicloud_cen_transit_router_vpc_attachment" "attach3" {
  cen_id            = alicloud_cen_instance.cen1.id
  transit_router_id = alicloud_cen_transit_router.tr1.transit_router_id
  vpc_id            = alicloud_vpc.main[2].id
  zone_mappings {
    zone_id    = var.az[0]
    vswitch_id = alicloud_vswitch.main[6].id # vsw6, vpc3-1
  }
  zone_mappings {
    zone_id    = var.az[1]
    vswitch_id = alicloud_vswitch.main[7].id # vsw7, vpc3-2
  }
  transit_router_vpc_attachment_name = "attach3"
}
# 2 rt for vpc1
resource "alicloud_route_table" "rt" {
  count            = 2
  vpc_id           = alicloud_vpc.main[0].id
  route_table_name = "${var.pname}-rt${count.index}"
  associate_type   = "VSwitch"
}
# 2 rt attach, rt1 to vsw1, rt2 to vsw2、vsw3
locals {
  # rt and vsw map
  rt_attachments = {
    "rt1_vsw1" = {
      route_table_index = 0
      vswitch_index     = 0
    }
    "rt2_vsw2" = {
      route_table_index = 1
      vswitch_index     = 1
    }
    "rt2_vsw3" = {
      route_table_index = 1
      vswitch_index     = 2
    }
  }
}
resource "alicloud_route_table_attachment" "rt_attach" {
  for_each = local.rt_attachments
  vswitch_id     = alicloud_vswitch.main[each.value.vswitch_index].id
  route_table_id = alicloud_route_table.rt[each.value.route_table_index].id
}
# rt entry, vpc1
resource "alicloud_route_entry" "rt-entry1" { # nexthop tr
  route_table_id        = alicloud_route_table.rt[0].id
  destination_cidrblock = "0.0.0.0/0"
  nexthop_type          = "Attachment"
  nexthop_id            = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id
}
resource "alicloud_route_entry" "rt-entry2" { # nexthop ecs1
  route_table_id        = alicloud_route_table.rt[1].id
  destination_cidrblock = "0.0.0.0/0"
  nexthop_type          = "Instance"
  nexthop_id            = alicloud_instance.main[0].id # ecs1
}
# rt entry, vpc2 vpc3
resource "alicloud_route_entry" "rt-entry4" {
  route_table_id        = alicloud_vpc.main[1].route_table_id
  destination_cidrblock = "0.0.0.0/0"
  nexthop_type          = "Attachment"
  nexthop_id            = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id
}
resource "alicloud_route_entry" "rt-entry5" {
  route_table_id        = alicloud_vpc.main[2].route_table_id
  destination_cidrblock = "0.0.0.0/0"
  nexthop_type          = "Attachment"
  nexthop_id            = alicloud_cen_transit_router_vpc_attachment.attach3.transit_router_attachment_id
}
# new 2 tr_rt
resource "alicloud_cen_transit_router_route_table" "tr_rt1" {
  transit_router_id               = alicloud_cen_transit_router.tr1.transit_router_id
  transit_router_route_table_name = "tr_rt1"
}
resource "alicloud_cen_transit_router_route_table" "tr_rt2" {
  transit_router_id               = alicloud_cen_transit_router.tr1.transit_router_id
  transit_router_route_table_name = "tr_rt2"
}
# ass rt1 attach2 3
resource "alicloud_cen_transit_router_route_table_association" "ass1" {
  transit_router_route_table_id = alicloud_cen_transit_router_route_table.tr_rt1.transit_router_route_table_id
  transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id
}
resource "alicloud_cen_transit_router_route_table_association" "ass2" {
  transit_router_route_table_id = alicloud_cen_transit_router_route_table.tr_rt1.transit_router_route_table_id
  transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach3.transit_router_attachment_id
}
# ass rt2 attach1
resource "alicloud_cen_transit_router_route_table_association" "ass3" {
  transit_router_route_table_id = alicloud_cen_transit_router_route_table.tr_rt2.transit_router_route_table_id
  transit_router_attachment_id  = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id
}
# tr_rt_entry
resource "alicloud_cen_transit_router_route_entry" "tr_rt1_entry1" {
  transit_router_route_table_id                     = alicloud_cen_transit_router_route_table.tr_rt1.transit_router_route_table_id
  transit_router_route_entry_destination_cidr_block = "0.0.0.0/0"
  transit_router_route_entry_next_hop_type          = "Attachment"
  transit_router_route_entry_next_hop_id            = alicloud_cen_transit_router_vpc_attachment.attach1.transit_router_attachment_id
}
resource "alicloud_cen_transit_router_route_entry" "tr_rt2_entry1" {
  transit_router_route_table_id                     = alicloud_cen_transit_router_route_table.tr_rt2.transit_router_route_table_id
  transit_router_route_entry_destination_cidr_block = "10.1.0.0/16"
  transit_router_route_entry_next_hop_type          = "Attachment"
  transit_router_route_entry_next_hop_id            = alicloud_cen_transit_router_vpc_attachment.attach2.transit_router_attachment_id
}
resource "alicloud_cen_transit_router_route_entry" "tr_rt2_entry2" {
  transit_router_route_table_id                     = alicloud_cen_transit_router_route_table.tr_rt2.transit_router_route_table_id
  transit_router_route_entry_destination_cidr_block = "10.2.0.0/16"
  transit_router_route_entry_next_hop_type          = "Attachment"
  transit_router_route_entry_next_hop_id            = alicloud_cen_transit_router_vpc_attachment.attach3.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.main[0].id}"
}
output "ecs2_login_address" {
  value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.main[1].id}"
}
output "ecs3_login_address" {
  value = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=${var.default_region}&instanceId=${alicloud_instance.main[2].id}"
}

第二步:验证测试

  1. 登录ECS2实例(名称为tf-CenSec-ecs2):

    您可以在TerraformOutputs输出中,找到ECS2的登录地址并复制到浏览器打开,登录时注意认证方式选择临时SSH密钥认证

    Terraform 执行完成后,输出示例如下,其中 ecs2_login_address 即为 ECS2 的登录地址。

    Outputs:
    ecs1_login_address = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=cn-hangzhou&instanceId=i-bp1xxx"
    ecs2_login_address = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=cn-hangzhou&instanceId=i-bp1xxx"
    ecs3_login_address = "https://ecs-workbench.aliyun.com/?from=EcsConsole&instanceType=ecs&regionId=cn-hangzhou&instanceId=i-bp1xxx"
  2. ECS2执行mtr命令,测试ECS2ECS3的流量路径:

    mtr 10.2.0.1 -i 5

    参数说明:-i 5指的是每5秒发送一次ping请求。

    My traceroute  [v0.92]
    iZbp1xxx (10.1.0.1)                          2024-12-04T20:40:46+0800
    Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                             Packets               Pings
     Host                                  Loss%   Snt   Last   Avg  Best  Wrst StDev
     1. 10.0.0.1                            0.0%     9    3.8   3.8   3.8   4.1   0.1
     2. 10.0.0.1                            0.0%     9    5.0   4.0   3.8   5.0   0.4
     3. 10.2.0.1                            0.0%     9    8.2   8.3   8.2   8.6   0.1

    结果显示,从ECS2发往ECS3的报文,经过了10.0.0.1(ECS1)转发,表明VPC2VPC3之间互访的流量已经绕行ECS1(安全ECS)。

第三步:释放资源

验证完毕后,如果您不再使用资源,请执行以下命令释放资源,防止继续计费。

terraform destroy --auto-approve