再说一点nftables

在文章《nftables相比iptables到底改变了什么》中,我提到说nftables是一门编程语言,这个说法可能有点过于激进,随后收到了很多的邮件来咨询详情,昨天也有人提到了类似的问题,以下这个疑问比较典型:所以说有必要针对此再说两句

在文章《 nftables相比iptables到底改变了什么》中,我提到说nftables是一门编程语言,这个说法可能有点过于激进,随后收到了很多的邮件来咨询详情,昨天也有人提到了类似的问题,以下这个疑问比较典型:


所以说有必要针对此再说两句。首先,nftables包含一整套的逻辑,包括用户态nftables程序,内核态的Netfilter nft模块以及用户输入的nftables命令。三者关系如下:


如果你对nftables整套机制有足够的了解,那么不难看出,这里Netfilter nft模块负责执行“指令”,这些指令完全是由操作码和操作数构成的,非常类似Java字节码或者直接的机器指令,也就是说,Netfilter nft模块就是一个虚拟的处理器,只负责执行“ntf指令构成的程序”,至于说这个指令序列是谁喂给它的,Netfilter nft模块并不关心。有了Netfilter nft模块就好比你有了一台电脑或者一个Java虚拟机环境,要想它运转起来,需要喂给它指令序列,类似下面的这样的助记:
fetch ireg1 offset 12
cmp ireg1 0xff
je #1
...

此时,你有两个选择:
1.直接编辑二进制指令序列,然后作为buffer将其通过Netlink灌入内核的Netfilter nft模块。
2.通过一个通用的“编译器”,编辑一个“可读的程序”,交给编译器编译成二进制指令码序列,再灌入内核。

很显然,第1种方式类似20世纪50,60年代对机器编程的方式,后来就有了C语言,Java语言等等,人们几乎就接触不到指令了,显然对于nftables而言,由于其刚刚起步,印象中它也要经过一个类似的过程?其实是不必的。
        nftables天生携带了一个“编译器”,就是nftables用户态程序。这个程序会帮你把你输入的nftables命令翻译成二进制指令序列并灌入内核。不过值得一提的是,这个nftables编译器非常初级,能应对的情况比较少,仅限于nftables当年的manual所给出的那些功能。但是理论上,你可以抛弃nftables用户态程序或者对其进行修改,实现一个完整的nftables编译程序:


它的输入是C语言语法的代码,输出是Netfilter nft的指令序列,按此来讲,你用C语言写一个树匹配,还难吗?
        不过以上的只是一个愿景,本文连同前面的那篇文章呢也属于软文系列,目的只是提供一种可能性,一种思路,至于说实现,至少目前来讲,我是没有这个时间和精力的。也希望如果谁有这个打算,我们可以一起来。
编程小号
上一篇 2024-10-18 17:06
下一篇 2024-10-18 16:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/4124.html