nftables深入浅出
-入门介绍-

img

入门

故事从RHEL8开始...

CentOS 8 主要改动和 RedHat Enterprise Linux 8 是一致的,基于 Fedora 28 和内核版本 4.18,其中网络方面的主要改动是**用 nftables 框架替代 iptables 框架作为默认的网络包过滤工具。

以前iptables和firewalld兼容,现在是nftables和firewalld兼容了。

nftables 是一个 netfilter 项目,旨在替换现有的 {ip,ip6,arp,eb}tables 框架,为 {ip,ip6}tables 提供一个新的包过滤框架、一个新的用户空间实用程序(nft)和一个兼容层。它使用现有的钩子、链接跟踪系统、用户空间排队组件和 netfilter 日志子系统。

nftables 主要由三个组件组成:内核实现、libnl netlink 通信和 nftables 用户空间。 其中内核提供了一个 netlink 配置接口以及运行时规则集评估,libnl 包含了与内核通信的基本函数,用户空间可以通过 nft 和用户进行交互。

本文主要介绍用户空间命令行工具 nft 的用法。

 

nftables VS iptables

nftables 和 iptables 一样,由表(table)、链(chain)和规则(rule)组成,其中表包含链,链包含规则,规则是真正的 action。与 iptables 相比,nftables 主要有以下几个变化:

 

nftables 的每个表只有一个地址簇,并且只适用于该簇的数据包。表可以指定五个簇中的一个:

nftables簇iptables命令行工具
ipiptables
ip6ip6tables
inetiptables和ip6tables
arparptables
bridgeebtables

inet 同时适用于 IPv4 和 IPv6 的数据包,即统一了 ipip6 簇,可以更容易地定义规则,下文的示例都将采用 inet 簇。

以上理论取自互联网并整理并加以个人理解,以下是实践部分。

实用部分

怎么实际使用,怎么从iptables那边做对比理解,怎么配置生效,将是以下部分的重点。

 

基础概念

 

表(table)、链(chain)和规则(rule)

##

更多见附录部分。

规则是存在于某表下某链下的

nftables是否要启动?

nftables也是一个服务,它就像iptables一样,可以与firewalld共存。表现是启动firewalld时,系统中还可以使用iptables或nftables命令(命令为nft)进行动态的防火墙配置。

可以认为firewalld只是它们的一个统一的配置入口。firewalld不是必须,而nftables/iptables则是不同时期的网络流量管制之必须。

centos7及之前则是iptables,而rhel8及之后暂时是新秀nftables。

所以说了这么多,引出结论是nftables的启动不是必须的

 

先用firewalld来管理nftables

先不启动nftables。因为熟悉,更是因为一路走来老鸟已经熟悉了firewalld,好吧,你是00后...

systemctl start firewalld启动firewalld服务后,会默认创建firewalld表,filter_IN_public_allow链,显示的规则是通过firewall-cmd 添加上来的策略。验证一下:

启动firewalld之后什么都不做即有如上表链被创建,停止firewalld服务表链规则消失,什么都没有留下。

 

列出所有规则

 

 

创建表链规则

 

向firewalld表链中添加规则

向已有的表链中添加。

firewalld服务停掉之后,此表链自动停掉。此表、链、规则也就失败了,相当于停掉防火墙了。此时可以用前面的查看表、链、规则的命令验证。 

 

创建完整的表链规则

此时firewalld服务在运行状态。

 

持久化nftables配置

 

nftables服务的加载过程

从服务的启动过程中可以看到启动nftables的过程是一个重置、重载nfstables的过程,同时也提供的持久化的过程。

 

生成自定义配置文件与加载自定义配置文件

前面手动添加策略到表链中的过程,这里向自定义表链中添加策略,然后将它输出到指定文件

 

备份保存所有的规则

 

 

保存某一个表的规则

 

 

查看ruleset规则

 

 

清空规则

还记得防火墙清空命令iptables -F 和 查看命令 iptables -nL吗?nftables也有同样的操作。

使用firewall-cmd --reload或systemctl restart firewalld重新加载firewall规则后

重新启动或加载的firewall表链追加在了后面,原来加载的自定义表链规则还在。

表明:只要不删除或清空规则,从静态文件或firewalld中加入的规则并不会覆盖原有的规则,是纯追加。删除规则的命令见下文。

 

 

正式启动nftables服务

nftables服务与firewalld的关系,就像iptables与firewalld服务的关系一样,同时只能启动其中一个,另一个会自动停掉。

回到前面回顾nftables的启动过程,

将自定规则文件在/etc/sysconfig/nftables.conf中通过include引入,如下

启动服务命令:systemctl start nftables

以下过程验证服务只能同时运行一种。

 

 

集成firewalld后端

从firewalld v0.6.0发布开始支持nftables作为后端(https://firewalld.org/2018/07/nftables-backend

 

firewalld如何调用nftables

firewalld直接通过nft命令行工具也nftables联动,就像firewalld与iptables之间的联动是相似的。后期引入新的libnftables库。

从如下的firewalld设计构架图中可以看到,nftables扮演的是后端角色。

firewalld-structure+nftables

firewalld的常规设置项目(如服务、端口、端口转发等)默认使用nftables.其它的可有要经过一点转变,转化成原生的nftables sets.

 

切换后端

修改配置文件/etc/firewalld/firewalld.conf

 

附录

nft语法规范

nft命令和iptables类似都有语法检测功能,直接通过命令添加规则本身就是一个验证语法的过程。如果你比较熟悉命令操作,可以直接在配置文件中修改。

实用部分章节主要以验证和对比为主,通过一个添加多端口的实例来说明和对比iptables与nftables之间的区别与联系。

几点注意

linux新内核从4.18后使用了nftables,可能有的服务器上依然有iptables命令,但iptables显然执行不报错,但也已经失效了。如何iptables -F已经无法清空nftables规则了,请使用nft flush ruleset。即是说,在同一个内核上它们只会有一个正常。

 

更多的控制规则语法获取

引用:

https://www.netfilter.org/projects/nftables/manpage.html

更多实例,未完待续...如果你还能看到这名话,表明是真的