默认策略设为DROP是核心,先创建inet表和INPUT链并设policy drop,再按顺序放行lo、established/related连接及业务子网,确保非业务流量静默丢弃。

直接将非业务子网的请求“天生隔离”到 DROP,并不是 nftables 的标准表述,但实际目标很明确:对指定范围外的所有入站流量,默认丢弃,且不给任何回应。这本质上就是设置 INPUT 链的默认策略为 DROP,再显式放行仅属于业务子网的流量。
明确业务子网并设默认策略为 DROP
这是最核心一步。nftables 不像 firewalld 那样有预设“区域”,它靠链的默认策略兜底。必须先确保 INPUT 链默认丢弃,否则所有未匹配规则的包都会被放行(默认 ACCEPT 是危险的)。
- 创建或确认使用
inet地址簇的表(同时兼容 IPv4/IPv6),例如:nft add table inet filter - 在该表中添加基链 INPUT,指定类型、挂钩点、优先级,并设默认策略为 drop:
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; } - 这条命令执行后,“未被任何后续规则允许”的所有入站包,都会被静默丢弃 —— 这就是你要的“天生隔离”效果
只放行业务子网的入站连接
在默认 DROP 的前提下,用具体规则白名单式放行。注意顺序:规则从上到下匹配,第一条匹配即执行,不再继续。
- 允许回环接口(
lo):防止本地服务调用中断,nft add rule inet filter input iifname "lo" accept - 允许已建立或相关连接(保障 SSH 会话等不被切断):
nft add rule inet filter input ct state established,related accept - 放行业务子网,例如
10.20.30.0/24:nft add rule inet filter input ip saddr 10.20.30.0/24 accept - 如需支持 IPv6 业务子网,同样添加:
nft add rule inet filter input ip6 saddr 2001:db8:1::/64 accept
验证与固化配置
规则生效后必须检查是否符合预期,且要确保重启后不丢失。
- 查看当前规则:执行
nft list ruleset,确认 INPUT 链首几条是 lo、ct state、业务子网,末尾 policy 是 drop - 测试连通性:从业务子网内能通,从非业务 IP(如办公网段、公网测试机)尝试 telnet 或 curl,应表现为超时(而非 connection refused)
- 保存配置:RHEL/CentOS 系统通常写入
/etc/sysconfig/nftables.conf;Debian/Ubuntu 建议用nft list ruleset > /etc/nftables.conf并启用服务:systemctl enable --now nftables
整个逻辑就是“默认关死,只开一条缝”。只要业务子网定义准确、规则加载顺序无误、默认策略设置到位,非业务子网的请求就自然落在 DROP 的兜底行为里,无需额外标记或跳转区域。

















