1. 什么是nftables?
nftables
是Linux内核的一个网络包过滤工具(框架),用于替代传统的iptables/ip6tables/arptables/ebtables范式。nftables
代表了对经典的iptables
的进化与革新,它提供了一个简单、统一和高效的方式来管理网络数据包的流动,包括过滤和路由。
本文中,我们会学习nftables
的基础知识,了解nftables
的常用命令。
相关文档:
2. iptables vs nftables
iptables
和nftables
(nf表示netfilter)都是Linux系统中用于管理网络流量规则的工具,它们用于配置内核的网络包过滤、转发以及网络地址转换(NAT)等功能。
2.1. iptables特点
iptables
是在较早的Linux内核版本中引入的网络包过滤框架。- 它主要和Netfilter框架交互,负责IPv4流量。
iptables
有自己的语法规则,通过命令行工具来管理。- 它有多个表(table),比如
filter
,nat
,mangle
,raw
,每个表包含一组链(chain),例如INPUT
,FORWARD
,OUTPUT
。 - 命令行语法可能对新手来说比较复杂且难以理解。
iptables
没有直接的支持IPV6,需要通过ip6tables
来进行配置。
2.2. nftables特点
nftables
是iptables
的现代替代品,随Linux内核3.13及以后版本发布。- 它是为了解决
iptables
命令复杂和性能不佳等问题而设计的。 nftables
使用新的nft
命令行工具,提供了一种更简洁的的语法,结构更为统一,并且可以同时处理IPv4、IPv6和其他协议,从而简化了规则集的管理和配置。nftables
提供了一个内置的数据包分类引擎,用来代替iptables
中的多个存在重叠功能的模块。nftables
使用单个框架来取代iptables
中的多个工具(iptables
,ip6tables
,arptables
,ebtables
)。
2.3. 区别
- 语法:
nftables
有更为简单和现代的语法。 - 性能:
nftables
旨在提供更好的性能。 - 易用性:
nftables
提供更为统一的处理方式,减少了之前版本的复杂度。 - 功能整合:
nftables
合并了iptables
的多个实用工具和表,简化了管理过程。 - 协议支持:
nftables
可以同时支持多个协议。
2.4. 联系
- 目的:它们都旨在管理Linux内核的包过滤规则。
- 基础:
nftables
建立在iptables
的基础上,尝试克服iptables
现存的不足。 - Netfilter:它们都使用Netfilter框架来实现网络包的过滤和处理。
2.5. 小结
总的来说,虽然nftables
是作为iptables
的后续者被设计和构建的,但两者在很长一段时间内是并存的,而现在Linux社区鼓励大家使用nftables
以取代被认为过时的iptables
。不过,许多老系统和应用可能仍然依赖于iptables
。
3. nftables关键组成
- nftables子系统:这是Linux内核的一部分,是nftables操作的核心。它通过Netfilter提供的钩子(hooks)处理数据包。
- nft命令行工具:用户通过
nft
命令行工具与nftables子系统进行交互。这个工具用于设置和更新规则集。 - 规则集:规则集(rulesets)是nftables配置的核心。它包含了基于各种条件对数据包进行处理的规则。
4. 安装nftables
在现代的Linux发行版上,默认情况下可能已经安装了nftables
。如果没有安装,我们可以通过发行版的包管理工具来安装:
1 | # Debian/Ubuntu |
5. nftables基础
5.1. 表、链和规则
在nftables中,表(tables)是存储链(chains)的容器,而链则是规则的集合。一个规则可以决定接受、拒绝、转发还是处理一个数据包。
5.2. nft命令基础
5.2.1. 创建表
1 | nft add table ip my_table |
其中 ip
指定了正在创建的表将用于IPv4流量。
5.2.2. 创建链到表中
1 | nft add chain ip my_table my_chain { type filter hook input priority 0 \; } |
5.2.3. 创建规则到链中
1 | nft add rule ip my_table my_chain ip saddr 192.168.1.0/24 accept |
这个命令会在my_chain
中添加一个规则,允许来自子网192.168.1.0/24
的所有进入数据包。
5.2.4. 查看表、链和规则
1 | nft list tables |
输出结果为:
1 | [root@gateway ~]# nft list tables |
5.2.5. 删除规则
查看当前的规则集:
1 | nft list ruleset |
删除某个特定的规则:
1 | nft delete rule ip my_table my_chain handle 1 |
5.2.6. 保存和恢复规则集
当主机重启后,表、链和规则会全部清空,因此需要保存和恢复规则集。
保存当前的规则集到文件:
1 | nft list ruleset > /etc/nftables.conf |
从文件恢复规则集:
1 | nft -f /etc/nftables.conf |
6. 示例:基本的端口过滤
假设我们想要允许SSH(端口22)和HTTP(端口80)流量,但拒绝其他所有的入站流量。
1、新建一个表和链,默认允许所有流量
1 | nft add table ip filter |
2、添加规则允许SSH和HTTP流量
1 | nft add rule ip filter input tcp dport {22, 80} accept |
3、除了允许的规则外,拒绝所有流量
1 | nft add rule ip filter input counter drop |
通过插入一个计数器规则,丢弃并记录没有匹配到accept规则的流量。
或者:
1 | nft chain ip filter input { type filter hook input priority 0 \; policy drop \; } |
通过修改链的默认策略为drop,丢弃没有匹配到accept规则的流量。
以上命令建立了一个默认拒绝所有进入流量的策略,并明确设定了接受端口为22和80的TCP连接的规则。