配置安全组实现NLB基于监听/端口粒度的访问控制

为了提高云上流量入口安全性,如果您需要对NLB进行基于协议/端口/IP的访问控制,可以通过为NLB实例配置安全组来实现。与传统负载均衡CLB使用的ACL组不同,NLB通过安全组能力可实现更细粒度的访问控制,可以在整个实例上实现基于协议/端口的访问控制。本文为您介绍NLB实例如何通过安全组实现基于监听/端口粒度的访问控制。

场景说明

  • NLB实例未加入安全组时,NLB监听端口默认对所有请求放通。

  • 当NLB实例加入安全组且未设置任何拒绝策略时,NLB监听端口默认对所有请求放通。如果您需要只允许特定IP访问NLB,请注意添加一条拒绝策略进行兜底。

当您的NLB实例有访问控制的诉求,希望控制NLB实例的入流量时,您可以选择为NLB实例添加安全组,同时可基于业务设置相应的安全组规则。

重要

负载均衡的出方向流量为用户请求的回包,为了保证您的业务正常运行,NLB的安全组对出流量不做限制,您无需额外配置安全组出方向规则。

本文从以下三种操作来说明NLB实例加入安全组后对协议/端口的访问控制,且以NLB实例配置TCP 80监听和TCP 81监听为例说明。

编号

安全组规则

预期结果

相关操作链接

操作一:NLB实例未加入安全组

NLB监听端口默认对所有请求放行。

此处仅以NLB实例配置TCP 80监听和TCP 81监听为例说明。

  • 允许客户端访问NLB实例的TCP 80监听

  • 允许客户端访问NLB实例的TCP 81监听

步骤二:创建NLB实例并配置监听

操作二:NLB实例加入安全组

拒绝访问TCP协议的81端口

说明

此处仅列出与本文强相关的安全组规则,其余默认规则未列出。

  • 允许客户端访问NLB实例的TCP 80监听

  • 拒绝客户端访问NLB实例的TCP 81监听

步骤四:NLB实例加入安全组并验证结果

操作三:修改NLB实例加入的安全组

  • 拒绝访问TCP协议的80端口

  • 拒绝访问TCP协议的81端口

说明

此处仅列出与本文强相关的安全组规则,其余默认规则未列出。

  • 拒绝客户端访问NLB实例的TCP 80监听

  • 拒绝客户端访问NLB实例的TCP 81监听

步骤五:修改安全组并验证结果

使用限制

分类

安全组类型

说明

NLB支持加入的安全组

  • 普通安全组

  • 企业安全组

  • 要求安全组为专有网络类型,且安全组和NLB实例属于同一个专有网络VPC(Virtual Private Cloud)。

  • 一个NLB实例最多支持加入4个安全组,且同一个NLB实例加入的安全组类型需保持一致,即不支持同时加入普通安全组和企业安全组。

    某个NLB实例已加入普通安全组时,如果需要加入企业安全组,可解绑当前NLB实例的所有普通安全组后再行操作,反之亦然。

  • 2022年09月30日前创建的NLB公测实例不支持加入安全组,如需使用安全组功能请更换或新购NLB实例。

关于普通安全组和企业安全组的介绍,请参见普通安全组与企业级安全组

NLB不支持加入的安全组

托管安全组

关于托管安全组的介绍,请参见托管安全组

前提条件

  • 您已创建专有网络VPC1,具体操作,请参见创建和管理专有网络

  • 您已在VPC1中创建了2台ECS实例。ECS01和ECS02实例作为NLB实例的后端服务器,且ECS01和ECS02实例中部署了应用服务。

    • 关于创建ECS实例,请参见自定义购买实例

    • 本文ECS01和ECS02部署测试应用示例如下:

      ECS01服务部署命令

      yum install -y nginx
      systemctl start nginx.service
      cd /usr/share/nginx/html/
      echo "Hello World ! This is ECS01." > index.html
      

      ECS02服务部署命令

      yum install -y nginx
      systemctl start nginx.service
      cd /usr/share/nginx/html/
      echo "Hello World ! This is ECS02." > index.html
      
  • 您已注册域名并完成备案,且通过自有域名为NLB配置CNAME解析

步骤一:创建服务器组

  1. 登录网络型负载均衡NLB控制台
  2. 在顶部菜单栏,选择服务器组所属的地域。本文选择华东1(杭州)

  3. 在左侧导航栏,选择网络型负载均衡 NLB > 服务器组

  4. 服务器组页面,单击创建服务器组

  5. 创建服务器组对话框中,完成以下配置,然后单击创建

    此处仅列出与本文强相关的配置项,其余部分参数可保持默认值。更多信息,请参见创建服务器组

    配置

    说明

    服务器组类型

    选择一种服务器组类型。本文选择服务器类型

    服务器组名称

    输入服务器组名称。本文输入RS01

    VPC

    从VPC下拉列表中选择一个VPC。本文选择已创建的VPC1。

    选择后端协议

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

    选择调度算法

    选择一种调度算法。本文选择加权轮询

  6. 服务器组创建成功对话框中单击添加后端服务器

  7. 后端服务器页签单击添加后端服务器

  8. 添加后端服务器面板,选择已创建的ECS01和ECS02实例,然后单击下一步

  9. 为已添加的服务器设置端口和权重,然后单击确定

步骤二:创建NLB实例并配置监听

  1. 登录网络型负载均衡NLB控制台
  2. 在顶部菜单栏,选择NLB实例所属的地域。本文选择华东1(杭州)

  3. 实例页面,单击创建网络型负载均衡

  4. 网络型负载均衡(按量付费)购买页面,完成以下配置。

    此处仅列出和本文强相关的配置项。其余参数的配置,请参见创建实例

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

    • 实例网络类型:本文选择私网

    • VPC:本文选择已创建的VPC1。

  5. 单击立即购买,然后根据控制台提示完成实例购买。

  6. 返回实例页面,找到已创建的NLB实例,单击该NLB实例ID。

  7. 单击监听页签,在监听页签单击快速创建监听。在快速创建监听对话框中,配置以下参数,完成TCP 80监听的创建,然后单击确定

    监听配置

    说明

    选择负载均衡协议

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

    监听端口

    输入监听端口,本文输入80

    转发的后端服务器组

    选择服务器类型服务器类型下的服务器组。

    本文选择步骤一:创建服务器组创建的服务器组RS01。

  8. 监听页签单击快速创建监听。在快速创建监听对话框中,配置以下参数,完成TCP 81监听的创建,然后单击确定

    监听配置

    说明

    选择负载均衡协议

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

    监听端口

    输入监听端口,本文输入81

    转发的后端服务器组

    选择服务器类型服务器类型下的后端服务器组。

    本文选择步骤一:创建服务器组创建的服务器组RS01。

  9. NLB实例未加入安全组时,验证访问结果。

    1. 登录任意一台可以访问公网的Linux客户端。如果未安装telnet,以CentOS系统为例可以参考执行yum install -y telnet安装telnet。

    2. 执行telnet 域名 80命令,测试客户端是否可以访问NLB实例TCP协议的80端口。

      收到如下所示的回复报文,则表示访问成功。

      Trying *.*.*.*...
      Connected to www.example.com.
      Escape character is '^]'.

      通过浏览器输入域名和端口号,例如http://域名:80,可以看到类似下图所示,表示NLB可以将请求转发至后端服务器。p800715.png

    3. 执行telnet 域名 81命令,测试客户端是否可以访问NLB实例TCP协议的81端口。

      Trying *.*.*.*...
      Connected to www.example.com.
      Escape character is '^]'.

      通过浏览器输入域名和端口号,例如http://域名:81,可以看到类似下图所示,表示NLB可以将请求转发至后端服务器。

      p801011.png

    4. 验证结果显示,NLB实例未加入安全组时,客户端可正常访问NLB实例TCP监听的80端口和81端口

步骤三:创建安全组

NLB实例加入安全组前,您需要先至ECS管理控制台创建安全组。

  1. 登录ECS管理控制台

  2. 在左侧导航栏,选择网络与安全 > 安全组

  3. 在顶部菜单栏,选择安全组所属的地域。本文选择华东1(杭州)

  4. 安全组页面,单击创建安全组

  5. 创建安全组页面,设置安全组的基本信息参数。

    此处仅列出和本文强相关的配置项,其余参数的配置请参见创建安全组

    • 网络:本文选择已创建的专有网络VPC1。

    • 安全组类型:本文选择普通安全组

  6. 创建安全组安全组页面,设置安全组的访问规则参数。

    1. 入方向单击手动添加

    2. 配置新增的安全组规则。

      名称

      描述

      授权策略

      选择拒绝

      优先级

      优先级保持默认值1

      协议类型

      协议类型选择自定义TCP

      端口范围

      输入端口号81

      授权对象

      选择0.0.0.0/0

      描述

      输入安全组规则描述信息。

  7. 单击创建安全组

步骤四:NLB实例加入安全组并验证结果

NLB实例加入步骤三:创建安全组创建的安全组,并验证安全组规则对NLB实例的访问控制是否生效。

  1. 登录网络型负载均衡NLB控制台
  2. 在顶部菜单栏,选择NLB实例所属的地域。本文选择华东1(杭州)

  3. NLB实例页面,找到步骤二:创建NLB实例并配置监听创建的NLB实例,单击实例ID。在实例详情页签,单击安全组页签。

  4. 安全组页签,单击添加安全组,在弹出的NLB实例加入安全组对话框中,选择步骤三:创建安全组创建的安全组,然后单击确定

  5. 在左侧列表框单击目标安全组ID,可单击入方向出方向页签分别查看安全组规则。

    此处仅列出与本文强相关的安全组入方向规则。此时NLB实例加入的安全组规则如下:

    授权策略

    优先级

    协议类型

    端口范围

    授权对象

    允许

    1

    自定义TCP

    目的:80/80

    源:0.0.0.0/0

    拒绝

    1

    自定义TCP

    目的:81/81

    源:0.0.0.0/0

  6. NLB实例加入安全组后,测试访问结果。

    1. 登录任意一台可以访问公网的Linux客户端。

    2. 执行telnet 域名 80命令,测试客户端是否可以访问NLB实例TCP监听的80端口。

      收到如下所示的回复报文,则表示访问成功。

      Trying *.*.*.*...
      Connected to www.example.com.
      Escape character is '^]'.

      通过浏览器输入域名和端口号,例如http://域名:80,可以看到类似下图所示,表示NLB可以将请求转发至后端服务器。

      p800715.png

    3. 执行telnet 域名 81命令,测试客户端是否能访问NLB实例TCP协议的81端口。

      收到如下所示的回复报文,则表示客户端无法访问NLB实例TCP监听的81端口,NLB实例加入的安全组对NLB实例的访问控制已生效。

      Trying *.*.*.*...
      telnet: connect to address *.*.*.*: Connection timed out
      Trying *.*.*.*...
      telnet: connect to address *.*.*.*: Connection timed out

      通过浏览器输入域名和端口号,例如http://域名:81,可以看到无法访问网页,则表示客户端无法访问NLB实例TCP监听的81端口,NLB实例加入的安全组对NLB实例的访问控制已生效。

步骤五:修改安全组并验证结果

修改安全组规则,并验证修改后的安全组规则对NLB实例的访问控制是否生效。

  1. 返回NLB实例页面,找到步骤二:创建NLB实例并配置监听创建的NLB实例,单击实例ID。在实例详情页签,单击安全组页签。

  2. 基本信息区域单击安全组ID,或在安全组页签右上角单击前往ECS控制台编辑,进入安全组规则页面修改安全组规则。

  3. 安全组规则页面,找到允许访问TCP协议80端口的规则,在操作列单击编辑,修改授权策略拒绝

    此处仅列出与本文强相关的安全组规则。修改后的安全组规则如下:

    授权策略

    优先级

    协议类型

    端口范围

    授权对象

    拒绝

    1

    自定义TCP

    目的:80/80

    源:0.0.0.0/0

    拒绝

    1

    自定义TCP

    目的:81/81

    源:0.0.0.0/0

  4. 修改NLB实例加入的安全组规则后,测试访问结果。

    1. 登录任意一台可以访问公网的Linux客户端。

    2. 执行telnet 域名 80命令,测试客户端是否能访问NLB实例TCP协议的80端口。

      收到如下所示的回复报文,则表示客户端无法访问NLB实例TCP监听的80端口,修改后的安全组规则对NLB实例的访问控制已生效。

      Trying *.*.*.*...
      telnet: connect to address *.*.*.*: Connection timed out
      Trying *.*.*.*...
      telnet: connect to address *.*.*.*: Connection timed out

      通过浏览器输入域名和端口号,例如http://域名:80,可以看到无法访问网页,则表示客户端无法访问NLB实例TCP监听的80端口,NLB实例加入的安全组对NLB实例的访问控制已生效。

    3. 执行telnet 域名 81命令,测试客户端是否能访问NLB实例TCP协议的81端口。

      收到如下所示的回复报文,则表示客户端无法访问NLB实例TCP监听的81端口,修改后的安全组规则对NLB实例的访问控制已生效。

      Trying *.*.*.*...
      telnet: connect to address *.*.*.*: Connection timed out
      Trying *.*.*.*...
      telnet: connect to address *.*.*.*: Connection timed out

      通过浏览器输入域名和端口号,例如http://域名:81,可以看到无法访问网页,则表示客户端无法访问NLB实例TCP监听的81端口,NLB实例加入的安全组对NLB实例的访问控制已生效。

相关文档