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記錄並丟棄一個包,你必須寫兩條規則,一條記錄,一條丟棄:
1 2 |
iptables -A FORWARD -p tcp --dport 22 -j LOG iptables -A FORWARD -p tcp --dport 22 -j DROP |
使用nft,你可以把兩個目標合併到一起:
1 |
nft add rule filter forward tcp dport 22 log drop |
方便建立集合
假如你想針對不同的埠允許包並且允許不同的icmpv6型別。使用iptables,你需要使用類似如下的規則:
1 2 3 4 5 |
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,集合可以用在規則中任一元素:
1 2 |
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 |
這樣更容易編寫,而且對於過濾方更加高效,因為對每一種協議只需要新增一個規則。
你也可以給集合命名,以便在其他地方使用:
1 2 3 4 |
# 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 |
之後,當檢測到一個新的破壞者時:
1 2 |
# nft -i nft> add element global ipv4_ad { 192.168.3.4 } |
對映
nftables的一個高階特性就是對映。可以使用不同型別的資料並對映它們。例如,我們可以對映網路埠到專用的規則集合(之前建立的儲存在一個鏈中)。在這個例子中,鏈的名稱為low_sec和high_sec:
1 2 3 4 5 |
# 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對映中就可以了。
1 |
nft> add element filter jump_map { ppp1 : jump low_sec; } |
運維和核心方面
更新速度更快
在iptables中新增一條規則,會隨著規則數量增多而變得非常慢,這也就解釋了為什麼呼叫iptables的指令碼需要花很久才完成。這種狀況對nftables而言就不存在了。nftables使用原子的快速操作來更新規則集合。
核心更新更少
使用iptables,每一個匹配或投遞都需要核心模組的支援。因此,如果你忘記一些東西或者要新增新的功能時都需要重新編譯核心。nftables就不存在這種狀況了。在nftables中,大部分工作是在使用者態完成的,核心只知道一些基本指令(過濾是用偽狀態機實現的)。例如,icmpv6支援是通過nft工具的一個簡單的補丁實現的。在iptables中這種型別的更改需要核心和iptables都升級才可以。