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

企业版转发路由器提供灵活的路由管理能力,通过企业版转发路由器您可以将访问流量引导至安全管控服务器上进行流量过滤,只允许过滤后的流量相互通信,提高网络的安全性。本文为您介绍如何通过企业版转发路由器实现流量安全互访。

说明

本教程所含示例代码支持一键运行,您可以直接运行代码。一键运行

场景示例

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

企业可以将要互相通信的VPC2VPC3连接至企业版转发路由器中,通过在企业版转发路由器中自定义路由策略,实现VPC2VPC3之间安全互访的需求。

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地址。

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

    VPC

    交换机

    交换机可用区

    网段规划

    ECS地址

    VPC1

    网段:10.0.0.0/16

    交换机1

    可用区I

    10.0.0.0/24

    ECS1

    10.0.0.1

    交换机2

    可用区J

    10.0.1.0/24

    交换机3

    可用区K

    10.0.2.0/24

    VPC2

    网段:10.1.0.0/16

    交换机4

    可用区I

    10.1.0.0/24

    ECS2

    10.1.0.1

    交换机5

    可用区J

    10.1.1.0/24

    交换机6

    可用区K

    10.1.2.0/24

    VPC3

    网段:10.2.0.0/16

    交换机7

    可用区I

    10.2.0.0/24

    ECS3

    10.2.0.1

    交换机8

    可用区J

    10.2.1.0/24

    交换机9

    可用区K

    10.2.2.0/24

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

开始配置

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

控制台

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

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

  1. 登录云企业网管理控制台
  2. 云企业网实例页面,单击创建云企业网实例

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

    • 名称:输入云企业网实例的名称。

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

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

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

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

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

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

  1. 登录云企业网管理控制台
  2. 云企业网实例页面,选择在步骤一中创建的云企业网实例,单击云企业网实例ID。

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

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

    配置项

    说明

    配置

    地域

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

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

    版本

    转发路由器实例的版本。

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

    开通组播

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

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

    名称

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

    请自定义转发路由器实例的名称。

    描述

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

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

    标签

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

    本文保持为空值。

    TR地址段

    输入转发路由器地址段。

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

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

步骤三:连接VPC实例

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

  1. 登录云企业网管理控制台
  2. 云企业网实例页面,找到目标云企业网实例,单击目标实例ID。
  3. 基本信息 > 转发路由器页签,找到目标地域的转发路由器实例,在操作单击创建网络实例连接
  4. 连接网络实例页面,根据以下信息进行配置,然后单击确定创建

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

    配置项

    配置项说明

    VPC1

    VPC2

    VPC3

    实例类型

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

    专有网络(VPC)

    专有网络(VPC)

    专有网络(VPC)

    地域

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

    华东1(杭州)

    华东1(杭州)

    华东1(杭州)

    转发路由器

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

    资源归属UID

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

    同账号

    同账号

    同账号

    付费方式

    默认值按量付费

    连接名称

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

    VPC1连接

    VPC2连接

    VPC3连接

    标签

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

    本文保持为空值。

    本文保持为空值。

    本文保持为空值。

    网络实例

    选择待连接的网络实例。

    选择VPC1

    选择VPC2

    选择VPC3

    交换机

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

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

    • 华东1(杭州)可用区J:选择交换机2

    • 华东1(杭州)可用区K:选择交换机3

    • 华东1(杭州)可用区I:选择交换机4

    • 华东1(杭州)可用区J:选择交换机5

    • 华东1(杭州)可用区I:选择交换机7

    • 华东1(杭州)可用区J:选择交换机8

    高级配置

    VPC1、VPC2、VPC3均不启用以下三项高级配置。

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

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

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

    说明

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

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

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

  1. 登录专有网络管理控制台
  2. 在顶部菜单栏,选择路由表所属的地域。

  3. VPC2VPC3添加自定义路由条目。

    分别在VPC2VPC3的系统路由表中添加目标网段为0.0.0.0/0,下一跳为转发路由器的路由条目,使VPC2VPC3的访问流量均被转发至企业版转发路由器。

    1. 在左侧导航栏,单击路由表

    2. 路由表页面,找到目标路由表,单击路由表实例ID。

      本示例找到VPC2的系统路由表。

    3. 路由条目列表页签下单击自定义路由条目页签,然后单击添加路由条目

    4. 添加路由条目面板,配置以下信息,然后单击确定

      • 名称:输入自定义路由条目的名称。

      • 目标网段:本示例输入0.0.0.0/0

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

      • 转发路由器:本示例选择VPC2关联的转发路由器实例。

    5. 请重复上述步骤,在VPC3的系统路由表中添加相同的路由条目,配置信息如下。

      • 目标网段:本示例输入0.0.0.0/0

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

      • 转发路由器:本示例选择VPC3关联的转发路由器实例。

  4. VPC1创建三张自定义路由表,分别命名为routetable1、routetable2routetable3。具体操作,请参见创建自定义路由表

  5. 绑定交换机和自定义路由表。具体操作,请参见绑定交换机和路由表

    在本示例中,将VPC1中的交换机1绑定路由表routetable1、交换机2绑定路由表routetable2、交换机3绑定路由表routetable3。

  6. VPC1的自定义路由表中添加路由条目。

    1. 路由表页面,选择已创建的一张路由表,单击路由表实例ID。

      本示例选择与交换机1绑定的自定义路由表routetable1。

    2. 路由条目列表页签下单击自定义路由条目页签,然后单击添加路由条目

    3. 添加路由条目面板,配置以下信息,然后单击确定

      • 名称:输入自定义路由条目的名称。

      • 资源组:本示例选择全部资源组

      • 目标网段:本示例输入0.0.0.0/0

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

      • ECS实例:本示例选择VPC1中交换机3下的安全管控ECS实例。

    4. 请重复上述步骤和配置,在交换机2的自定义路由表routetable2中添加相同的路由条目。

    5. 请重复上述步骤,在交换机3的自定义路由表routetable3中添加路由条目,其中交换机3的路由条目信息如下:

      • 目标网段:本示例输入0.0.0.0/0

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

      • 转发路由器:本示例选择VPC1关联的转发路由器实例。

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

    网络实例

    路由表名称

    路由表关联的交换机

    路由条目

    下一跳

    VPC1

    routetable1

    交换机1

    0.0.0.0/0

    VPC1关联的转发路由器实例

    routetable2

    交换机2

    0.0.0.0/0

    交换机1中的ECS实例

    routetable3

    交换机3

    0.0.0.0/0

    交换机1中的ECS实例

    VPC2

    系统路由表

    • 交换机1

    • 交换机2

    • 交换机3

    0.0.0.0/0

    VPC2关联的转发路由器实例

    VPC3

    系统路由表

    • 交换机1

    • 交换机2

    • 交换机3

    0.0.0.0/0

    VPC3关联的转发路由器实例

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

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

  1. 登录云企业网管理控制台
  2. 云企业网实例页面,单击目标实例ID。

  3. 基本信息 > 转发路由器页签,找到目标地域的转发路由器实例,单击目标实例ID。
  4. 转发路由器路由表页签下,为企业版转发路由器创建两张自定义路由表,分别命令为TR_routetable1TR_routetable2。具体操作,请参见自定义路由表

  5. VPC2连接和VPC3连接关联至企业版转发路由器的自定义路由表并为其配置路由条目。

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

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

      本示例中,请将VPC2连接和VPC3连接关联至该自定义路由表。

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

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

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

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

      • 下一跳连接:本示例选择VPC1连接。

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

    完成上述操作后,VPC2VPC3的所有访问流量将被转发到VPC1。

  6. VPC1关联自定义路由表并配置路由条目。

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

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

      本示例中,请将VPC1连接关联至该自定义路由表。

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

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

      本示例中,请将VPC2连接和VPC3连接关联至该路由表。关联后,该路由表将能学习到VPC2VPC3的路由。VPC1通过查询该路由表和VPC2VPC3互通。

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

    路由表名称

    目标网段

    下一跳

    TR_routetable1

    0.0.0.0/0

    VPC1连接

    TR_routetable2

    10.1.0.0/16

    VPC2连接

    10.2.0.0/16

    VPC3连接

步骤六:测试验证

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

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

    说明

    在不设置允许转发的情况下,VPC2VPC1之间、VPC3VPC1之间可以互相访问,但VPC2VPC3之间无法互访。

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

    yum install -y mtr
  3. ECS2执行mtr命令,测试ECS2ECS3的流量路径:

    mtr 10.2.0.1 -i 5

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

    image

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

Terraform

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

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

说明

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

第一步:创建资源

  1. 为本文的实践场景创建一个目录,并进入该目录。

    mkdir tf-CenSec && cd tf-CenSec
  2. 创建一个main.tf文件,用于定义资源信息。

    touch main.tf
  3. 打开main.tf文件,复制如下代码,粘贴到文件中并保存。此文件包含了本文实践场景中需要用到的资源和对应配置。

    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
      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"
    }
    
    # 3 rt for vpc1
    resource "alicloud_route_table" "rt" {
      count            = 3
      vpc_id           = alicloud_vpc.main[0].id
      route_table_name = "${var.pname}-rt${count.index}"
      associate_type   = "VSwitch"
    }
    
    # 3 rt attach to vsw1 2 3  
    resource "alicloud_route_table_attachment" "rt_attach" {
      count          = 3
      vswitch_id     = alicloud_vswitch.main[count.index].id
      route_table_id = alicloud_route_table.rt[count.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
    }
    resource "alicloud_route_entry" "rt-entry3" { # nexthop ecs1
      route_table_id        = alicloud_route_table.rt[2].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}"
    }
  4. 初始化目录,完成Terraform的初始化配置。

    terraform init
  5. 创建资源。执行后Terraform会先预览将要创建的资源,确认无误后,输入yes正式开始创建。

    terraform apply

第二步:验证测试

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

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

    image

  2. ECS2执行mtr命令,测试ECS2ECS3的流量路径:

    mtr 10.2.0.1 -i 5

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

    image

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

第三步:释放资源

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

terraform destroy --auto-approve