[Linux入门] 从 iptables 到 nftables:初学者入门指南
目录
一、为什么要从 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+)底层已默认使用
nftables
,iptables
只是兼容工具 —— 用iptables
创建的规则会被自动转换成nftables
规则,但nftables
的规则无法被iptables
识别。 - 更高效的设计:
nftables
采用 “表 - 链 - 规则” 的层级结构,支持批量管理和更灵活的匹配条件,规则加载速度更快。 - 统一地址簇:无需像
iptables
和ip6tables
那样分开管理 IPv4 和 IPv6,nftables
的inet
地址簇可同时处理两者。
二、从 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 服务
为避免iptables
与nftables
冲突,需禁用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
add
和create
的区别: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
:钩子的优先级(数值越小,越早执行,如-100
比0
先执行)。
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 12 (handle 通过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 系统的网络安全保驾护航。