一个计算机技术爱好者与学习者

0%

nftables入门篇

1. 什么是nftables?

nftables是Linux内核的一个网络包过滤工具(框架),用于替代传统的iptables/ip6tables/arptables/ebtables范式。
nftables代表了对经典的iptables的进化与革新,它提供了一个简单、统一和高效的方式来管理网络数据包的流动,包括过滤和路由。

本文中,我们会学习nftables的基础知识,了解nftables的常用命令。

相关文档:

2. iptables vs nftables

iptablesnftables(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特点

  • nftablesiptables的现代替代品,随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
2
3
4
5
6
7
8
# Debian/Ubuntu
sudo apt install nftables

# CentOS/RHEL
sudo yum install nftables

# Fedora
sudo dnf install nftables

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
2
3
nft list tables
nft list chains
nft list ruleset

输出结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@gateway ~]# nft list tables
table ip my_table
[root@gateway ~]# nft list chains
table ip my_table {
chain my_chain {
type filter hook input priority 0; policy accept;
}
}
[root@gateway ~]# nft list ruleset
table ip my_table {
chain my_chain {
type filter hook input priority 0; policy accept;
ip saddr 192.168.1.0/24 accept
}
}

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
2
nft add table ip filter
nft add chain ip filter input { type filter hook input priority 0 \; policy accept \; }

2、添加规则允许SSH和HTTP流量

1
nft add rule ip filter input tcp dport {22, 80} accept

3、除了允许的规则外,拒绝所有流量

1
2
nft add rule ip filter input counter drop
nft list chain ip filter input

通过插入一个计数器规则,丢弃并记录没有匹配到accept规则的流量。

或者:

1
2
nft chain ip filter input { type filter hook input priority 0 \; policy drop \; }
nft list chain ip filter input

通过修改链的默认策略为drop,丢弃没有匹配到accept规则的流量。

以上命令建立了一个默认拒绝所有进入流量的策略,并明确设定了接受端口为22和80的TCP连接的规则。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-nftables-start/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~