NFTables 是 iptables 的现代替代方案,语法更简洁、规则组织更灵活;其核心策略是默认 drop 实现静默拦截,仅显式放行必要服务并限制来源,对冗余端口添加 drop 规则,脚本应模块化、可维护。

NFTables 是 iptables 的现代替代方案,语法更简洁、规则组织更灵活。编写防火墙脚本时,核心目标是:默认拒绝、显式放行必要服务、对未匹配流量静默丢弃(不发 RST/ICMP),尤其针对扫描或探测类连接。
基础策略:默认 drop + 静默拦截
NFTables 默认链策略设为 drop 是实现“静默”的前提。与 reject 不同,drop 不回应任何包(包括 TCP RST 或 ICMP port-unreachable),使端口在扫描下表现为“无响应”,有效降低暴露面。
- 在 filter 表的 input 链末尾添加:
chain input { type filter hook input priority 0; policy drop; } - 确保所有显式允许规则(如 SSH、HTTP)置于
policy drop之前,否则会被直接丢弃 - 避免使用
reject with tcp-reset或icmpx type port-unreachable,它们会暴露端口存在
按服务精细放行,禁止泛化开放
只开放真实需要的端口和服务,且限制来源(如管理 IP 段)。例如仅允许可信网段访问 SSH:
iifname "eth0" ip saddr 192.168.10.0/24 tcp dport 22 accept- Web 服务若仅需外部访问,可放开
tcp dport { 80, 443 },但禁用tcp dport 8080-8090这类常见调试端口 - 数据库端口(如 3306、5432)必须严格限制源 IP,禁止公网暴露
识别并静默拦截冗余端口
所谓“多余端口”,通常指未运行服务却处于监听状态(如残留进程)、或历史上开放但已停用的服务。静默拦截的关键不是“关闭端口”,而是确保 NFTables 在网络层就丢弃其入向流量:
- 用
ss -tlnp或netstat -tulpn确认哪些端口确实在监听;未监听的端口无需特别处理,系统自动拒绝 - 对已知废弃但暂不能下线的服务端口(如测试用 8080),添加明确 drop 规则:
tcp dport 8080 drop,放在 accept 规则之后、policy drop 之前,确保优先匹配 - 可批量屏蔽高风险端口段:
tcp dport { 23, 2323, 139, 445, 1433, 3389 } drop(根据实际环境调整)
脚本结构建议:模块化 + 可维护
将规则按功能拆分为独立块(如 base、ssh、web、blocklist),便于复用和审计。推荐使用 nft 直接加载脚本文件:
- 开头清空旧规则:
flush ruleset - 定义常用地址集或端口集(如
define web_ports = { 80, 443, 8443 }),提升可读性 - 每类规则加注释说明用途,例如:
# Block legacy SMB ports silently - 保存为
/etc/nftables.conf后,用nft -f /etc/nftables.conf加载









