如何解决当规则未按预期运行时 Network Firewall 的问题?

3 分钟阅读
0

我想解决当规则未按预期运行时 AWS Network Firewall 的问题。

概述

以下情况可能导致 Network Firewall 规则无法按预期运行:

  • 流量不是通过防火墙对称路由的。
  • Network Firewall 规则的配置不正确。

**注意:**在解决 Network Firewall 问题之前,请确认以下配置:

  • 防火墙端点部署在专用子网和路由表中。防火墙子网不得有任何工作负载资源。
  • 路由表通过防火墙端点路由流量。查看 Amazon CloudWatch 指标 ReceivedPackets,以验证 Network Firewall 是否已收到数据包。如果 ReceivedPackets 指标的值为零,请验证路由表是否有指向防火墙端点的正确路由。

解决方法

**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

流量不是通过防火墙对称路由的

对于集中式 Network Firewall 部署模型,请为检查虚拟私有云(VPC)的中转网关连接启用设备模式

运行下列 AWS CLI 命令来检查是否已启用设备模式:

aws ec2 describe-transit-gateway-vpc-attachments --filters Name=transit-gateway-attachment-id,Values=tgw-attach-example

运行下列 AWS CLI 命令来启用设备模式:

aws ec2 modify-transit-gateway-vpc-attachment --transit-gateway-attachment-id tgw-attach-example --options ApplianceModeSupport="enable"

**注意:**在前面的示例命令中,请将 tgw-attach-example 替换为检查 VPC 的中转网关连接。

在公有子网中部署防火墙端点时,互联网网关的入口路由表必须通过防火墙端点路由到私有子网。私有子网的路由表还需要将互联网流量路由到同一个防火墙端点。有关详细信息,请参阅带有互联网网关的简单单区域架构

对于多可用区防火墙部署设置,互联网网关的入口路由表必须通过相同的防火墙端点将流量路由到私有子网。路由表还必须与私有子网位于同一个可用区中。有关详细信息,请参阅带互联网网关的多区域架构

Network Firewall 规则配置不正确

Network Firewall 规则的问题可能是由于您配置规则的方式导致的。

无状态规则

为了使流量双向流动,您必须对入口和出口规则应用无状态规则。如果在传入流量的入口应用规则,则响应流量的出口也必须应用规则。如果在响应流量的出口应用规则,则传入流量的入口也必须应用规则。此规则配置类似于访问控制列表(ACL)。

下面的示例说明了如何使用无状态规则来允许传入 SSH 流量。

优先级协议目标源端口范围目标端口范围操作
1TCP0.0.0.0/010.1.0.0/160:6553522通过
2TCP10.1.0.0/160.0.0.0/0220:65535通过

 

**注意:**在前面的示例中,传入 SSH 流量是从任何 IP 地址通过 CIDR 10.1.0.0/16 路由的。

数据包的无状态默认操作

请查看完整数据包和分段数据包的无状态默认操作。默认操作设置决定了防火墙无状态引擎在单个数据包与无状态规则不匹配时如何处理这些数据包。请将分段数据包的无状态默认操作仅应用于使用 UDP 传输协议的 IPv4 数据包分段。

**注意:**IPv6 协议不支持网络中的分段。如果主机发送的数据包大于接收主机的 MTU,则接收主机会丢弃该数据包。路径上的设备还会丢弃大于设备的 MTU 的数据包。

有状态规则

要让有状态规则引擎检查流量,无状态规则引擎必须将两个流量流方向转发到有状态规则组。

Network Firewall 规则必须引用私有 IP 地址

如果私有子网或工作负载同时具有公有 IP 地址和私有 IP 地址,则 Network Firewall 规则必须引用私有 IP 地址。

规则组变量

有状态 Network Firewall 规则组使用变量 HOME_NET 来定义防火墙检查的范围。如果没有明确指定 HOME_NET 变量,则该变量默认为部署 Network Firewall 的 VPC CIDR 范围。在此默认设置中,Network Firewall 检查来自 VPC 内来源的流量。

部署集中式 Network Firewall 时,规则组的 HOME_NET 变量必须包含您的远程 VPC。或者必须包含您的流量源自的源 CIDR。有关详细信息,请参阅 AWS Network Firewall 中的有状态域列表规则组

如果只检查来自某些私有子网而不是整个 VPC 的流量,HOME_NET 变量必须仅包含源子网 CIDR。在下面的示例中,HOME_NET 变量包含源子网 CIDR:

"RuleVariables": {
        "IPSets": {
           "HOME_NET": {
             "Definition": [
               "10.0.0.0/16",
               "10.1.0.0/16",
               "192.168.2.0/24"
             ]
           }
        }
    }

您可以使用 DescribeRuleGroup API 来检查有状态规则组详细信息。如果 RuleVariables 对象不在响应中,则防火墙规则组使用默认设置。HOME_NET 的默认设置设置为 Network Firewall VPC CIDR。

规则评估顺序

使用 TCP 的应用程序需要在发送应用程序请求之前成功进行三向握手。防火墙在连接中看到的第一个数据包是来自源的 TCP SYN。如果冲突的规则阻止了较低级别的 TCP 数据包,则三向握手失败,并导致应用程序超时。

例如,为了检测主机名,域列表规则组在 HTTP 请求中使用 Host 标头。它还在 TLS 握手中使用服务器名称指示(SNI)扩展。如需进行 HTTP 请求和 TLS 协商,必须先完成端口 80(HTTP)和 443(HTTPS)上的初始三向 TCP 握手。

使用同时涉及应用程序和传输层的规则时,请确保允许应用程序所需的 TCP 端口上的流量。查看规则评估顺序,验证前面的规则是否与流量匹配。

使用默认操作顺序,请确保其他规则在评估期间不会阻止流量。在规则中使用 flow 关键字,避免在识别更高级别的应用程序协议之前与较低级别的协议数据包进行匹配。

规则配置示例

TCP 流量的规则配置不正确

在下面的示例中,规则配置不正确,无法阻止所有出站 TCP 连接,只能向 example.com 发出 HTTP 请求。由于所有 TCP 流量都被丢弃,因此源客户端无法发送 HTTP 应用程序请求。

pass http $HOME_NET any -> $EXTERNAL_NET 80 (http.host; dotprefix; content:"example.com"; endswith; msg:"Allowed HTTP domain"; sid:172191; rev:1;) drop tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"Drop outbound TCP traffic"; sid:172192; rev:1;)

TCP 连接的配置正确

在下面的示例中,丢弃已建立的 TCP:80 规则首先建立 TCP 连接。然后,会丢弃所有与 HTTP 主机名 example.com 不匹配的数据包。

drop tcp $HOME_NET any -> $EXTERNAL_NET 80 (msg:"Drop established TCP:80"; flow: from_client,established; sid:172190; rev:1;)
pass http $HOME_NET any -> $EXTERNAL_NET 80 (http.host; dotprefix; content:"example.com"; endswith; msg:"Allowed HTTP domain"; priority:10; sid:172191; rev:1;)
drop tcp $HOME_NET any -> $EXTERNAL_NET !80 (msg:"Drop outbound non TCP:80 traffic"; sid:172192; rev:1;)

**注意:**默认操作顺序自动允许与任何定义的规则不匹配的数据包。

使用严格的评估顺序,规则组按优先级顺序,从最小的数字开始进行评估。每个规则组中的规则都按照定义的顺序进行处理。确保规则和手动优先级顺序的配置正确。不要将优先级较低的规则与网络流量相匹配。此外,根据您在严格的防火墙策略中选择的默认操作编写规则。

配置不正确导致超时

在下面的示例中,默认情况下,在防火墙检测到 HTTP 应用程序级别请求之前,指定的配置会丢弃所有 TCP 流量。此配置会导致意外超时。

Default Action: Drop all
Rule: pass http $HOME_NET any -> $EXTERNAL_NET 80 (http.host; dotprefix; content:"example.com"; endswith; msg:"Allowed HTTP domain"; sid:172191; rev:1;)

允许 TCP 三向握手的正确配置

在下面的示例中,Network Firewall 允许建立 TCP 三向握手,仅允许域 example.com 的 HTTP 流量。

Default Action: Drop established
Rule: pass http $HOME_NET any -> $EXTERNAL_NET 80 (http.host; dotprefix; content:"example.com"; endswith; msg:"Allowed HTTP domain"; sid:172191; rev:1;)

有关更多防火墙规则示例,请参阅 Network Firewall 的有状态规则示例


相关信息

AWS Network Firewall 的部署模型

在 AWS Network Firewall 中定义规则操作

来自部署 VPC 外部的流量的域列表检查

有状态规则组的评估顺序

AWS 官方
AWS 官方已更新 1 年前