当前位置: 首页 > news >正文

nftables 入门:简洁高效的 Linux 防火墙管理

nftables 基础学习笔记

1. 什么是 nftables

nftables 是 Linux 防火墙子系统的框架(从 Linux 3.13 开始引入),它用于替代旧的 iptables/ip6tables/arptables/ebtables 等工具,提供更统一、更灵活、更高效的防火墙规则管理方式。

相比于传统的 iptables:

  • 规则更简洁:nftables 用一条规则可以处理多个协议字段,而 iptables 往往需要多条规则。
  • 可读性更好:nftables 使用类似编程语言的写法,支持批量编辑。
  • 性能更佳:规则的执行更高效,占用更少的系统资源。

2. 安装与启用

2.1 安装

不同发行版安装方式略有差异,常见的:

  • Debian / Ubuntu 系列:
    sudo apt-get update
    sudo apt-get install nftables
    
  • CentOS / RHEL 系列:
    sudo yum install nftables
    
  • Fedora
    sudo dnf install nftables
    

2.2 启动与开机自启

安装完成后,可以启用服务并设置开机启动:

# 启动服务
sudo systemctl start nftables

# 查看 nftables 状态
sudo systemctl status nftables

# 设置开机启动
sudo systemctl enable nftables

3. 基础概念

要想理解 nftables,需要了解三个核心概念:表(table)链(chain)规则(rule)

  1. Table(表)

    • 用于逻辑分组规则。类似 iptables 中的 filter、nat 表。
    • nftables 中可以自己命名表,比如 inet filterip nat 等。
  2. Chain(链)

    • 每个表里可以包含多个链。链中定义了处理数据包的流程(例如 input, forward, output 等)。
    • 也可以自定义用户链,用来按需编排复杂逻辑。
  3. Rule(规则)

    • 具体的防火墙匹配逻辑和处理动作都写在规则中,挂载在某个表的某条链里。
    • 动作可以是:accept, drop, reject, log, redirect, masquerade 等。

4. nftables 的基本操作示例

下面是一些常见的 nftables 命令操作示例,帮助快速上手。

4.1 查看当前配置

sudo nft list ruleset
  • 该命令会列出当前系统已生效的所有 nftables 规则集,包括表、链、规则等内容。

4.2 新建表与链

4.2.1 新建表
sudo nft add table inet mytable
  • 这里示例了在 “inet” 协议簇中新建一个名为 mytable 的表。
  • “inet” 协议簇表示同时支持 IPv4 和 IPv6,你也可以使用 ip, ip6, arp, bridge 等协议簇。
4.2.2 新建链
sudo nft add chain inet mytable mychain { type filter hook input priority 0\; }
  • 该命令含义:
    • type filter:表明这是一个过滤链。
    • hook input:该链挂载在 “input” 钩子上,处理进来(进入本机)数据包。
    • priority 0:优先级,数值越小,越先处理。

常见的 hook:

  • input:处理发往本机的数据包。
  • forward:处理转发数据包(主机作为路由器或转发流量时)。
  • output:处理本机发送的数据包。
  • prerouting / postrouting:常用于 NAT 场景。

4.3 添加规则

在链中添加规则,语法一般类似:

sudo nft add rule <协议簇> <表名> <链名> <匹配条件> <动作>
示例:允许 SSH 连接
sudo nft add rule inet mytable mychain tcp dport ssh accept
  • 允许 TCP 端口为 22(ssh) 的连接通过。
示例:丢弃某个 IP 地址的访问
sudo nft add rule inet mytable mychain ip saddr 192.168.1.100 drop
  • 匹配源 IP 为 192.168.1.100 的数据包,直接丢弃(drop)。

4.4 修改 / 删除 规则

  • 修改规则 一般先删除再添加。nftables 也支持一些原子操作,比如直接替换,但对小白而言,删除+添加更简单。
  1. 列出规则行号

    sudo nft list chain inet mytable mychain -a
    
    • -a 参数用于显示规则的句柄(handle),帮助我们精确定位规则。
  2. 删除规则

    # 通过句柄删除
    sudo nft delete rule inet mytable mychain handle <句柄号>
    
    • 先通过列出规则的句柄,然后再用该句柄删除想要的规则。

4.5 持久化

编辑完规则后,如果你想让它们在系统重启后仍然生效,需要持久化配置。

  1. 有些发行版会在启动时自动加载 /etc/nftables.conf 中的内容。可以将规则直接写进这个文件。
  2. 也可通过命令行导出当前规则到 nftables.conf
    sudo nft list ruleset > /etc/nftables.conf
    
  3. 重启后,系统会自动读取并应用其中的规则。

5. nft 命令行实例小结

下面汇总一下常见的命令及含义:

命令作用
sudo nft list ruleset列出当前 nftables 的全部配置
sudo nft add table inet mytable创建名为 mytable 的表 (协议簇 inet)
sudo nft add chain inet mytable mychain {...}在 mytable 中创建一条链 (指定 hook & priority)
sudo nft add rule inet mytable mychain ...在 mychain 中添加规则
sudo nft delete rule inet mytable mychain handle X删除句柄为 X 的规则
sudo nft flush chain inet mytable mychain清空 mychain 链中所有规则
sudo nft flush table inet mytable清空 mytable 表中所有规则
sudo nft delete chain inet mytable mychain删除 mychain 链
sudo nft delete table inet mytable删除 mytable 表

6. 更多示例与技巧

6.1 NAT 示例

sudo nft add table ip nat
sudo nft add chain ip nat prerouting { type nat hook prerouting priority 0\; }
sudo nft add chain ip nat postrouting { type nat hook postrouting priority 100\; }

# 例如:将所有发往 192.168.0.100:80 的流量重定向到 8080
sudo nft add rule ip nat prerouting tcp dport 80 redirect to 8080

# 例如:源地址伪装
sudo nft add rule ip nat postrouting ip saddr 192.168.0.0/24 oif "eth0" masquerade

6.2 记录日志(log)

有时需要排查防火墙是否匹配到某条规则,可使用 log 动作:

sudo nft add rule inet mytable mychain tcp dport 80 log prefix "HTTP_PORT80: " drop


## 7. 简要工作流程图

```mermaid
flowchart LR
    A[网络数据包] --> B[内核 netfilter]
    B --> C[匹配 nftables hook]
    C --> D[查找对应表 &]
    D --> E[规则匹配 / 执行动作]
    E --> F[accept, drop, log等结果]
  • 当数据包到达内核后,会根据不同阶段(hook)进入相应的 nftables 链匹配规则,并执行对应的动作。

8. 常见问题

  1. iptables 与 nftables 冲突吗?

    • 大多数发行版已经将 iptables 的后端替换成了 nftables,但仍保留 iptables-nft 兼容包。如果你使用了传统的 iptables 命令,实际上也在调用 nftables 后端。
    • 建议统一使用 nftables 命令管理,以免混淆。
  2. 如何调试规则?

    • 建议先使用 sudo nft list ruleset 查看规则是否如预期;
    • 再检查系统日志、dmesg、或者使用 log 动作排查是否匹配到规则。
  3. 为什么规则不生效或重启后丢失?

    • 需要确认服务是否开启并在开机启动,以及是否将规则持久化保存到 /etc/nftables.conf 等对应文件里。

9. 结语

nftables 提供了强大的防火墙管理能力,同时简化了配置。对于初学者,掌握常用的 “增删改查” 命令、表链规则逻辑和持久化操作基本就能满足日常需求。在实际生产环境中,你可以根据需求编写更复杂的规则脚本来实现流量控制、NAT 转发、端口映射等功能。

建议进一步学习:

  1. 官方文档 (英文)
  2. [各发行版的 nftables 手册]
  3. 关于 nft 语言的高级用法,包含映射(maps)、链式多重条件、计数器(counter)等。

相关文章:

  • 基于大型模实现的AiEditor
  • 数据结构与算法 计算机组成 八股
  • Aws batch task 无法拉取ECR 镜像unable to pull secrets or registry auth 问题排查
  • GPU的架构原理解析
  • 蓝桥杯备考:动态规划路径类DP之矩阵的最小路径和
  • 【Altium】22.11版本后如何导出Gerber镜像层
  • aardio - 虚表 + 数据库 操作例程
  • 《Operating System Concepts》阅读笔记:p200-p202
  • 高效处理 List<T> 集合:更新、查找与优化技巧
  • C++ 中 `shared_ptr` 的用法及常见陷阱解析
  • 笔试强训题(2)
  • 【运维笔记】docker 中 MySQL从5.7版本升级到8.0版本 - 平滑升级
  • C++学习之STL初识与容器
  • MuBlE:为机器人操作任务规划提供了逼真的视觉观察和精确的物理建模
  • 安卓免费工具:海量素材助力个性化头像制作
  • aardio - 虚表 —— 两个虚表之间互相拖动交换数据
  • WPS Word中英文混杂空格和行间距不一致调整方案
  • 牛客python蓝桥杯11-32(自用)
  • 无人机遥控器扩频技术解析!
  • 白盒测试(3):PCB阻抗测试方法
  • “集团结婚”:近百年前革新婚俗的尝试
  • 自然资源部:适应存量时代城市更新发展,严控增量盘活存量
  • 上海文化馆服务宣传周启动,为市民提供近2000项活动
  • 世卫大会拒绝涉台提案,外交部:坚持一个中国原则是人心所向
  • 自媒体假扮官方蹭反间谍热度攫取利益,国安机关提醒
  • 浙江推动人工智能终端消费:家居机器人纳入以旧换新补贴范围