nftables初探

月初的时候,Debian开发组的 aborrero (Arturo Borrero Gonzalez) 发了一篇文章介绍了Debian Stretch (Debian 9) 引入的新模块 – NFtable. 这个旨在替代Iptables的Linux防火墙管理模块,从2014年开始进入Linux 3.13内核到现在伴随着Debian 9 stable的发布,再次得到关注。

Nftableswiki上,有如下的优势总结:

  1. 针对不同协议,避免规则重复与统一管理 (使用了setmap数据结构)
  2. 同时支持IPv6网络,对于IPv6网络管理无需额外管理。
  3. 更好的规则更新支持 (原子更新级别)
  4. 提供了Netlink-API供其他应用调用。
  5. 匹配语法更加灵活与紧凑 (参考了tcpdump等)

wiki的内容还在不断完善中,相关的问题可以参考用户邮件列表. Gitbook 上也有一篇翻译中的 ‘Nftables HOWTO 中文翻译’ 接近直译, 没有某博文说的那么传神地道。 论可读性,还不如源wiki的10分钟入门清晰明了 – Quick reference-nftables in 10 minutes

目前对于stable版本,Debian只在stretch版本(jessie-backports也有)提供nftables源, 版本v0.7-1, 要求内核版本必须大于等于 3.13, 建议大于等于 4.10。 对于想体验,但是不想升级Debian Stretch源来说,可以用下面的方法进行编译。

编译安装

echo "deb http://ftp.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/jessie-backports.list
apt-get update
aptitude install -yyy -o Aptitude::ProblemResolver::SolutionCost='100*canceled-actions,200*removals' \
    linux-image-4.9.0-0.bpo.2-amd64

aptitude install git git-core -y
aptitude install pkg-config autoconf automake libtool libmnl-dev bison flex libgmp-dev libreadline-dev -y


git clone git://git.netfilter.org/libnftn
cd libnftnl/
sh autogen.sh
./configure
make && make install
cd ../

git clone git://git.netfilter.org/nftables
cd nftables/
sh autogen.sh
./configure
make && make install

nft --version

入门小笔记

  1. nftables 结构上分为 table(表), chain(链), rule(规则), 与Iptables不一致的地方在于,table 与 chain 允许不止一个,名字也可以自由设置。
  2. table 只是存放chain的容器,不同table之间没有直接关系。
  3. 不同的chain通过priority进行选择。相同类型的链,priority数值最小、或者相同priority但是最先添加的chain作为当前有效类型的链表。
  4. chain中可以设置map, set数据结构,通过vmap、@名字进行调用。