Linux 首次引入 nftables,你可能會喜歡 nftables 的理由

jopen 10年前發布 | 16K 次閱讀 Linux

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/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!