[Linux入门] 从 iptables 到 nftables:初学者入门指南

发布于:2025-08-04 ⋅ 阅读:(13) ⋅ 点赞:(0)

目录

一、为什么要从 iptables 转向 nftables?

二、从 iptables 迁移到 nftables 的完整步骤

1️⃣安装 nftables

2️⃣备份现有 iptables 规则

3️⃣转换 iptables 规则为 nftables 格式

4️⃣启用并启动 nftables 服务

5️⃣禁用 iptables 服务

三、nftables 核心概念:从地址簇到规则

1️⃣地址簇(Address Families):区分数据包类型

2️⃣钩子(Hooks):数据包的 “检查站”

3️⃣表(Table):规则的 “容器”

4️⃣链(Chain):规则的 “分组”

5️⃣规则(Rule):具体的 “处理逻辑”

四、nftables 常用命令速查

五、实战:搭建基础防火墙

步骤 1:创建表和链

步骤 2:添加规则

六、总结


在 Linux 防火墙领域,iptables曾是当之无愧的 “明星工具”,但随着技术发展,nftables作为其继任者,凭借更简洁的语法、更高效的规则管理和对新特性的支持,逐渐成为主流。对于初学者来说,从iptables迁移到nftables可能听起来复杂,但只要掌握核心逻辑,就能快速上手。本文将结合实战步骤和核心概念,带你全面了解nftables的配置与使用。

一、为什么要从 iptables 转向 nftables?

在开始学习前,我们先搞清楚一个问题:为什么需要换用nftables

  • 底层升级:新版 Linux 系统(如 Ubuntu 20.04+、CentOS 8+)底层已默认使用nftablesiptables只是兼容工具 —— 用iptables创建的规则会被自动转换成nftables规则,但nftables的规则无法被iptables识别。
  • 更高效的设计:nftables采用 “表 - 链 - 规则” 的层级结构,支持批量管理和更灵活的匹配条件,规则加载速度更快。
  • 统一地址簇:无需像iptablesip6tables那样分开管理 IPv4 和 IPv6,nftablesinet地址簇可同时处理两者。

二、从 iptables 迁移到 nftables 的完整步骤

如果你正在使用iptables,迁移到nftables只需 5 步,全程无需中断服务。

1️⃣安装 nftables

现代 Linux 内核通常已预装nftables,若未安装,通过包管理器安装:

bash

# 更新软件源
sudo apt-get update  
# 安装nftables
sudo apt-get install nftables  

2️⃣备份现有 iptables 规则

迁移前务必备份iptables规则,防止意外丢失:

bash

# 备份IPv4规则
sudo iptables-save > /etc/iptables/rules.v4  
# 备份IPv6规则
sudo ip6tables-save > /etc/iptables/rules.v6  

3️⃣转换 iptables 规则为 nftables 格式

iptables提供了专门的转换工具,可直接将规则转为nftables格式并保存到配置文件:

bash

# 转换IPv4规则到/etc/nftables.conf
sudo iptables-save | iptables-restore-translate -o /etc/nftables.conf  

# 转换IPv6规则(追加到同文件)
sudo ip6tables-save | ip6tables-restore-translate -o /etc/nftables.conf --ipv6  

转换后建议手动检查/etc/nftables.conf,确保规则符合需求(比如删除冗余条目)。

4️⃣启用并启动 nftables 服务

nftables在系统启动时自动加载规则:

bash

# 启用服务(开机自启)
sudo systemctl enable nftables  
# 启动服务(立即生效)
sudo systemctl start nftables  

验证服务状态:

bash

sudo systemctl status nftables  # 显示"active (exited)"即为正常

查看已加载的规则:

bash

sudo nft list ruleset  # 列出所有nftables规则

5️⃣禁用 iptables 服务

为避免iptablesnftables冲突,需禁用iptables相关服务:

bash

# 停止并禁用iptables服务
sudo systemctl stop iptables  
sudo systemctl disable iptables  

# (可选)卸载持久化工具
sudo apt-get remove iptables-persistent netfilter-persistent  

三、nftables 核心概念:从地址簇到规则

nftables的核心逻辑围绕 “地址簇 - 表 - 链 - 规则” 展开,理解这些概念是灵活配置的基础。

1️⃣地址簇(Address Families):区分数据包类型

地址簇用于指定nftables处理的数据包类型(如 IPv4、IPv6 等),创建表时必须指定(默认是ip)。常见地址簇包括:

地址簇 用途
ip 处理 IPv4 数据包
ip6 处理 IPv6 数据包
inet 同时处理 IPv4 和 IPv6(推荐初学者使用,简化配置)
arp 处理 ARP 协议数据包(用于局域网设备通信)
bridge 处理桥接设备(如交换机)的数据包
netdev 处理网络设备的入站 / 出站数据包

2️⃣钩子(Hooks):数据包的 “检查站”

nftables通过 “钩子” 在数据包经过网络协议栈的关键节点进行拦截处理。可以理解为:数据包在网络中传输时,会经过多个 “检查站”(钩子),每个检查站负责特定阶段的处理。

常见钩子(以inet地址簇为例):

钩子 作用
prerouting 数据包进入系统后,路由选择前的 “第一站”,用于早期过滤或修改路由属性
input 目标是本地系统的数据包(如访问本机的 SSH 服务)会经过此钩子
forward 转发到其他主机的数据包(如路由器转发的流量)会经过此钩子
output 本地进程发送的数据包(如本机访问外部网站)会经过此钩子
postrouting 数据包离开系统前的 “最后一站”,常用于 NAT(网络地址转换)
ingress prerouting更早的 “检查站”,用于快速过滤大量入站流量(内核 5.10 + 支持)

3️⃣表(Table):规则的 “容器”

表是nftables的基础容器,用于存放链、规则和其他对象(如集合)。每个表必须关联一个地址簇,且只能处理该类型的数据包。

创建表的命令:

bash

# 创建默认地址簇(ip)的表,名为"filter"
sudo nft add table filter  

# 创建inet地址簇的表(同时支持IPv4/IPv6)
sudo nft add table inet mytable  

  • addcreate的区别:add在表已存在时不报错,create会报错(推荐用add)。
  • 表可以暂时禁用(flags dormant),规则会失效,后续可重新激活。

4️⃣链(Chain):规则的 “分组”

链是规则的集合,分为两种类型:

  • 基础链:关联钩子和优先级,是数据包的 “入口”(如input链绑定input钩子)。
  • 常规链:不关联钩子,仅作为规则的 “跳转目标”(用于组织复杂规则)。

创建基础链的命令(以inet地址簇的input钩子为例):

bash

# 在inet地址簇的mytable表中,创建绑定input钩子的基础链
sudo nft add chain inet mytable input { type filter hook input priority 0 \; }  

  • type filter:链的类型(filter为默认,用于过滤数据包;nat用于地址转换)。
  • priority 0:钩子的优先级(数值越小,越早执行,如-1000先执行)。

5️⃣规则(Rule):具体的 “处理逻辑”

规则是nftables的核心,由 “匹配条件” 和 “动作” 组成(如 “如果是访问 80 端口的 TCP 包,则允许通过”)。

添加规则的基本语法:

bash

sudo nft add rule [表名] [链名] [匹配条件] [动作]  

常用示例:

bash

# 允许来自lo回环接口的所有流量(本地进程通信)
sudo nft add rule inet filter input iif lo accept  

# 允许SSH(22端口)连接
sudo nft add rule inet filter input tcp dport ssh accept  

# 丢弃其他未匹配的入站流量(放在规则最后)
sudo nft add rule inet filter input drop  

  • iif:入站接口;oif:出站接口。
  • 动作:accept(允许)、drop(丢弃)、snat(源地址转换)等。

四、nftables 常用命令速查

掌握以下命令,可满足日常管理需求:

操作 命令
查看所有规则 sudo nft list ruleset
按地址簇查看规则(如 inet) sudo nft list ruleset inet
清空所有规则 sudo nft flush ruleset(危险!谨慎使用)
备份规则 sudo nft list ruleset > backup.nft
恢复规则 sudo nft -f backup.nft
删除指定规则(需先获取 handle) sudo nft delete rule [表名] [链名] handle 12handle通过nft -a list ruleset查看)
修改规则 sudo nft replace rule [表名] [链名] handle 12 [新规则]

五、实战:搭建基础防火墙

以下示例将创建一个允许 SSH、HTTP、HTTPS 和 ICMP(ping),并丢弃其他入站流量的防火墙配置。

步骤 1:创建表和链

bash

# 创建inet地址簇的filter表(同时支持IPv4/IPv6)
sudo nft add table inet filter  

# 创建input链(绑定input钩子,默认策略为丢弃)
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }  

  • policy drop:链的默认策略(未匹配任何规则时,默认丢弃数据包)。

步骤 2:添加规则

bash步骤 3:验证规则

bash

sudo nft list ruleset  # 查看所有规则是否生效

六、总结

nftables作为新一代 Linux 防火墙工具,虽然概念稍显复杂,但通过 “地址簇 - 表 - 链 - 规则” 的层级结构,能更高效地管理防火墙策略。对于初学者,建议从迁移现有iptables规则开始,再逐步学习手动创建规则,重点理解钩子和地址簇的作用。

掌握nftables后,你将能轻松应对从简单过滤到复杂 NAT 的各种场景,为 Linux 系统的网络安全保驾护航。


网站公告

今日签到

点亮在社区的每一天
去签到