当前位置: 首页 > 科技观察

nftables达到1.0版本

时间:2023-03-13 17:12:02 科技观察

Linux内核是一个快速发展的项目,但有时变化出奇地慢。用于替换内核包过滤子系统的nftables项目起源于2008年,但在大多数(可能更多)生产系统中仍未被防火墙方案使用。不过,正如8月19日发布的nftables1.0.0所强调的那样,这种变化可能会越来越近。nftables的第一个公开版本由PatrickMcHardy于2009年初发布。当时,内核具有类似功能的数据包过滤iptables形式的子系统,它当然已被广泛使用,但存在促使更改的问题。这些问题包括:内核有(现在仍然有)几种数据包过滤机制:一种用于IPv4,另一种用于IPv6,一种用于ARP等。这些子系统中的每一个基本上是完全独立的,具有大量重复代码。此外,iptables内置了过多的协议相关信息,API相对难用,很难更新其中一条规则而不替换整个规则集。nftables的核心思想是抛弃所有协议感知机制,代之以一个可以从用户空间开发和配置的简单虚拟机。管理员仍然可以编写引用特定数据包标头字段等的规则,但是用户空间工具将这些规则转换为较低级别的获取和比较操作,然后将结果加载到内核中。这样,包过滤引擎更加紧凑和灵活,性能可能会更好。总的来说,一旦能够将大量用户过渡过来,应该是一件好事。nftables在推出时引起了一些轰动,但此后便逐渐淡出人们的视线,这也许是因为McHardy花了更多时间进行更多的法律诉讼。然而,PabloNeiraAyuso在2013年重启了这个项目,他的想法是尽快将代码合并到主线中。在这一点上,他成功了。2014年初,nftables进入3.13内核。从那以后的工作一直在尝试填补缺失的功能,以便nftables具有足够的吸引力让用户迁移过来。用于编写过滤规则的语言已经获得了很多很多特性,包括状态跟踪、创建地址映射、高效处理地址间隔和大规模规则链,以及对众多协议的支持。当然,文档也包括在内。nftableswiki页面有很多关于这一切如何工作的信息。当然,每个人从iptables过渡都有一个很大的障碍:已经部署的大量防火墙使用iptables。在许多情况下,重写防火墙规则可能是最好的做法,因为许多复杂的过滤配置可以在新方案中更有效地表达。但是对于只想让他们来之不易的防火墙保持正常运行的管理员来说,nftables可能并不像人们想象的那样有吸引力。nftables的开发者开发了一套脚本,将iptables防火墙翻译成nftables的描述,应该会有帮助,但是迁移仍然是一个很大的变化。在某些情况下,用户实际上可能会在没有意识到的情况下做出这种重大转变。nftables在Linux发行版中得到支持已经有一段时间了,并且正在努力将RedHat的firewalld等工具移植到nftables。这样一来,用户可能不会在第一时间接触到iptables规则,因此如果足够幸运,他根本不会注意到底层机制发生了变化。这种变化何时会发生?有点不好说。2018年Netfilter研讨会宣称iptables是“一个过时的工具”,它的日子屈指可数了。2019Debian10“buster”版本默认切换到nftables,而Ubuntu直到21.04才跟进。虽然几乎所有发行版都附带nftables,但许多发行版默认情况下并不使用它。nftables1.0.0的发布可以看作是一个信号,现在是时候让那些落后的人更认真地考虑进行转换了。虽然不太可能很快取消对iptables的支持,但完全可以预料维护iptables的热情将继续减弱。nftables中会出现新特性,用户最终需要迁移才能利用这些新特性。虽然只用了13年,但转型似乎终于进入了最后阶段。不过,有一个有趣的问题。2018年,BPF开发者公布了bpfilter,一种运行在BPF虚拟机上的包过滤机制,在当时引起了一些关注。BPF过去的势头很大(现在仍然保持着),并且在优化虚拟机并使它们安全工作方面做了大量工作。可以说,一个合理的策略是使用它而不是维护另一个仅用于数据包过滤工作的虚拟机。这删除了一堆代码并将维护重点放在BPF上。bpfilter代码包含在4.18内核版本中,并带来了“用户模式??blob”机制,旨在促进防火墙规则向新方案的过渡。然而,此代码的开发已经停止。在2021年期间,net/bpfilter的代码只有两次(而且都是微不足道的)更改。2020年6月曾讨论过删除此代码,但它当时幸存下来。从那以后,尘土飞扬的蜘蛛网只是堆积起来,可以肯定地说bpfilter目前不是一个活跃的开发领域,而且它似乎不太可能很快取代nftables。这个判断是否“正确”也很难说。也许nftables使用的专用VM比通用BPF更能解决这个问题。或者更确切地说,nftables的获胜仅仅是因为它背后的开发人员一直在积极推动项目向前发展。内核开发成功的关键之一就是保持连续性。对于像数据包过滤这样重要的子系统来说更是如此,并且知道开发人员对其进行长期投资可能会让人非常放心。