企业级DMZ上云场景方案

张晓锐
  • 收获赞:56
  • 擅长领域:阿里云网络产品解决方案架构师,擅长领域:云网络

随着企业业务云化进程逐渐进入深水区,简单地使用云上资源出入公网已经无法满足业务的诉求,安全、成本、权限、监控等诉求的迭代,需要企业有系统性地视角来考虑如何做好公网出入口(DMZ)的规划设计。

概述

随着企业业务云化进程逐渐进入深水区,简单地使用云上资源出入公网已经无法满足业务的诉求,安全、成本、权限、监控等诉求的迭代,需要企业有系统性地视角来考虑如何做好公网出入口(DMZ)的规划设计。

传统企业统一DMZ主要会考虑以下几点:

  • 安全:企业安全出入口,防止潜在针对云资源的攻击侵入

  • 优化:出口带宽共享,优化整体公网成本

  • 管理:统一管控公网出入权限,防止业务部门私开公网资源导致业务遭受安全威胁

  • 监控:监控内网/外网访问情况,及时排查异常流量原因

目标读者

集团型公司IT负责人、MNC跨国公司IT负责人、金融公司IT负责人

适用场景

  1. 集团型公司IT团队负责整体云网络架构运维和管理,子公司/子部门IT只需负责业务模块的开发,集团IT部门需要对整体云上公网出入口进行监控和管理,防止外部攻击以及内部异常访问。

  2. MNC跨国公司/金融公司需要对所有跟互联网访问相关的VPC进行流量审计,防止来自内外部的各种安全威胁。同时由IT部门统一控制云资源对外服务以及访问互联网的权限。

方案架构

云上DMZ设计,从传统的多VPC分布式出入口,演进到所有VPC在共享服务账号管控的统一DMZ VPC。

image.png

DMZ设计

  1. DMZ-VPC设计:将企业云上整体的WAN能力均放在共享服务账号的DMZ VPC,该VPC内可按需部署ALB、NLB、NAT网关等公网产品。

  2. 统一出口:在TR组网架构下,使用NAT网关在DMZVPC统一云上公网出口,为不同业务设置不同的EIP出口方便流量统计管理

  3. 统一入口:DMZVPC与后端业务VPC通过TR或PrivateLink打通,通过ALB/NLB跨VPC挂载能力保障后端业务VPC无需暴露在公网

  4. 安全设计:可联动DDoS防护、WAF、云防火墙等安全产品,保障公网出入口安全,并结合网络ACL实现安全访问策略。

  5. 成本优化:启用共享带宽,并将所有EIP加入其中,节约成本。

  6. 权限划分:利用将公网能力统一收口至IT部门,部署SNAT,业务VPC均通过CEN实现跨VPC访问公网。

  7. 监控管理:使用网络智能服务NIS,监控公网出入口流量信息,并根据异动排查原因。

方案优势

1.统一管理

公网出口由企业IT部门统一管控,业务VPC通过CEN实现跨VPC出公网,各业务需要向IT部门申请后才能获取公网权限,防止业务部门私开公网资源导致业务遭受安全威胁。

2.保障安全

企业的WAN能力放到共享服务账号的DMZ VPC,在该VPC中部署NAT网关NLBALB等云产品可以联动DDos防护WAF云防火墙等安全产品保障公网出口安全,防止潜在针对云资源的攻击侵入。

3.成本优化

使用共享带宽实现出入口EIP带宽共享,优化公网成本。

4.统一监控

使用NIS监控内网/外网访问情况,及时排查异常流量原因

产品介绍及相关概念

产品费用

产品名称

产品说明

产品费用

云企业网CEN

云企业网CEN(Cloud Enterprise Network)是运行在阿里云私有全球网络上的一张高可用网络。云企业网通过转发路由器TR(Transit Router)帮助您在跨地域专有网络之间,专有网络与本地数据中心间搭建私网通信通道,为您打造一张灵活、可靠、大规模的企业级云上网络。

收费,详情参见产品计费

转发路由器TR

转发路由器TR(Transit Router)是地域范围内企业级核心转发网元,可为您转发同地域或不同地域的网络实例间的流量,并支持在地域内定义灵活的互通、隔离、引流策略,帮助您打造一张灵活、可靠、大规模的企业级互联网络。转发路由器实例是云企业网实例的重要组成部分。

收费,CEN重要组成部分,请参见CEN计费规则。

弹性公网IP(EIP)

弹性公网IP(Elastic IP Address,简称EIP)是可以独立购买和持有的公网IP地址资源。目前,EIP仅支持绑定到专有网络类型的ECS实例、专有网络类型的私网SLB实例、专有网络类型的辅助弹性网卡、NAT网关和高可用虚拟IP上。

收费,详情参见产品计费

共享带宽

共享带宽提供地域级带宽共享和复用功能,支持同地域下所有弹性公网IP共享带宽,能够让绑定弹性公网IP的云服务器ECS、NAT网关、负载均衡同时共享带宽,并提供包括按带宽峰值、增强型95等多种计费模式。

收费,详情参见产品计费

NAT网关(NAT Gateway)

NAT网关可以提供网络地址转换服务。阿里云提供公网NAT网关和VPC NAT网关两款产品。公网NAT网关提供公网地址转换服务,VPC NAT网关提供私网地址转换服务,您可以根据业务需求灵活选择。

收费,详情参见产品计费

应用型负载均衡ALB

应用型负载均衡ALB(Application Load Balancer)是阿里云推出的专门面向HTTP、HTTPS和QUIC等应用层负载场景的负载均衡服务,具备超强弹性及大规模应用层流量处理能力。ALB具备处理复杂业务路由的能力,与云原生相关服务深度集成,是阿里云官方提供的云原生Ingress网关。

收费,详情参见产品计费

网络型负载均衡NLB

网络型负载均衡NLB(Network Load Balancer )是阿里云面向万物互联时代推出的新一代四层负载均衡,支持超高性能和自动弹性能力,单实例可以达到1亿并发连接,帮您轻松应对高并发业务。

收费,详情参见产品计费

专有网络VPC

专有网络VPC(Virtual Private Cloud)是您专有的云上私有网络。您可以完全掌控自己的专有网络,例如选择IP地址范围、配置路由表和网关等,您可以在自己定义的专有网络中使用阿里云资源,如云服务器、云数据库RDS和负载均衡等。

本身免费,详情参见产品计费

交换机vSwitch

交换机(vSwitch)是组成专有网络的基础网络模块,用来连接不同的云资源。成功创建交换机后,您可以在交换机中创建云资源、绑定自定义路由表或者绑定网络ACL。

免费,详情参见VPC产品计费

名词解释

名称

说明

共享服务账号

企业共享服务会部署在这个账号内,如网络的部署。推荐这个账号的费用由统一的某个团队来承担,比如基础设施团队。

DMZ

DMZ(全称Demilitarized Zone,或称Perimeter network,即“边界网络”、周边网络或“对外网络”)为一种网络架构的布置方案,常用的架设方案是在不信任的外部网络和可信任的内部网络外,创建一个面向外部网络的物理或逻辑子网,该子网能设置用于对外部网络的服务器主机。可以使用在防火墙、路由器等区隔内外网的网络设备。

方案实施

整体拓扑

图片 1.png

• 统一出口:在TR组网架构下,使用NAT网关在DMZ VPC统一云上公网出口,为不同业务设置不同的EIP出口方便流量统计管理

• 统一入口:DMZ VPC与后端业务VPC通过TR或PrivateLink打通,通过ALB/NLB跨VPC挂载能力保障后端业务VPC无需暴露在公网

• 带宽共享:使用共享带宽产品针对EIP进行统一管理和带宽共享

• 安全防护:使用DDoS防护、WAF防护、云防火墙组合来自Internet的入向访问流量,和云上VPC的访问Internet流量

方案

ALB

NAT网关

EIP

CEN-TR

共享带宽

DDoS防护

WAF

云防火墙

统一云上出口

/

必选

必选

必选

可选

/

/

必选

统一云上入口

必选

/

必选

必选

可选

必选

必选

可选

统一DMZ

必选

必选

必选

必选

可选

必选

必选

必选

前提条件

注册阿里云账号,并开通以上云产品

操作步骤

第一部分:出口设计

步骤一:创建公网NAT网关实例

1.登录NAT网关管理控制台

2.在公网NAT网关页面,单击创建NAT网关

3.首次使用NAT网关时,在创建公网NAT网关页面关联角色创建区域,单击创建关联角色。角色创建成功后即可创建NAT网关。

图片 1.png

关于NAT网关服务关联角色的更多信息,请参见服务关联角色

4.在创建公网NAT网关页面,配置以下购买信息,然后单击立即购买

配置

说明

付费模式

默认选择为按量付费,即一种先使用后付费的付费模式。更多信息,请参见公网NAT网关计费

所属地域

选择需要创建公网NAT网关的地域。

所属专有网络

选择公网NAT网关所属的VPC。创建后,不能修改公网NAT网关所属的VPC。

关联交换机

选择公网NAT网关实例所属的交换机。

计费类型

默认选择为按使用量计费,即按公网NAT网关实际使用量收费。更多信息,请参见公网NAT网关计费

计费周期

默认选择为按小时,即按使用量计费公网NAT网关的计费周期为1小时,不足1小时按1小时计算。

实例名称

设置公网NAT网关实例的名称。

实例名称长度为2~128个字符,以英文大小字母或中文开头,可包含数字、下划线(_)和短划线(-)。

访问模式

选择公网NAT网关的访问模式。支持以下两种模式:

o VPC全通模式(SNAT):选择了VPC全通模式,在公网NAT网关创建成功后当前VPC内所有实例即可通过该公网NAT网关访问公网。

选择VPC全通模式(SNAT)后,您需要配置弹性公网IP(Elastic IP Address,简称EIP)的相关信息。

o 稍后配置:如需稍后配置或有更多配置需求,可在购买完成后,前往控制台进行配置。

选择稍后配置,则只购买公网NAT网关实例。

本文选择稍后配置

5.在确认订单页面确认公网NAT网关的配置信息,选中服务协议并单击确认订单

当出现恭喜,购买成功!的提示后,说明您创建成功。

创建成功后,您可以在公网NAT网关页面查看网关类型为增强型的公网NAT网关。

图片 1.png

步骤二:绑定EIP

您可以将EIP绑定到公网NAT网关上。公网NAT网关绑定EIP后,可以使用EIP配置DNAT条目和SNAT条目。

1.登录NAT网关管理控制台

2.在公网NAT网关页面,找到步骤三创建的公网NAT网关实例,然后在操作列选择 > 绑定弹性公网IP

3.在绑定弹性公网IP对话框,配置以下参数,然后单击确定

  • 所在资源组:选择EIP所在的资源组。

  • 选择弹性公网IP:选择要绑定到公网NAT网关的EIP。

  • 从已有弹性公网IP中选择:在下拉列表中选择已有的EIP实例。

  • 新购弹性公网IP并绑定:系统将为您创建1个按使用流量计费的EIP实例,并绑定到公网NAT网关。

本文选择新购弹性公网IP并绑定

EIP绑定完成后,您可以在公网NAT网关页面查看绑定的EIP。

图片 1.png

步骤三:创建SNAT条目

公网NAT网关支持SNAT功能,为VPC中无公网IP的ECS实例提供访问互联网的代理服务。

1.登录NAT网关管理控制台

2.在公网NAT网关页面,找到步骤三创建的公网NAT网关实例,然后在操作列单击设置SNAT

3.在SNAT条目列表区域,单击创建SNAT条目

4.在创建SNAT条目页面,根据以下信息配置SNAT条目,然后单击确定创建

  • SNAT条目粒度:本文选择自定义CIDR,即通过云企业网打通的所有VPC下的ECS实例都可以通过配置的SNAT规则访问互联网。

  • 选择公网IP地址:选择用来提供互联网访问的EIP。本文选择使用单IP,然后在下拉列表选择绑定到公网NAT网关的EIP。

  • 条目名称:SNAT条目的名称。

名称长度为2~128个字符,以大小写字母或中文开头,可包含数字、下划线(_)和短划线(-)。

第二部分:入口设计

步骤一:创建ALB服务器组

创建IP类型的服务器组,并为该服务器添加远端IP。

1.登录应用型负载均衡ALB控制台

2.在左侧导航栏,选择应用型负载均衡ALB > 服务器组

3.在服务器组页面,单击创建服务器组,完成以下配置,然后单击创建

配置

说明

服务器组类型

选择服务器组类型。本文选择IP类型

服务器组名称

输入服务器组名称。长度为2~128个字符,必须以大小写字母或中文开头,可包含数字、半角句号(.)、下划线(_)和短划线(-)。

VPC

从VPC下拉列表中选择一个VPC。本文选择VPC1。

选择后端协议

选择一种后端协议。本文选择HTTP

选择调度算法

选择一种调度算法。本文使用默认值加权轮询

选择资源组

选择归属的资源组。

开启会话保持

开启或关闭会话保持。本文选择默认关闭。

配置健康检查

开启或关闭健康检查。本文选择默认开启。

高级配置

本文使用默认配置。更多信息,请参见管理服务器组

4.在服务器组页面,找到目标服务器组,然后在操作列单击编辑后端服务器

5.在后端服务器页签,单击添加IP

6.在添加后端服务器面板,输入ECS1的私网IP地址,并打开远端IP,然后单击下一步

7.设置添加的IP地址的端口和权重,然后单击确定。本文端口输入80,权重使用默认值。

步骤二:为ALB实例配置监听

1.登录应用型负载均衡ALB控制台

2.在顶部菜单栏,选择ALB的所属地域。本文选择西南1(成都)

3.在实例页面,找到已经在VPC1中创建好的ALB实例,在操作列单击创建监听

4.在配置监听配置向导,完成以下配置,然后单击下一步

监听配置

说明

选择负载均衡协议

选择监听的协议类型。本文选择HTTP

监听端口

输入用来接收请求并向后端服务器进行请求转发的监听端口,端口范围为1~65535。本文输入80。

监听名称

自定义监听的名称。

高级配置

本文使用默认配置。

5.在选择服务器组配置向导,在选择服务器组的下拉框选择IP类型,并选择步骤一创建的服务器组,然后单击下一步

6.在配置审核配置向导,确认配置信息,单击提交

步骤五:为DMZ VPC的系统路由表添加路由条目

检查DMZ VPC中的系统路由表是否已经有目标网段的路由指向转发路由器DMZ VPC连接,如果没有,则执行以下步骤添加路由条目。

1.登录专有网络管理控制台

2.在专有网络页面,单击DMZ VPC的实例ID。

3.在DMZ VPC详情页面,单击资源管理页签,在路由表下方单击数字链接。

4.在路由表页面,找到路由表类型系统的路由表并单击ID。

5.在路由表详情页面,选择路由条目列表 > 自定义路由条目页签,然后单击添加路由条目

6.在添加路由条目面板,配置以下参数,然后单击确定

参数

说明

名称

输入路由条目的名称。

目标网段

输入要转发到的目标网段。本文输入ECS1服务器的IP地址:192.168.7.54/24。

下一跳类型

选择下一跳的类型。本文选择转发路由器

转发路由器

选择具体的转发路由器实例。本文选择VPC1连接。

步骤六:配置回源路由

查看ALB实例的回源路由,并分别为VPC2的系统路由表和VPC1关联的转发路由器添加ALB的回源路由。

1.执行以下步骤,获取ALB实例的回源路由。

​i. 登录应用型负载均衡ALB控制台

​ii. 在顶部菜单栏,选择实例的所属地域。本文选择西南1(成都)

​iii. 在实例页面,单击在VPC1中已经创建好的ALB实例ID。

iv. 单击实例详情页签,然后在回源路由右侧单击查看

图片 1.png

2.执行以下步骤,为VPC2内的系统路由表添加ALB的回源路由。

​i. 登录专有网络管理控制台

​ii. 在专有网络页面,单击VPC2的实例ID。

​iii. 在VPC详情页面,单击资源管理页签,在路由表下方单击数字链接。

​iv. 在路由表页面,找到路由表类型系统的路由表,单击其ID。

​v. 在路由表详情页面,选择路由条目列表 > 自定义页签,然后单击添加自定义路由条目

​vi. 在添加路由条目面板,配置以下参数,然后单击确定

参数

说明

名称

输入路由条目的名称。

目标网段

输入要转发到的目标网段。本文输入ALB实例的回源路由。如果回源路由有多条,请重复配置操作,直到所有回源路由全部配置完。

本文为VPC2配置的路由条目为:

§ 100.XX.XX.0/25

§ 100.XX.XX.128/25

§ 100.XX.XX.64/26

§ 100.XX.XX.128/26

§ 100.XX.XX.192/26

§ 100.XX.XX.0/26

下一跳类型

选择下一跳的类型。本文选择转发路由器

转发路由器

选择具体的转发路由器实例。本文选择VPC2关联的转发路由器。

3.执行以下步骤,为VPC1关联的转发路由器添加ALB的回源路由。

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

​ii. 在云企业网实例页面,单击已创建的云企业网实例ID。

​iii. 在基本信息 > 转发路由器页签,找到连接VPC1的转发路由器实例,并单击该目标转发路由器实例ID。

​iv. 单击转发路由器路由表页签,在页签左侧区域,单击目标路由表ID,在路由表详情页面的路由条目页签下,单击创建路由条目

​v. 在添加路由条目对话框,配置路由条目信息,然后单击确定

配置项

说明

路由表

系统默认选择当前路由表。

所属转发路由器

系统默认选择当前转发路由器实例。

路由条目名称

路由条目名称。

长度为0~128个字符,可包含大小写字母、数字、中文、半角逗号(,)、半角句号(.)、半角分号(;)、正斜线(/)、at(@)、下划线(_)和短划线(-)。

目的地址CIDR

路由条目的目标网段。本文输入ALB实例的回源路由。如果回源路由有多条,请重复配置操作,直到所有回源路由全部配置完。

本文为VPC1关联的转发路由器配置的路由条目:

§ 100.XX.XX.0/25

§ 100.XX.XX.128/25

§ 100.XX.XX.64/26

§ 100.XX.XX.128/26

§ 100.XX.XX.192/26

§ 100.XX.XX.0/26

是否为黑洞路由

系统默认选择否。

下一跳连接

选择路由的下一跳连接。本文选择VPC1连接。

路由条目描述

路由条目的描述信息。

长度为2~256个字符,可包含大小写字母、数字、中文、半角逗号(,)、半角句号(.)、半角分号(;)、正斜线(/)、at(@)、下划线(_)和短划线(-)。

步骤七:检查后端ECS的安全组策略

跨VPC访问的报文会以回源路由网段内的IP地址作为源地址访问后端服务,请确保ECS的安全组策略可以放通此报文。更多信息,请参见添加安全组规则

第三部分:CEN TR路由设计

图片 1.png

步骤一:云企业网基础配置

具体配置可以参考:《使用云企业网实现同地域云上云下网络互通》

https://help.aliyun.com/document_detail/208591.html

步骤二:路由表配置

  • 使用企业版转发路由器多路由表功能:

  • 在不可信路由表针对没有经过防火墙的东西向流量通过私网路由引流至安全VPC

  • 在不可信路由表主动访问公网流量的流量通过默认路由指向DMZ VPC

  • 在不可信路由表同时配置ALB回源路由指向DMZ VPC

  • 在可信路由表针对经过防火墙处理后的东西向流量通过私网路由引流至对应的业务VPC

第四部分:云防火墙设计

防火墙开启后,如果您未配置任何访问控制策略或威胁引擎未开启拦截模式,您的业务流量将只经过云防火墙,云防火墙不会对业务流量进行拦截,因此不会对业务产生任何影响。您可以在防火墙开关页面,为您的资产开启或关闭防火墙开关。开启防火墙无需进行复杂的网络配置,开启后即可使用。

步骤一:操作步骤

1.登录云防火墙控制台

2.在左侧导航栏,选择防火墙开关 > 防火墙开关

3.在防火墙开关页面,开启防火墙开关。

说明 由于仅云防火墙企业版和旗舰版支持VPC边界防火墙,如果您开通的是云防火墙基础版(即免费版本)或高级版,您在防火墙开关页面将无法看到VPC边界防火墙页签。

您可以为资产开启互联网边界防火墙VPC边界防火墙

o 互联网边界防火墙

互联网边界防火墙页面,定位到需要开启互联网边界防火墙保护的资产,单击操作列的开启保护。如果您需要同时对多个资产执行开启或关闭防火墙保护的操作,可以在防火墙列表中选择多个目标资产,然后单击左下角的开启保护关闭保护

o VPC边界防火墙

VPC边界防火墙页面,定位到需要开启VPC边界防火墙保护的资产,单击操作列的开启保护。如果您需要同时对多个资产执行开启或关闭防火墙保护的操作,可以在防火墙列表中选择多个目标资产,然后单击左下角的开启保护关闭保护

您可通过筛选资产类型地域防火墙状态账号来搜索并查看指定资产的防火墙开启状态。

开启或关闭防火墙后,防火墙状态更新为保护中(表示防火墙的防护已生效)或未受保护(表示防火墙的防护已关闭)。防火墙状态更新可能需要数秒时间,请耐心等待。

步骤二:开启防火墙相关操作参考

· 开启攻击防护

· 配置访问控制策略

第五部分:DDoS高防和WAF

步骤一:联合部署DDoS高防和WAF提升防护能力

如果您的网络遭受的攻击既有流量型攻击,又混杂精巧的Web应用层攻击时,单一使用一种网络安全防护产品无法起到全面的防护效果,我们推荐您组合使用阿里云DDoS高防和Web应用防火墙(Web Application Firewall,简称 WAF)。本文介绍了为业务同时部署DDoS高防和WAF时的配置指导。

DDoS高防和WAF同时部署时采用以下网络架构:DDoS高防(入口层,防御DDoS攻击)->WAF(中间层,防御Web应用攻击)->负载均衡。网站业务流量会先经过DDoS高防清洗,然后转发到WAF过滤Web攻击,最后只有正常的业务流量被转发到源站服务器,保障网站的业务安全和数据安全。业务流量的转发过程如下图所示。

图片 1.png

说明 应用上述网络架构后,访问请求将经过多层中间代理才到达源站,源站不能直接获取请求的真实来源IP。如果您需要获取访问请求的真实来源IP,请参见配置DDoS高防后获取真实的请求来源IP

步骤二:网站业务接入WAF

1.登录Web应用防火墙控制台

2.在顶部菜单栏,选择Web应用防火墙实例的资源组和地域(中国内地非中国内地)。

3.在左侧导航栏,选择资产中心 > 网站接入

4.在域名列表页签,单击网站接入

5.添加域名。

接入模式:CNAME接入。

说明 进入添加域名页面后,接入模式默认为Cname接入。CNAME接入场景下,您无需再修改接入模式

a.单击手动接入页签,在填写网站信息模块按以下要求配置参数。

说明 CAME接入支持一键接入和手动接入两种方式,DDoS高防和WAF同时部署的场景下,推荐使用手动接入。

§ 域名:填写要防护的网站域名。

§ 防护资源:按实际情况选择要使用的防护资源类型。

§ 协议类型:按实际情况选择网站支持的协议类型。

§ 服务器地址:选择IP并填写源站服务器对应的SLB公网IP、ECS公网IP或云外机房服务器的IP。

§ 服务器端口:根据已选择的协议类型,按实际情况设置源站提供对应服务的端口。

§ 负载均衡算法:当设置了多个源站服务器地址时,按实际情况选择多源站服务器间的负载均衡算法。

§ WAF前是否有七层代理(高防/CDN等):选择

§ 启用流量标记:按实际情况设置是否启用WAF流量标记功能。

§ 资源组:当需要根据业务部门、项目等维度对云资源进行分组管理时,从资源组列表中选择该域名所属资源组。

b.单击下一步

c.返回域名列表,找到新添加的域名,在域名/CNAME列复制WAF为该域名分配的CNAME地址。

图片 1.png

o 接入模式:透明接入。

a.在添加域名页面,选择接入模式透明接入

b.在添加域名信息模块按以下要求配置参数。

§ 域名:填写要防护的网站域名。

§ ALB类型七层SLB类型四层SLB类型ECS类型:在标签页中选择待防护实例所属类型,勾选待防护实例对应的端口。

§ WAF前是否有七层代理(高防/CDN等):选择

§ 启用流量标记:按实际情况设置是否启用WAF流量标记功能。

§ 资源组:当需要根据业务部门、项目等维度对云资源进行分组管理时,从资源组列表中选择该域名所属资源组。

c.单击下一步

d.检查并确认配置后,单击下一步

e.单击完成,返回网站列表。

步骤三:网站业务接入DDoS高防

1.登录DDoS高防控制台

2.在顶部菜单栏左上角处,选择服务所在地域:

o 中国内地:选择该地域将跳转到DDoS高防(新BGP)控制台。

o 非中国内地:选择该地域将跳转到DDoS高防(国际)控制台。

您可以通过切换地域分别管理和配置DDoS高防(新BGP)和DDoS高防(国际)实例。在使用DDoS高防服务时,请确认您已选择正确的地域。

3.在左侧导航栏,选择接入管理 > 域名接入

4.在域名接入页面,单击添加网站

5.按照页面提示,完成添加网站配置向导。

o 在填写网站信息模块按以下要求配置参数。

§ 功能套餐:按实际情况选择要关联的DDoS高防实例的功能套餐。

§ 实例:按实际情况选择要关联的DDoS高防实例。

§ 网站:填写要防护的网站域名。

§ 协议类型:按实际情况选择网站支持的协议类型。

§ 启用OCSP:按实际情况选择是否启用OCSP(Online Certificate Status Protocol)功能。

§ 服务器地址

§ 域名在WAF上的接入模式为CNAME接入时,选择源站域名并填写步骤一中获取的WAF的CNAME地址。

§ 域名在WAF上的接入模式为透明接入时,选择源站IP并填写源站服务器的公网IP。

o 服务器端口:根据已选择的协议类型,设置源站提供对应服务的端口。

​ii. 单击添加

iii. 返回域名接入页面,找到新添加的域名,在域名列复制DDoS高防为该域名分配的CNAME地址。

图片 1.png

步骤四:修改域名的DNS解析

如果您的域名DNS托管在阿里云云解析DNS,请按照以下操作,将域名解析指向步骤二获取的DDoS高防CNAME地址。如果您使用其他DNS服务商的域名解析服务,请登录服务商系统修改网站域名的解析记录,下文内容仅供参考。

登录阿里云云解析DNS控制台

1.在域名解析页面,找到要操作的域名,在操作列下单击解析设置

2.在解析设置页面,找到要修改的解析记录,在操作列下单击修改

说明 如果要操作的解析记录不在记录列表中,您可以单击添加记录

3.在修改记录(或添加记录)页面,选择记录类型CNAME,并将记录值修改为域名对应的DDoS高防CNAME地址(即步骤二中获取到的DDoS高防CNAME地址)。

4.单击确认,等待修改后的解析设置生效。

5.使用浏览器测试网站访问是否正常。

6.如果网站访问出现异常,请参见业务接入高防后存在卡顿、延迟、访问不通等问题

代码示例

在使用CEN-TR基础组网已经完成的基础上进行搭建,示例代码在DMZ VPC中创建NAT、ALB等出入口资源并支持进行路由配置。

使用限制

  1. 由于TF支持原因,目前无法使用跨VPC挂载IP类型服务器组

  2. 由于API及TF支持原因,目前无法使用TF自动获取ALB回源路由,代码仅做配置示例

搭建方式

需要本地环境完成Terraform基础配置、支持阿里云资源创建,完成填写settings.tfvars参数配置后执行命令:

terraform init
terraform plan --var-file=settings.tfvars
terraform apply --var-file=settings.tfvars

Terraform要求

Name

Version

terraform

>= 1.1.7

alicloud provider

>= 1.160.0

main.tf

locals {
  shared_service_account_id = var.shared_service_account_id
  biz_vpc_1_account_id      = var.biz_vpc_1_account_id
  biz_vpc_2_account_id      = var.biz_vpc_2_account_id

  region                = var.region
  dmz_vpc_id            = var.dmz_vpc_id
  cen_attach_id_dmz_vpc = var.cen_attach_id_dmz_vpc
  transit_router_id     = var.transit_router_id

  biz_vpc_1_id            = var.biz_vpc_1_id
  biz_vpc_1_cidr          = var.biz_vpc_1_cidr
  cen_attach_id_biz_vpc_1 = var.cen_attach_id_biz_vpc_1

  biz_vpc_2_id            = var.biz_vpc_2_id
  cen_attach_id_biz_vpc_2 = var.cen_attach_id_biz_vpc_2


  nat_gateway_name             = var.nat_gateway_config.name
  vswitch_id_nat_gateway       = var.nat_gateway_config.vswitch_id
  snat_source_cidr_list        = var.nat_gateway_config.snat_source_cidr_list
  alb_instance_deploy_config   = var.alb_instance_deploy_config
  server_group_backend_servers = var.server_group_backend_servers

  alb_back_to_source_vpc_route_entry_config = [
  for routing in var.alb_back_to_source_route :
  {
    name                  = "dmz-alb-back-to-source"
    destination_cidrblock = routing
    nexthop_type          = "Attachment"
    nexthop_id            = local.cen_attach_id_biz_vpc_1
  }
  ]

  alb_back_to_source_transit_router_route_entry_config = [
  for routing in var.alb_back_to_source_route :
  {
    route_entry_dest_cidr     = routing
    route_entry_next_hop_type = "Attachment"
    route_entry_name          = "dmz-alb-back-to-source"
    route_entry_description   = "dmz-alb-back-to-source"
    route_entry_next_hop_id   = local.cen_attach_id_dmz_vpc
  }
  ]

}

provider "alicloud" {
  alias  = "shared_service_account"
  region = local.region
#  assume_role {
#    role_arn           = format("acs:ram::%s:role/ResourceDirectoryAccountAccessRole", local.shared_service_account_id)
#    session_name       = "AccountLandingZoneSetup"
#    session_expiration = 999
#  }
}

provider "alicloud" {
  alias  = "biz_vpc_1_account"
  region = local.region
#  assume_role {
#    role_arn           = format("acs:ram::%s:role/ResourceDirectoryAccountAccessRole", local.biz_vpc_1_account_id)
#    session_name       = "AccountLandingZoneSetup"
#    session_expiration = 999
#  }
}

provider "alicloud" {
  alias  = "biz_vpc_2_account"
  region = local.region
#  assume_role {
#    role_arn           = format("acs:ram::%s:role/ResourceDirectoryAccountAccessRole", local.biz_vpc_2_account_id)
#    session_name       = "AccountLandingZoneSetup"
#    session_expiration = 999
#  }
}

# unified egress deployment
module "dmz_egress_eip" {
  source    = "../../../terraform-modules/terraform-alicloud-landing-zone-eip"
  providers = {
    alicloud = alicloud.shared_service_account
  }

  eip_config                                    = [
    {
      payment_type     = "PayAsYouGo"
      eip_address_name = "eip-dmz"
      period           = null
      tags             = {
        "Environment" = "shared"
        "Department"  = "ops"
      }
    }
  ]
  create_common_bandwidth_package               = true
  common_bandwidth_package_bandwidth            = 5
  common_bandwidth_package_internet_charge_type = "PayByBandwidth"
}

module "dmz_egress_nat_gateway" {
  source                  = "../../../terraform-modules/terraform-alicloud-landing-zone-nat-gateway"
  providers               = {
    alicloud = alicloud.shared_service_account
  }
  vpc_id                  = local.dmz_vpc_id
  name                    = local.nat_gateway_name
  vswitch_id              = local.vswitch_id_nat_gateway
  association_eip_id_list = module.dmz_egress_eip.eip_id_list

  snat_source_cidr_list = local.snat_source_cidr_list
  snat_ip_list          = module.dmz_egress_eip.eip_address_list
}

module "dmz_egress_biz_vpc_route" {
  source             = "../../../terraform-modules/terraform-alicloud-landing-zone-vpc-custom-route"
  providers          = {
    alicloud = alicloud.biz_vpc_2_account
  }
  vpc_id             = local.biz_vpc_2_id
  create_route_table = false
  route_entry_config = [
    {
      name                  = "dmz-egress"
      destination_cidrblock = "0.0.0.0/0"
      nexthop_type          = "Attachment"
      nexthop_id            = local.cen_attach_id_biz_vpc_2
    }
  ]
}

module "dmz_egress_tr_route" {
  source    = "../../../terraform-modules/terraform-alicloud-landing-zone-cen-custom-route"
  providers = {
    alicloud = alicloud.shared_service_account
  }

  create_route_table                = false
  transit_router_id                 = local.transit_router_id
  transit_router_route_entry_config = [
    {
      route_entry_dest_cidr     = "0.0.0.0/0"
      route_entry_next_hop_type = "Attachment"
      route_entry_name          = "default-to-dmz"
      route_entry_description   = "default-to-dmz"
      route_entry_next_hop_id   = local.cen_attach_id_dmz_vpc
    }
  ]
}


# unified ingress deployment
module "dmz_ingress_alb" {
  source                       = "../../../terraform-modules/terraform-alicloud-landing-zone-alb"
  providers                    = {
    alicloud = alicloud.shared_service_account
  }
  vpc_id                       = local.dmz_vpc_id
  alb_instance_deploy_config   = local.alb_instance_deploy_config
  server_group_backend_servers = local.server_group_backend_servers
}

module "dmz_ingress_dmz_vpc_route" {
  source             = "../../../terraform-modules/terraform-alicloud-landing-zone-vpc-custom-route"
  providers          = {
    alicloud = alicloud.shared_service_account
  }
  vpc_id             = local.dmz_vpc_id
  create_route_table = false
  route_entry_config = [
    {
      name                  = "to-biz-vpc1"
      destination_cidrblock = local.biz_vpc_1_cidr
      nexthop_type          = "Attachment"
      nexthop_id            = local.cen_attach_id_dmz_vpc
    }
  ]
}


module "dmz_ingress_biz_vpc_route" {
  source             = "../../../terraform-modules/terraform-alicloud-landing-zone-vpc-custom-route"
  providers          = {
    alicloud = alicloud.shared_service_account
  }
  vpc_id             = local.biz_vpc_1_id
  create_route_table = false
  route_entry_config = local.alb_back_to_source_vpc_route_entry_config
}


module "dmz_ingress_tr_route" {
  source    = "../../../terraform-modules/terraform-alicloud-landing-zone-cen-custom-route"
  providers = {
    alicloud = alicloud.shared_service_account
  }

  create_route_table                = false
  transit_router_id                 = local.transit_router_id
  transit_router_route_entry_config = local.alb_back_to_source_transit_router_route_entry_config
}
output "egress_eip_id" {
  value = module.dmz_egress_eip.eip_id_list
}

output "egress_eip_ip_address" {
  value = module.dmz_egress_eip.eip_address_list
}

output "egress_nat_gateway_id" {
  value = module.dmz_egress_nat_gateway.nat_gateway_id
}

settings.tfvars

shared_service_account_id = "1140931609457592"
biz_vpc_1_account_id = "1140931609457592"
biz_vpc_2_account_id = "1140931609457592"

region                    = "cn-shanghai"
dmz_vpc_id                = "vpc-uf64jvvvabr84damwjp9q"

nat_gateway_config = {
  name                  = "nat-gateway-dmz-egress"
  vswitch_id            = "vsw-uf6hsm7zaupj72bekrctf"
  snat_source_cidr_list = ["172.16.10.0/24"]
}

transit_router_id     = "tr-uf6vpyd9yp4lyeu70n3yw"
cen_attach_id_dmz_vpc = "tr-attach-79nkaodj9a1qhblksf"

biz_vpc_1_id            = "vpc-uf6ws6nb77jl1xp0fb4ow"
cen_attach_id_biz_vpc_1 = "tr-attach-5ava0vopch6uomfype"
biz_vpc_1_cidr          = "172.16.0.0/24"

biz_vpc_2_id            = "vpc-uf6l1gunod4fltxgjuwkj"
cen_attach_id_biz_vpc_2 = "tr-attach-0d2r8rdctys8mq7o2m"


alb_instance_deploy_config = {
  load_balancer_name = "alb-dmz-ingress"
  zone_1_id          = "cn-shanghai-f"
  vswitch_1_id       = "vsw-uf6hsm7zaupj72bekrctf"

  zone_2_id    = "cn-shanghai-g"
  vswitch_2_id = "vsw-uf6xwi8lz10wc60kb5mzd"
}

# TF不支持,目前无法使用跨VPC挂载IP类型服务器组功能
#server_group_backend_servers = [
#  {
#    server_type = "Ip"
#    server_id   = "i-uf6ambutcn90srdw6kw1"
#    server_ip   = "172.16.10.50"
#    description = "backend-server1"
#    weight      = 100
#    port        = 80
#  }
#]

# 应该是ALB创建完成后自动查询回源并自动配置,不需要该配置项。但TF不支持查询,这里仅用于示例测试
alb_back_to_source_route = [
  "100.121.111.192/26", "100.121.112.0/26", "100.121.112.64/26", "100.121.113.128/26", "100.117.147.128/26",
  "100.117.147.192/26", "100.117.147.64/26", "100.121.111.128/26"
]

variables.tf

variable "shared_service_account_id" {
  type = string
}

variable "biz_vpc_1_account_id" {
  type = string
}

variable "biz_vpc_2_account_id" {
  type = string
}

variable "region" {
  type    = string
  default = "cn-shanghai"
}

variable "dmz_vpc_id" {
  description = "VPC ID of the DMZ VPC."
  type        = string
}

variable "nat_gateway_config" {
  description = "VPC ID of the DMZ VPC."
  type        = object({
    name                  = string
    vswitch_id            = string
    snat_source_cidr_list = list(string)
  })
}

variable "transit_router_id" {
  description = "Transit router ID."
}

variable "cen_attach_id_dmz_vpc" {
  description = "Attachment ID of the DMZ VPC."
  type        = string
}

variable "biz_vpc_1_id" {
  description = "ID of the business VPC1."
  type        = string
}

variable "biz_vpc_1_cidr" {
  description = "CIDR of the business VPC1."
  type        = string
}

variable "cen_attach_id_biz_vpc_1" {
  description = "Attachment ID of VPC1."
  type        = string
}

variable "biz_vpc_2_id" {
  description = "ID of the business VPC2."
  type        = string
}

variable "cen_attach_id_biz_vpc_2" {
  description = "Attachment ID of VPC2."
  type        = string
}


variable "alb_instance_deploy_config" {
  type = object({
    load_balancer_name = string

    zone_1_id    = string
    vswitch_1_id = string

    zone_2_id    = string
    vswitch_2_id = string
  })
}

variable "server_group_backend_servers" {
  type = list(object({
    server_type = string
    server_id   = string
    server_ip   = string
    description = string
    weight      = number
    port        = number
  }))

  default = []
}

variable "alb_back_to_source_route" {
  description = "ALB back to source routing."
  type        = list(string)
  default     = []
}

versions.tf

terraform {
  required_providers {
    alicloud = {
      source = "aliyun/alicloud"
      version = "1.160.0"
    }

    local = {
      source = "hashicorp/local"
      version = "2.1.0"
    }
  }
  required_version = ">=0.12"
}

获取最新版完整版代码,请到https://github.com/aliyun/alibabacloud-landing-zone/tree/finance-solution/solution/networking/build-dmz

方案验证

1.测试出口访问

测试ECS实例是否可以访问互联网。登录ECS。具体操作,请参见ECS连接方式概述

如下图所示,执行ping命令测试网络连通性。经测试,ECS可以访问互联网。

图片 1.png

执行curl myip.ipip.net命令探测ECS的公网出口IP。

经测试,ECS01公网出口IP与公网NAT网关实例中SNAT条目中的IP一致,即ECS01通过公网NAT网关的SNAT功能主动访问互联网。

图片 1.png

2.测试入口访问

执行wget http://DNS名称命令,测试本地是否能通过ALB访问业务VPC内的ECS。您可以通过ALB实例详情页面查看ALB实例的DNS域名。

本文执行以下命令。wget https://www.XXXX.com

如果能接收到回复报文,表示连接成功。

图片 1.png

常见问题

1.VPC内新建交换机下的ECS实例无法通过SNAT访问公网,而该VPC内其他交换机下的ECS实例可以通过SNAT访问公网

NAT网关中的SNAT条目中不包含新建的交换机的网段。NAT网关不会为新建的交换机配置SNAT条目,您需要检查新建的交换机的网段是否已经包含在NAT网关已有SNAT条目中。如果未包含,则该交换机下的ECS实例无法访问公网。请您手动配置SNAT条目,具体操作,请参见创建公网NAT网关SNAT条目实现访问公网服务

新建的交换机绑定了自定义路由表,但自定义路由表中没有目标网段为0.0.0.0/0,下一跳为NAT网关的自定义路由条目。请确认自定义路由表中是否有上述路由条目,如果没有,请手动进行添加,具体操作,请参见添加路由表中的路由条目

2.VPC内存在多个NAT网关时,某个交换机下的ECS实例不能访问公网

  • 如果该VPC内只使用系统路由表,且只有一条目标网段为0.0.0.0/0,下一跳指向其中一个NAT网关的自定义路由条目。当VPC内某个交换机的网段不在该NAT网关的SNAT条目中,则该交换机下的ECS实例不能访问公网。

  • 如果无需使用多个NAT网关,建议您删除不需要使用的NAT网关,并为保留的NAT网关增加SNAT条目配置。

  • 如果需要使用多个NAT网关,请参见同VPC内多NAT网关部署方案

3.ALB请求响应为500、502、503、504状态码的解释及可能原因是什么?

500(Internal Server Error)

后端服务内部错误,后端服务遇到意外情况,无法执行请求。

可能原因:ALB后端服务或应用出现问题,请根据后端服务和应用的日志排查问题。

502(Bad Gateway)

HTTP或HTTPS监听接收到客户端连接请求后,ALB由于无法正常将请求转发至后端服务或无法从后端服务收到响应,则会收到客户端HTTP 502 Bad Gateway状态码。

可能原因:

  • ALB后端服务或应用直接返回502状态码,请排查后端服务或应用的日志,确定返回502状态码的原因。

  • ALB与后端服务之间TCP通信异常,请排查后端服务或应用的状态是否正常、服务端口是否正常被监听、Backlog队列是否有丢包现象等。

  • 健康检查异常,请排查ALB实例对应服务器组的健康检查状态,健康检查配置的状态码与后端服务返回的状态码是否一致。

  • ALB后端服务没有及时完成请求处理,请排查后端服务或应用的日志,并查看对应后端服务或应用的CPU、内存等占用率。

503(Service Temporarily Unavailable)

暂时无法使用服务。

可能原因:

  • 监听没有配置后端服务器,或者用户配置的后端服务器的权重为0。

  • ALB流量超出规格,出现限速。

504(Gateway Time-out)

后端服务响应超时。

可能原因:

  • 后端服务直接返回504状态码,请排查后端服务的负载情况。

  • 后端服务负载增大,响应请求的时间大于配置的响应超时时间。例如配置的响应超时时间是60秒,如果响应时间超过60秒,则ALB返回504。您可以从访问日志查看对应时间段的延时情况。

4.转发路由器使用限制

在您使用转发路由器产品前,请先了解产品限制,详情参见使用限制

5.VPC使用限制

使用专有网络VPC(Virtual Private Cloud)前,请了解VPC的相关使用限制及提升配额方式。详情参见限制与配额VPC支持的地域信息

6.NAT网关使用限制

NAT网关在产品功能和服务性能上的限制,以及如何申请更高配额,详情参见使用限制

7.ALB使用限制

应用型负载均衡ALB(Application Load Balancer)包含基础版和标准版,两个版本的使用限制不同,详情参见使用限制