为什么你会喜欢 nftables? - 开源中国社区
Float_left Icon_close
为什么你会喜欢 nftables?
oschina 2014年02月18日

为什么你会喜欢 nftables?

oschina oschina 发布于2014年02月18日 收藏 63 评论 16

Linux 3.13 带来了很多特性。nftables也是第一次正式发布。nftables是一个致力于替换现有的{ip,ip6,arp,eb}tables框架(也就是大家熟知的iptables)的项目。然而,Linux3.13中的nftables版本还是不完整的,还缺少一些重要的特性。这些特性会在后续的Linux版本中发布。大多数场景下nftables已经可以使用,但是完整的支持(即,nftables优先级高于iptables)应该在Linux 3.15。

nftables引入了一个新的命令行工具nft。nft是iptables及其衍生指令(ip6tables,arptables)的超集。同时,nft拥有完全不同的语法。是的,如果你习惯于iptables,这是个不好的消息。但是有一个兼容层允许你使用iptables,而过滤是由内核中的nftables完成的。

到目前为止,只有非常少的文档资料。你可以找到我的nftables快速开始,其他的一些初步文档很快就会公开。

一些命令行例子

一行多个目标

加入你想用iptables记录并丢弃一个包,你必须写两条规则,一条记录,一条丢弃:

iptables -A FORWARD -p tcp --dport 22 -j LOG
iptables -A FORWARD -p tcp --dport 22 -j DROP

使用nft,你可以把两个目标合并到一起:

nft add rule filter forward tcp dport 22 log drop

方便创建集合

假如你想针对不同的端口允许包并且允许不同的icmpv6类型。使用iptables,你需要使用类似如下的规则:

ip6tables -A INPUT -p tcp -m multiport --dports 23,80,443 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT

使用nft,集合可以用在规则中任一元素:

nft add rule ip6 filter input tcp dport {telnet, http, https} accept
nft add rule ip6 filter input icmpv6 type { nd-neighbor-solicit, echo-request, nd-router-advert, nd-neighbor-advert } accept

这样更容易编写,而且对于过滤方更加高效,因为对每一种协议只需要添加一个规则。

你也可以给集合命名,以便在其他地方使用:

# nft -i # use interactive mode
nft> add set global ipv4_ad { type ipv4_address;}
nft> add element global ipv4_ad { 192.168.1.4, 192.168.1.5 }
nft> add rule ip global filter ip saddr @ipv4_ad drop

之后,当检测到一个新的破坏者时:

# nft -i
nft> add element global ipv4_ad { 192.168.3.4 }

 

映射

nftables的一个高级特性就是映射。可以使用不同类型的数据并映射它们。例如,我们可以映射网络端口到专用的规则集合(之前创建的存储在一个链中)。在这个例子中,链的名称为low_sec和high_sec:

# nft -i
nft> add map filter jump_map { type ifindex : verdict; }
nft> add element filter jump_map { eth0 : jump low_sec; }
nft> add element filter jump_map { eth1 : jump high_sec; }
nft> add rule filter input iif vmap @jump_map

现在,比如说你有一个新的动态端口ppp1,对它做过滤非常简单,仅仅把它加到jump_map映射中就可以了。

nft> add element filter jump_map { ppp1 : jump low_sec; }

运维和内核方面

更新速度更快

在iptables中添加一条规则,会随着规则数量增多而变得非常慢,这也就解释了为什么调用iptables的脚本需要花很久才完成。这种状况对nftables而言就不存在了。nftables使用原子的快速操作来更新规则集合。

内核更新更少

使用iptables,每一个匹配或投递都需要内核模块的支持。因此,如果你忘记一些东西或者要添加新的功能时都需要重新编译内核。nftables就不存在这种状况了。在nftables中,大部分工作是在用户态完成的,内核只知道一些基本指令(过滤是用伪状态机实现的)。例如,icmpv6支持是通过nft工具的一个简单的补丁实现的。在iptables中这种类型的更改需要内核和iptables都升级才可以。

原文链接: regit   翻译: 伯乐在线 - Codefor
译文链接: http://blog.jobbole.com/59624/

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:为什么你会喜欢 nftables?
分享
评论(16)
最新评论
0

引用来自“bhzhu203”的评论

安装“iptables-nftables” 兼容性工具,非常方便,操作和iptables一样,命令和iptables一样。

安装上Linux 3.13 以上的版本内核后,

git clone git://git.netfilter.org/iptables-nftables

./autogen.sh
./configure --prefix=/usr
make && sudo make install

这样安装上去会替换掉原来的iptables,但有时会遗留旧iptables的lib,导致终端输入“iptables”会报错。

ldd /usr/sbin/iptables

一般是libip6tc.so.0、libip4tc.so.0报错。发现不是 /usr/lib 位置的lib(so.文件),就可以先备份,再删除。

这样直接输入iptables的命令,使用nftables啦


good!
0
以后肯定就是用它了,提早了解一下。
0
性能问题有解决吗?
0
REHL7中集成么
0
安装“iptables-nftables” 兼容性工具,非常方便,操作和iptables一样,命令和iptables一样。

安装上Linux 3.13 以上的版本内核后,

git clone git://git.netfilter.org/iptables-nftables

./autogen.sh
./configure --prefix=/usr
make && sudo make install

这样安装上去会替换掉原来的iptables,但有时会遗留旧iptables的lib,导致终端输入“iptables”会报错。

ldd /usr/sbin/iptables

一般是libip6tc.so.0、libip4tc.so.0报错。发现不是 /usr/lib 位置的lib(so.文件),就可以先备份,再删除。

这样直接输入iptables的命令,使用nftables啦


0
记录一下
0
nice
0
牛X(≧∇≦)
0
Linux网络相关的命令风格越来越趋近于交换机路由器
0
这个东西肯定是要学习的,作为未来LINUX防火墙功能的核心命令是必须要学习的!!
0
值得学习一下
0
希望能改变文档落后的面貌。
0
非常不错
0
新东西,学习一下,27天前发布0.099
0
good
0
nice
顶部