2.9. 使用 nftables 来限制连接数量
您可以使用 nftables
来限制连接数或限制到建立给定数量连接的块 IP 地址,以防止它们使用太多的系统资源。
2.9.1. 使用 nftables 限制连接的数量
通过使用 nft
工具的 ct count
参数,您可以限制每个 IP 地址同时连接的数量。例如,您可以使用此功能配置每个源 IP 地址只能建立到主机的两个并行 SSH 连接。
流程
创建具有
inet
地址系列的filter
表:# nft add table inet filter
将
input
链添加到inet filter
表中:# nft add chain inet filter input { type filter hook input priority 0 \; }
为 IPv4 地址创建动态集合:
# nft add set inet filter limit-ssh { type ipv4_addr\; flags dynamic \;}
向
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
验证
- 从同一 IP 地址建立到主机的两个以上的新的同时的 SSH 连接。如果已经建立了两个连接,nftables 拒绝到 SSH 端口的连接。
显示
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 连接的主机。
流程
创建具有
ip
地址系列的filter
表:# nft add table ip filter
在
filter
表中添加input
链:# nft add chain ip filter input { type filter hook input priority 0 \; }
在
filter
表中添加名为denylist
的集合:# nft add set ip filter denylist { type ipv4_addr \; flags dynamic, timeout \; timeout 5m \; }
这个命令为 IPv4 地址创建动态设置。
timeout 5m
参数定义了nftables
在五分钟后自动删除条目,以防止集合被陈旧的条目填满。添加一条规则,该规则会将在一分钟内试图建立十多个新 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
其他资源