再说一点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语言写一个树匹配,还难吗?
        不过以上的只是一个愿景,本文连同前面的那篇文章呢也属于软文系列,目的只是提供一种可能性,一种思路,至于说实现,至少目前来讲,我是没有这个时间和精力的。也希望如果谁有这个打算,我们可以一起来。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值