搜索

2.9. 使用 nftables 来限制连接数量

download PDF

您可以使用 nftables 来限制连接数或限制到建立给定数量连接的块 IP 地址,以防止它们使用太多的系统资源。

2.9.1. 使用 nftables 限制连接的数量

通过使用 nft 工具的 ct count 参数,您可以限制每个 IP 地址同时连接的数量。例如,您可以使用此功能配置每个源 IP 地址只能建立到主机的两个并行 SSH 连接。

流程

  1. 创建具有 inet 地址系列的 filter 表:

    # nft add table inet filter
  2. input 链添加到 inet filter 表中:

    # nft add chain inet filter input { type filter hook input priority 0 \; }
  3. 为 IPv4 地址创建动态集合:

    # nft add set inet filter limit-ssh { type ipv4_addr\; flags dynamic \;}
  4. input 链中添加一条规则,该规则只允许从 IPv4 地址到 SSH 端口(22)的两个同时的进入连接,并拒绝来自同一 IP 的所有未来的连接:

    # nft add rule inet filter input tcp dport ssh ct state new add @limit-ssh { ip saddr ct count over 2 } counter reject

验证

  1. 从同一 IP 地址建立到主机的两个以上的新的同时的 SSH 连接。如果已经建立了两个连接,nftables 拒绝到 SSH 端口的连接。
  2. 显示 limit-ssh 仪表:

    # nft list set inet filter limit-ssh
    table inet filter {
      set limit-ssh {
        type ipv4_addr
        size 65535
        flags dynamic
        elements = { 192.0.2.1 ct count over 2 , 192.0.2.2 ct count over 2 }
      }
    }

    elements 条目显示当前与该规则匹配的地址。在本例中,elements 列出了与 SSH 端口有活动连接的 IP 地址。请注意,输出不会显示活跃连接的数量,或者连接是否被拒绝。

2.9.2. 在一分钟内尝试超过十个进入的 TCP 连接的 IP 地址

您可以临时阻止在一分钟内建立十个 IPv4 TCP 连接的主机。

流程

  1. 创建具有 ip 地址系列的 filter 表:

    # nft add table ip filter
  2. filter 表中添加 input 链:

    # nft add chain ip filter input { type filter hook input priority 0 \; }
  3. filter 表中添加名为 denylist 的集合:

    # nft add set ip filter denylist { type ipv4_addr \; flags dynamic, timeout \; timeout 5m \; }

    这个命令为 IPv4 地址创建动态设置。timeout 5m 参数定义了 nftables 在五分钟后自动删除条目,以防止集合被陈旧的条目填满。

  4. 添加一条规则,该规则会将在一分钟内试图建立十多个新 TCP 连接的主机的源 IP 地址添加到 denylist 集合中:

    # nft add rule ip filter input ip protocol tcp ct state new, untracked add @denylist { ip saddr limit rate over 10/minute } drop
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.