nftables虽无内置安全区域概念,但可通过IP网段分组、INPUT/FORWARD链规则顺序及命名集合,精准实现firewalld式区域隔离,如业务网段放行指定端口、管理网段严格限源限端、办公网段仅允DNS/代理、公网默认丢弃。

nftables 本身没有“安全区域”这个内置概念,不像 firewalld 那样有 trusted、public、dmz 等预设 zone。但你可以用规则逻辑和链策略,模拟出等效的区域隔离效果——关键不是叫什么名字,而是让不同网段的流量按需处理、互不越界。
明确区域边界:先定义业务网段与非业务网段
所谓“区域”,本质是 IP 地址范围的分组。你需要提前确认:
-
业务子网(如
10.20.30.0/24、192.168.100.0/24):允许访问服务端口(SSH、HTTP、API 等) -
管理子网(如
192.168.10.0/24):仅允许特定端口(如 22、9000)且限源 IP -
办公/访客子网(如
172.16.0.0/16):默认禁止访问后端服务,仅放行 DNS 或 HTTP 代理 - 公网接口或未知来源:一律默认阻断,不响应
这些不是标签,而是你在规则里反复引用的 ip saddr 或 iifname 条件。
构建 INPUT 链的区域化处理流程
INPUT 链是入站主控点,按“从具体到兜底”顺序组织规则,相当于区域准入流水线:
- 允许回环通信(所有区域都需)
- 允许已建立连接(保障 SSH 不中断)
- 按源网段 + 端口组合,逐个放行业务请求
- 最后设 policy drop,让未匹配流量静默丢弃
示例命令(精简版):
# 创建表与链,INPUT 默认 DROP
nft add table ip filter
nft add chain ip filter input { type filter hook input priority 0 \; policy drop \; }
# 回环、状态跟踪
nft add rule ip filter input iifname "lo" accept
nft add rule ip filter input ct state established,related accept
# 业务子网(全端口或指定端口)
nft add rule ip filter input ip saddr 10.20.30.0/24 tcp dport {22, 80, 443, 8080} accept
# 管理子网(严格限 IP + 端口)
nft add rule ip filter input ip saddr 192.168.10.5 tcp dport 22 accept
# 办公网段(只放 DNS 和 HTTP 代理)
nft add rule ip filter input ip saddr 172.16.0.0/16 udp dport 53 accept
nft add rule ip filter input ip saddr 172.16.0.0/16 tcp dport 3128 accept⚠️ 注意:规则顺序很重要。一旦某条规则匹配并
accept,后续规则不再检查。所以宽泛规则(如ip saddr 0.0.0.0/0)绝不能放在业务规则前面。
实现跨网段转发隔离(FORWARD 链)
如果这台机器还充当网关或桥接设备(比如 VLAN 间路由),必须在 FORWARD 链做二层/三层隔离:
- 明确禁止 A 子网访问 B 子网(如 IT 访问 OT)
- 只允许特定方向的出口(如业务网段可上网,管理网段不可)
- NAT 规则(POSTROUTING)只对允许上网的子网生效
示例:
# 禁止 vlan20(办公)→ vlan10(工控) nft add rule ip filter forward iifname "vlan20" oifname "vlan10" drop # 允许 vlan10 上网(通过 eth1 出口) nft add rule ip filter forward iifname "vlan10" oifname "eth1" accept nft add rule ip filter forward iifname "eth1" oifname "vlan10" ct state established,related accept # SNAT 仅对 vlan10 生效 nft add rule ip nat postrouting oifname "eth1" ip saddr 10.10.10.0/24 masquerade
进阶:用命名集合简化多网段管理
当业务网段不止一个(比如 5 个数据中心子网),硬编码每条规则易出错。改用 ipset 类型的命名集合更清晰:
# 创建集合
nft add set ip filter biznets { type ipv4_addr\; }
# 添加成员
nft add element ip filter biznets { 10.20.30.0/24, 192.168.100.0/24, 172.20.0.0/16 }
# 用集合匹配(一条规则覆盖全部)
nft add rule ip filter input ip saddr @biznets tcp dport {80, 443} accept这样增删网段只需操作集合,不用动规则逻辑,也避免重复写 ip saddr。
验证是否真隔离了
- 从非业务 IP 尝试 telnet 目标端口:应超时(不是 connection refused)
- 查看计数器:加
counter到 drop 规则,再nft list chain ip filter input -a看命中次数 - 检查规则顺序:
nft list ruleset确认 policy drop 在最后,且无 ACCEPT 规则漏掉关键限制
不复杂但容易忽略

















