nftables实现多租户网络隔离的核心是将租户身份(网段、接口、标记)与策略显式绑定:一、按租户网段分组构建input/forward白名单链;二、用meta mark标记流量统一管控转发;三、结合netns实现协议栈级隔离;四、对外nat按租户分离源地址。

nftables 实现多租户网络隔离,核心不是堆砌规则,而是把租户身份(如网段、接口、标记)与策略显式绑定,形成可追溯、易维护的流量控制逻辑。关键在于避免规则混杂导致误放行或漏隔离,同时确保 IP 转发已开启、相关接口处于 UP 状态。
按租户网段分组,构建 INPUT/FORWARD 白名单链
将不同租户映射为明确的 IP 地址范围,是隔离的基础。例如:
- 租户 A:10.10.1.0/24(业务系统)→ 允许访问 80、443、8080
- 租户 B:10.10.2.0/24(管理终端)→ 仅允许 22(SSH)、9000(运维平台)且限源 IP
- 租户 C:172.16.5.0/24(访客接入)→ 只放行 UDP 53(DNS)和 TCP 3128(代理)
- 公网或未知来源 → 默认 DROP,不响应 ICMP
在 input 链中按“从具体到兜底”顺序写规则,确保匹配优先级清晰:
nft add rule ip filter input ip saddr 10.10.1.0/24 tcp dport {80, 443, 8080} acceptnft add rule ip filter input ip saddr 10.10.2.10 tcp dport 22 accept
nft add rule ip filter input ip saddr 172.16.5.0/24 udp dport 53 accept
nft add rule ip filter input policy drop
用 meta mark 标记租户流量,统一管控转发行为
当租户间需差异化互通(如只允许 API 调用但禁止 SSH),靠源 IP 匹配不够灵活。推荐在入口处打标记,后续规则基于标记决策:
- 对进入 eth0.10 的包打上 0x100(租户 A):nft add rule inet filter forward iifname "eth0.10" meta mark set 0x100
- 对进入 eth0.20 的包打上 0x200(租户 B):nft add rule inet filter forward iifname "eth0.20" meta mark set 0x200
- 禁止租户 A 主动访问租户 B:nft add rule inet filter forward meta mark 0x100 oifname "eth0.20" drop
- 允许租户 B 回应租户 A 的已建立连接:nft add rule inet filter forward meta mark 0x200 ct state established,related accept
这种标记方式便于与 VRF 或策略路由联动,也利于日志归因和监控聚合。
结合 netns 实现协议栈级隔离(适合容器/微服务场景)
若租户以进程或容器形式运行,网络命名空间(netns)提供最彻底的隔离:每个租户拥有独立回环、路由表、iptables/nftables 上下文。
- 创建租户专属 netns:ip netns add tenant-a
- 配对 veth 接口并挂入:ip link add veth-a type veth peer name veth-a-br; ip link set veth-a netns tenant-a
- 在 tenant-a 内配置 nftables:ip netns exec tenant-a nft add table ip filter
- 宿主机侧通过桥接或路由连通,防火墙策略只作用于 veth-br 接口,天然隔离
该方式无需跨租户 FORWARD 规则,也不依赖全局标记,适合高安全要求或动态扩缩容场景。
对外 NAT 与租户出口分离
多个租户共用一个公网出口时,必须区分源地址做 SNAT/MASQUERADE,否则返回包无法正确路由:
- 租户 A 出向流量伪装为固定公网 IP:nft add rule ip nat postrouting ip saddr 10.10.1.0/24 oifname "ens3" snat to 203.0.113.10
- 租户 B 使用另一公网 IP:nft add rule ip nat postrouting ip saddr 10.10.2.0/24 oifname "ens3" snat to 203.0.113.11
- 若使用动态地址,可用 masquerade,但务必限定 saddr,防止其他网段误走此路径
配合 conntrack 模块启用,确保连接状态同步准确,避免会话中断。











