终极 nftables 教程:从入门到精通

 

nftables 是 Linux 内核中新一代的网络包过滤框架。它旨在取代旧的 iptablesip6tablesarptablesebtables,提供一个更简单、更高效、更统一的管理界面。

本教程将带您了解 nftables 的核心逻辑,并指导您构建一个安全、高效的防火墙。


 

第 1 部分:核心三大概念(“乐高积木”)

 

nftables 的一切都由三个基本组件构成:表 (Table)链 (Chain)规则 (Rule)

 

1. 表 (Table):规则的“文件柜”

 

 

2. 链 (Chain):规则的“文件夹”

 

 

3. 规则 (Rule):具体的“指令”

 


 

第 2 部分:最重要的概念——优先级 (Priority)

 

这是 nftables 的核心裁决机制,解决了“多个表/链同时存在时听谁的”问题。

当一个数据包到达一个钩子(例如 input)时:

  1. nftables 会查看所有“挂”在这个 input 钩子上的所有链(无论它们在哪个表中)。
  2. 它会按照 priority(优先级)对这些链进行排序。
  3. priority 数字越小,优先级越高,越先执行。

示例场景(您的问题):

裁决:

因为 -10 小于 0,chain_B 胜出并先执行。数据包在 chain_B 中被 drop。处理立即终止。chain_A 的 accept 规则永远不会被执行。

 

priority filter 是什么?

 

为了让规则更易读,nftables 提供了一些标准名称作为 priority 数字的别名:

所以,priority filterpriority 0 是完全一样的


 

第 3 部分:实战!构建一个安全的“白名单”防火墙

 

我们的目标:默认拒绝一切(policy drop,只放行我们明确允许的服务。

 

第 1 步:清空并创建新“文件柜”(Table)

 

永远只使用 inet 族! 这样您就不必担心 ipinet 冲突。

 

第 2 步:创建“入口”文件夹(Base Chains)

 

这是最关键的一步。我们将定义 input, forward, output 链,并将 inputforward默认策略设为 drop

现在,您的服务器是 100% 安全的,但也 100% 没用了,因为它会 drop包括您 SSH 在内 的所有新连接。

 

第 3 步:添加“白名单”规则(Rules)

 

规则在链中是有顺序的。我们必须立即添加允许我们自己访问的规则。

 

第 4 步:持久化(保存)规则

 

您在命令行中的所有操作都会在重启后丢失

今后,请直接编辑 /etc/nftables.conf 文件,然后运行 sudo systemctl reload nftables 来应用更改。


 

第 4 部分:高级主题与日常维护

 

 

1. 查看与删除规则

 

 

2. fail2ban 是如何工作的?

 

fail2bannftables 配合得天衣无缝。当 fail2ban 启动时,它会:

  1. 创建自己的链: 例如 chain f2b-sshd

  2. 添加跳转规则: 在您的 input 链中(通常在 ct state 规则之后)添加一条 jump 规则,例如:tcp dport 22 jump f2b-sshd

  3. 动态管理: 当它检测到攻击时,它不会修改您的 input 链,而是向 f2b-sshd 链中添加一条规则:

    ip saddr 203.116.129.142 counter packets 28 bytes 1456 reject

  4. 当封禁时间到期,它会从 f2b-sshd 链中删除这条规则。

fail2ban 的封禁在重启后会“幸存”吗?

是的。 防火墙规则本身是临时的,但 fail2ban 将其所有封禁记录保存在一个持久化数据库中(例如 /var/lib/fail2ban/fail2ban.sqlite3)。当 fail2ban 服务重启时,它会读取这个数据库,并自动将所有尚未过期的 IP 重新添加到 nftables 中。


 

教程总结

 

  1. 统一为王: 永远只使用 table inet filter 来管理您的防火墙。
  2. 安全为本: 永远使用 policy drop 作为 input 链的默认策略。
  3. 状态为先: 永远把 ct state established,related accept 作为您的第一条 accept 规则。
  4. 优先级裁决: 当规则冲突时,priority 数字最小的链会最先执行并胜出。
  5. ICMP 无端口: ping 使用 icmp type echo-request,不要完全禁用 ICMP。
  6. 持久化: 规则在 /etc/nftables.conf 中,并由 systemctl enable nftables 服务加载。