伴随Linux防火墙的不断升级,nftables有逐渐替代iptables的趋势。不论是nft,还是iptables,都是借助netfilter实现的防火墙规则配置。只有理解了netfilter的逻辑,才能更好的理解如何配置规则,规则又如何更好实现防火墙的功能。本文不是规则配置的教程,主要侧重于基本框架。
netfilter/iptables/nftables的关系
众所周知,iptables是2.x时代Linux的防火墙。但实际上iptables只是用户空间配置防火墙的工具,真正实现防火墙功能是内核空间的netfilter,iptables只是用于配置和管理netfilter的规则而已。netfilter实际上提供了一系列的工具,包括iptables,ip6tables,arptables, ebtables。其中iptables最为大家所熟知。
nftables是用于替代iptables的新一代工具,从内核版本3.13开始引入,日渐普及。由于iptables历史悠久,使用广泛,目前内核仍旧同时支持iptables和nftables。两者最大的区别可以这么简单的理解,iptables可以定义一系列规则(输出yes or no的结果),netfilter根据规则来依次执行过滤处理;而nftables则扩展了能力,可以定义一系列处理处理逻辑,具备了可编程的能力。
进一步来讲,netfilter在协议栈上定义了一系列钩子函数,数据在流经协议栈的过程中,执行相应的钩子函数。而这些钩子函数,会使用用户层iptables定义的规则做条件匹配,根据匹配结果执行相应的动作。nftables则进一步扩展,钩子函数不再单单是规则匹配,而是提供了类似VM的功能,可以执行nft定义的处理逻辑(代码)。
四表五链
要理解iptables的规则,一定要理解netfilter的四表五链。
数据接收过程走的是 1 和 2,发送过程走的是 4 、5,转发过程是 1、3、5。有了这张图,我们能更清楚地理解 iptables 和内核的关系。
下图:在每一个链上都可能是由许多个规则组成的。在 NF_HOOK 执行到这个链的时候,就会把规则按照优先级挨个过一遍。如果有符合条件的规则,则执行规则对应的动作。而这些规则根据用途的不同,又可以raw、mangle、nat 和 filter。从整体上看,四链五表的关系如下图。
在配置iptables规则时,不指定table名时,默认的表是filter。所以我们可以看出,iptables(或者说netfilter)有三层结构: 表(table) -> 链(chain) -> 规则(rule)。
规则由匹配条件和处理动作组成。比如IP、端口等都是匹配条件,而处理动作(-j参数)有:
ACCEPT
DROP
REJECT
SNAT
MASQUERADE
DNAT
REDIRECT
LOG
用户可以自定义链,这样就可以规定处理动作到某条自定义链,这是为了增加配置的灵活性。
为了扩展iptables的能力,可以利用-m选项来引入扩展匹配的能力模块,具体不展开叙述。
有了上述的介绍,基本可以理解iptables的原理,就能更好的理解和配置规则了。
nftables 更强大
可以看到,iptables已经预定好了处理的动作和匹配的条件,甚至连四表五链都定义好了。为此,nftables在保留了三层结构: 表(table) -> 链(chain) -> 规则(rule)以及相对应的钩子函数基本不变之外,把更多的灵活性也开放了出来:
- 没有内置任何表,管理员可以随意创建。
- 拥有了编程能力,可以定义变量和包含外部脚本
所以nftable拥有了更强的灵活性,理论上可以有相比遍历规则更快的速度(实际未必),同时借助编程能力,可以降低对内核升级的依赖,大大增强了防火墙规则的配置功能。
nftables支持的处理动作也更多,比如支持goto、jump、return等能力。
在具体使用上,nft整合了原有的ip、ip6、arp、eb等多个工具,由管理员建表时制定表对应的簇即可。使用nft时,要先建表,然后建链,最后创建规则。
iptables可以利用工具转化为nftables。iptables-translate/iptables-restore-translate。