再说一点nftables

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

再说一点nftables

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

再说一点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编译程序:

再说一点nftables

它的输入是C语言语法的代码,输出是Netfilter nft的指令序列,按此来讲,你用C语言写一个树匹配,还难吗?

        不过以上的只是一个愿景,本文连同前面的那篇文章呢也属于软文系列,目的只是提供一种可能性,一种思路,至于说实现,至少目前来讲,我是没有这个时间和精力的。也希望如果谁有这个打算,我们可以一起来。

原文链接: https://blog.csdn.net/dog250/article/details/60267161

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    再说一点nftables

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/407555

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午10:35
下一篇 2023年4月26日 上午10:36

相关推荐