最近研究了下 iptables 的后继者 nftables。感觉这玩意还是挺有趣的,在用户态把网络规则编译成字节码,然后由内核的虚拟机执行。尽管和 iptables 一样都是基于 netfilter 的,但灵活性高多了。
之前使用 iptables 匹配大量数据时,还得需要 ipset 配合,而在 nftables 里内置查表查集合的功能,这点是非常方便的。
不过觉得 nftables 的槽点还是很多。
第一个就是语法太晦涩了。比如判断语句都不用加 if、查表都不用索引符号,等等。稍微长一点的语句要是不换行的话,就很难读懂了。
只能自己通过续行、缩进,来快速识别哪些是条件,哪些是动作。比如开头几行没缩进的是条件,有缩进的是动作,一行一个,这样就相对好理解一些:
当然 nftables 本质上仍是基于规则的,其实算不上语言,所以也不指望像编程那样控制网络了。
第二个是性能问题。在普通的场合下 nftables 还没有 iptables 性能高,比如这里有个测试 https://developers.redhat.com/blog/2017/04/11/benchmarking-nftables/
大致原因是 iptables 的规则是线性存储的,访问会更快一些。(当然添加删除时会慢得多)
这就是很大一个槽点了,既然都用字节码了,为什么不再加个 JIT 编译器,编译成机器指令呢。事实上 iptables 里对于复杂的匹配,还可以使用 BPF 匹配器(类似 tcpdump 规则),那个性能还是很的。
另外最近 Linux 4.18 还真出了一个 bpfilter,据说比 nftables/iptables 都先进的。不过暂时还没使用。。。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.