使用 Network Firewall 基于地理位置过滤流量

Olawale Olaleye
难度
200 - 中级
时间
30 分钟
前提条件

海外区域: 注册 / 登录 亚马逊云科技

上次更新时间
2024 年 12 月 6 日
相关产品

AWS Network Firewall 是一项托管型服务。使用 AWS Network Firewall,你可以轻松在你的 VPC 中部署必要的网络防护。本文将介绍 Network Firewall 的一项新功能——Geographic IP Filtering,即根据地理区域过滤 IP 地址的功能。利用该功能,你可以基于地理位置过滤流量,以满足合规性要求。

面向互联网的应用程序需要强大的安全防护功能来持续防范安全威胁。其中,包括基于安全风险考虑,限制运行在 Amazon Web Services (AWS) 上的工作负载与特定地理区域的客户端进行通信。对于银行、公共部门或保险等受严格监管行业的企业来说,他们可能有特定的安全要求,而 Geographic IP Filtering 功能正好可以满足这些要求。

在 Geographic IP Filtering 功能发布之前,这些客户不得不依赖第三方工具获取特定国家/地区的 IP 地址列表,并定期更新防火墙规则以满足相关要求。现在有了 Network Firewall 提供的 Geographic IP Filtering 功能,你可以根据 IP 地址所属的地理区域来过滤 IP 地址,从而保护应用程序工作负载。当互联网号码分配局 (IANA) 分配新的 IP 地址时,Network Firewall 底层的地理区域 IP 数据库会自动更新,确保 Network Firewall 服务能够持续根据国家/地区代码过滤入站和出站流量。该功能同时支持 IPv4 和 IPv6 流量。

在 Network Firewall 中启用 Geographic IP Filtering 功能

你可以使用 Network Firewall 监测网络流量,通过第 3–7 层规则(OSI 模型中的网络层到应用层)来保护你的 VPC。当流量到达 Network Firewall 时,系统会通过地理区域 IP 数据库识别源 IP 和目标 IP 地址所属区域。如果你设置了阻止该区域流量的防火墙规则,相应流量就会被拦截。你可以对来自或流向特定国家/地区的流量进行以下操作:放行、丢弃、拒绝或创建告警。

在配置地理区域 IP 过滤规则之前,你需要先部署 Network Firewall 防火墙并绑定防火墙策略。要了解部署 Network Firewall 防火墙的具体操作步骤,请参阅 Network Firewall 入门指南。只需花几分钟时间,即可通过 AWS 管理控制台、AWS Command Line Interface (AWS CLI)、AWS SDK 或 Network Firewall API 配置 Network Firewall 地理区域 IP 过滤规则。

在 AWS 管理控制台配置地理区域 IP 过滤规则的步骤如下:

  1. 登录 AWS 管理控制台,打开 Amazon VPC 控制台。
  2. 在导航栏中,展开 Network Firewall(网络防火墙),选择 Network Firewall rule groups(网络防火墙规则组)。
  3. 点击 Create rule group(创建规则组)。
  4. 在 Create rule group page(创建规则组页面)的 Rule group type(规则组类型)下,选择 Stateful rule group(有状态规则组)。
  5. 在 Rule group format(规则组格式)字段,选择 Standard stateful rule(标准有状态规则)。
  6. 在 Rule evaluation order(规则评估顺序)字段,选择 Strict order (recommended) or Action order (严格顺序(推荐)或操作顺序)。
  7. 为这个有状态规则组设置一个名称。
  8. 在 Capacity(容量)字段中,输入这个有状态规则组的最大允许容量。
  9. 在 Standard stateful rules(标准有状态规则)部分的 Geographic IP Filtering(地理区域 IP 过滤)字段下,选择 Disable Geographic IP filtering(禁用地理区域 IP 过滤)、Match only selected countries(仅匹配所选国家/地区)或 Match all but selected countries(匹配除所选项外的所有国家/地区)。
  10. 如果启用 Geographic IP Filtering,则需要选择流量方向和需要过滤的国家/地区代码。
  11. 为以下字段设置正确的值:Protocol(协议)、Source(源)、Source port(源端口)、Destination(目标)和 Destination port(目标端口)。
  12. 在 Action(操作)字段中,选择当收到的数据包匹配规则条件时 Network Firewall 需要执行的操作。

图 1:标准有状态规则示例

 13. 点击 Add rule(添加规则),检查规则内容后确认创建规则组。

图 2:地理区域 IP 过滤规则示例

创建 Suricata 兼容的规则

你还可以使用 geoip 关键字,配置 Suricata 兼容的规则字符串来进行地理区域 IP 过滤。

创建 Suricata 兼容的规则字符串的步骤如下:

  1. 执行之前介绍的步骤 1 至步骤 4 操作。
  2. 在 Rule group format(规则组格式)字段,选择 Suricata compatible rule string(Suricata 兼容的规则字符串)。
  3. 在 Rule evaluation order(规则评估顺序)字段,选择 Strict order (recommended) or Action order (严格顺序(推荐)或操作顺序)。
  4. 为这个有状态规则组设置一个名称。
  5. 在 Capacity(容量)字段中,输入这个有状态规则组的最大允许容量。
  6. 在 Suricata compatible rule string(Suricata 兼容的规则字符串)部分,根据源 IP 地址和目标 IP 地址,以及需要过滤的国家/地区代码,输入相应的规则字符串。设置地理区域 IP 过滤规则时,需要指定 geoip 关键字、过滤器类型,以及你想要过滤的国家/地区代码。
  7. Suricata 支持对源 IP 和目标 IP 进行过滤。可以使用 dst 或 src 来单独过滤其中一种类型。可以使用 both 或 any 通过 AND 或 OR 逻辑同时过滤这两种类型。

下面这个 Suricata 规则字符串示例展示了如何设置丢弃来自日本的流量的过滤规则:

drop ip any any -> any any (msg:"Geographic IP from JP,Japan"; geoip:src,JP; sid:55555555; rev:1;)

注意:Suricata 使用 MaxMind GeoIP 数据库来判断请求的来源地。据 MaxMind 报告,其数据在国家级别的准确性很高,但具体准确度会随国家/地区和 IP 类型等因素变化。要了解更多关于 MaxMind 的信息,请访问 MaxMind IP Geolocation。

如果你发现任何地理区域 IP 数据有误,可以通过 MaxMind Correct GeoIP Data 提交更正申请。

地理区域 IP 过滤日志记录

可以为防火墙的有状态引擎配置 Network Firewall 日志记录,以获取数据包的详细信息以及根据有状态规则对数据包执行的操作。启用 Geographic IP Filtering 功能后,现有的日志记录和监控机制保持不变。不过,如果在 Suricata 规则字符串中明确指定了 msg 和 metadata 关键字,你就可以在告警日志中查看到对应的地理位置信息,这对问题排查很有帮助。如果未在 Suricata 规则字符串中指定这些关键字,则日志事件中不会包含任何地理位置信息。

Suricata 规则示例

本小节中将提供几个 Suricata 规则字符串示例,展示如何设置Suricata 规则字符串以放行、拦截、拒绝来自或流向特定国家/地区的流量,或触发告警。

示例 1:放行来自特定国家/地区的入站流量

以下示例将展示如何放行来自印度的入站流量。

注意:在此示例中,如果想要生成告警日志,规则评估顺序必须设置为 Strict。如果将规则评估顺序设置为 Action,那么虽然流量会被放行,但不会生成告警日志。

alert ip $EXTERNAL_NET any -> $HOME_NET any (msg:"Ingress traffic from IN allowed"; flow:to_server; geoip:src,IN; metadata:geo IN; sid:202409301;)
pass ip $EXTERNAL_NET any -> $HOME_NET any (msg:"Ingress traffic from IN allowed"; flow:to_server; geoip:src,IN; metadata:geo IN; sid:202409302;)

以下是示例 1 中生成的告警日志和流量日志。

告警日志:

{
    "firewall_name": "Test-NFW",
    "availability_zone": "eu-north-1a",
    "event_timestamp": "1731102856",
    "event": {
        "src_ip": "13.127.20.X",
        "src_port": 56630,
        "event_type": "alert",
        "alert": {
            "severity": 3,
            "signature_id": 202409301,
            "rev": 0,
            "metadata": {
                "geo": ["IN"]
            },
            "signature": "Ingress traffic from IN allowed",
            "action": "allowed",
            "category": ""
        },
        "flow_id": 234143298308779,
        "dest_ip": "172.31.2.4",
        "proto": "TCP",
        "verdict": {
            "action": "pass"
        },
        "dest_port": 80,
        "pkt_src": "geneve encapsulation",
        "timestamp": "2024-11-08T21:54:16.972019+0000",
        "direction": "to_server"
    }
}

源端到目标端的流量日志:

{
    "firewall_name": "Test-NFW",
    "availability_zone": "eu-north-1a",
    "event_timestamp": "1731102918",
    "event": {
        "tcp": {
            "tcp_flags": "13",
            "syn": true,
            "fin": true,
            "ack": true
        },
        "app_proto": "unknown",
        "src_ip": "13.127.20.X",
        "src_port": 56630,
        "netflow": {
            "pkts": 4,
            "bytes": 216,
            "start": "2024-11-08T21:54:16.972019+0000",
            "end": "2024-11-08T21:54:17.263030+0000",
            "age": 1,
            "min_ttl": 112,
            "max_ttl": 112
        },
        "event_type": "netflow",
        "flow_id": 234143298308779,
        "dest_ip": "172.31.2.4",
        "proto": "TCP",
        "dest_port": 80,
        "timestamp": "2024-11-08T21:55:18.257416+0000"
    }
}

目标端到源端的流量日志:

{
    "firewall_name": "Test-NFW",
    "availability_zone": "eu-north-1a",
    "event_timestamp": "1731102918",
    "event": {
        "tcp": {
            "tcp_flags": "13",
            "syn": true,
            "fin": true,
            "ack": true
        },
        "app_proto": "unknown",
        "src_ip": "172.31.2.4",
        "src_port": 80,
        "netflow": {
            "pkts": 2,
            "bytes": 112,
            "start": "2024-11-08T21:54:16.972019+0000",
            "end": "2024-11-08T21:54:17.263030+0000",
            "age": 1,
            "min_ttl": 126,
            "max_ttl": 126
        },
        "event_type": "netflow",
        "flow_id": 234143298308779,
        "dest_ip": "13.127.20.X",
        "proto": "TCP",
        "dest_port": 56630,
        "timestamp": "2024-11-08T21:55:18.257449+0000"
    }
}

示例 2:拦截来自特定国家/地区的入站流量

以下示例展示如何拦截来自日本的入站流量。

drop ip $EXTERNAL_NET any -> $HOME_NET any (msg:"Ingress traffic from JP blocked"; flow:to_server; geoip:any,JP; metadata:geo JP; sid:202409303;)

示例 3:拦截来自特定国家/地区的入站 SSH 流量

以下示例展示如何拦截来自俄罗斯的入站 SSH 流量。

drop ssh $EXTERNAL_NET any -> $HOME_NET any (msg:"Ingress SSH traffic from RU blocked"; flow:to_server; geoip:src,RU; metadata:geo RU; sid:202409304;)

示例 4:拒绝流向特定国家/地区的出站 TCP 流量:

以下示例展示如何拒绝流向伊朗的出站 TCP 流量。

reject tcp $HOME_NET any -> $EXTERNAL_NET any (msg:"Egress traffic to IR rejected"; flow:to_server; geoip:dst,IR; metadata:geo IR; sid:202409305;)

示例 5:针对来自或流向特定国家/地区的流量发出告警

以下示例展示如何针对来自委内瑞拉的流量设置告警。

alert ip any any -> any any (msg:"Geographic IP is from VE, Venezuela"; geoip:any,VE; sid: 202409306;)

总结

你现在可以使用 AWS Network Firewall 的 Geographic IP Filtering 新功能,根据地理区域的控制流量,从而加强安全防护。本文介绍了 Network Firewall Geographic IP Filtering 功能的关键概念、配置步骤和具体示例。借助这项功能,企业可以有效防范潜在的恶意流量,并精确控制允许哪些地理区域的客户端与其基础设施进行通信。在网络威胁持续演进的今天,基于地理区域的 IP 地址过滤功能是增强网络安全的有力工具。

更多教程

快速搭建容量高达 35GB 的免费个人网盘

本教程将介绍如何搭建一个没有使用限制的免费私人网盘。

构建企业专属智能客服机器人

本文将演示如何结合多种服务,打造企业专属的智能客服。

使用生成式 AI 构建多语言问答知识库

使用多种服务,构建可汇总搜索结果的多语言知识库。

查看全部教程 >>

免费套餐

AWS 海外区域

拓展海外业务或个人体验
免费使用 100 余种云产品或服务, 长达 12 个月

AWS 中国区域

发展中国业务
免费使用 40 余种核心云服务产品,长达 12 个月