nftables通过命名集合、ip saddr匹配、服务端口分组和连接状态控制实现多租户服务级网络隔离:一、用interval标志集合管理租户网段与端口;二、按租户+服务组合精确放行/拒绝;三、差异化限速与连接数管控;四、日志审计驱动策略闭环。

多租户环境下,服务级网络访问限制的核心是“按租户区分流量 + 按服务定义策略 + 避免规则爆炸”。nftables 本身不内置租户概念,但可通过 命名集合(named sets)+ ip saddr 匹配 + 服务端口分组 + 连接状态控制 四层组合,实现轻量、可维护、可审计的服务级隔离。
一、用命名集合标识租户与服务边界
不靠IP硬编码,而是把租户网段和服务端口抽象为动态集合,便于统一管理与灰度更新:
- 创建租户地址集:
nft add set inet filter tenant-a { type ipv4_addr\; flags interval\; },然后添加:nft add element inet filter tenant-a { 10.20.1.0/24, 172.16.5.10-172.16.5.20 } - 定义服务端口集:
nft add set inet filter api-service { type inet_service\; },加入:nft add element inet filter api-service { 3000, 3001, 8080 } - 关键点:使用
interval标志支持 CIDR 和 IP 范围;inet_service类型原生兼容 IPv4/IPv6 端口,避免重复写 tcp/udp
二、按租户+服务组合放行,拒绝越权访问
每条规则对应一个租户对某类服务的明确授权,杜绝“全租户共用一套端口白名单”的风险:
- 只允许 tenant-a 访问其专属 API 端口:
nft add rule inet filter input ip saddr @tenant-a tcp dport @api-service ct state new accept - 禁止 tenant-a 访问其他租户数据库端口:
nft add rule inet filter input ip saddr @tenant-a tcp dport { 5432, 6379 } drop - 对未匹配任何租户的公网流量,默认丢弃(需确保 INPUT 链 policy 为 drop)
三、服务级限速与连接数管控
同一租户内不同服务敏感度不同,需差异化限流——比如管理接口比数据查询接口更严:
- 对 tenant-a 的后台管理端口(9000)限速:
nft add rule inet filter input ip saddr @tenant-a tcp dport 9000 limit rate 5/minute burst 10 counter drop - 限制 tenant-a 每个源 IP 最多建立 20 个新连接到其 API 端口:
nft add rule inet filter input ip saddr @tenant-a tcp dport @api-service tcp flags & (fin | syn | rst | ack) == syn ct state new limit rate 20/minute burst 40 counter drop - 注意:burst 值设为 rate 的 2 倍,兼顾突发合法请求与防扫描
四、自动审计与策略收敛闭环
租户服务变更频繁,靠人工同步易出错。建议加一条日志规则捕获“非白名单访问尝试”,用于驱动策略优化:
nft add rule inet filter input ip saddr @tenant-a tcp dport != @api-service log prefix "TENANT_A_UNAUTHORIZED: " counter drop- 配合 systemd-journal 或 rsyslog 抓取
TENANT_A_UNAUTHORIZED日志,定期分析是否需新增端口或调整租户网段 - 运维脚本可定时执行
nft list set inet filter tenant-a与 CMDB 对比,自动告警漂移 IP











