在文章《
nftables相比iptables到底改变了什么》中,我提到说nftables是一门编程语言,这个说法可能有点过于激进,随后收到了很多的邮件来咨询详情,昨天也有人提到了类似的问题,以下这个疑问比较典型:
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编译程序:
不过以上的只是一个愿景,本文连同前面的那篇文章呢也属于软文系列,目的只是提供一种可能性,一种思路,至于说实现,至少目前来讲,我是没有这个时间和精力的。也希望如果谁有这个打算,我们可以一起来。
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编译程序:
不过以上的只是一个愿景,本文连同前面的那篇文章呢也属于软文系列,目的只是提供一种可能性,一种思路,至于说实现,至少目前来讲,我是没有这个时间和精力的。也希望如果谁有这个打算,我们可以一起来。