簡介
nftables
?是 Linux 內核中用于數據包分類的現代框架,用來替代舊的?iptables
(包括?ip6tables
,?arptables
,?ebtables
?等,統稱為 xtables)架構。nftables
?提供了更強大、更靈活以及更易于管理的規則集配置方式,使得網絡過濾和路由決策變得更加高效
適用范圍:nftables 可在 Linux 內核版本 >= 3.13 上使用。
新的命令行實用程序:nftables 提供了一個名為 nft 的新命令行實用程序,其語法與 iptables 不同。
兼容性層:nftables還提供了一個兼容性層,允許在新的 nftables 內核框架上運行 iptables 命令。
通用集合基礎設施:nftables 提供了一種通用的集合基礎設施,允許構建映射和串聯結構。可以利用這些新結構來將規則集安排在多維樹中,從而大幅減少需要檢查的規則數量,直到達到對數據包的最終操作。
nftables特點
nftables 的開發是為了解決 iptables 框架存在的一些限制,并提供增強功能來進行數據包過濾和分類。
以下是選擇 nftables 而非 iptables 的一些原因:
-
避免代碼重復:
iptables
中的許多擴展都是特定于協議的,這意味著沒有一種統一的方式來匹配數據包字段。相反,每種支持的協議都有自己的擴展。這導致代碼庫中充斥著執行類似任務的非常相似的代碼,使得代碼庫變得龐大且難以維護。nftables
通過更通用和一致的框架來整合這些功能。 -
更快的數據包分類: nftables 提供增強的通用集合和映射基礎設施,相比 iptables,可以實現更快的數據包分類。
-
簡化的雙棧 IPv4/IPv6 支持: nftables 引入了 inet 家族,使得在同一條鏈內管理 IPv4 和 IPv6 流量變得更加簡單。
-
更好的動態規則集更新支持: nftables 提供了改進的動態規則集更新支持,使得更容易管理和修改防火墻規則。
-
Netlink API 支持: nftables 為第三方應用程序提供了 Netlink API,類似于其他 Linux 網絡和 Netfilter 子系統。這樣可以更輕松地將外部工具和應用程序集成到 nftables 中。
-
語法改進: nftables 解決了 iptables 中存在的語法不一致問題,提供了更干凈、更緊湊的語法來定義規則和配置。
nftables和iptables的主要區別
語法不同
- iptables 使用基于 getopt_long() 的解析器,其中關鍵字總是以雙破折號(--)開頭,例如 --key,或者單個破折號(-)后跟一個字母,例如 -p tcp。
- nftables 則使用了一種受 tcpdump 啟發的緊湊語法。這種語法更加直觀和靈活,讓用戶能夠更輕松地編寫和理解規則。
表和鏈的完全可配置性
- iptables 預設了多個表和基礎鏈,即使你只需要其中的一個,所有的表和鏈都會被注冊。這可能導致性能問題,即使未使用的基礎鏈也可能對性能產生負面影響。
- nftables 沒有預設的表和鏈。你需要顯式地定義每個表,并且只向其中添加你明確需要的對象(鏈、集合、映射、流表和狀態對象)。這樣,你就可以只注冊你需要的基礎鏈,并根據你的特定數據包處理管道選擇表和鏈的名稱以及 netfilter 鉤子優先級。
單個規則可以執行多個操作
- iptables 的規則由匹配條件和單個目標動作組成。一旦匹配條件滿足,就會執行目標動作(如接受、拒絕或跳轉到另一個鏈)。
- nftables 的規則由零個或多個表達式后跟一個或多個語句組成。每個表達式測試數據包是否與特定的負載字段或數據包/流元數據匹配。多個表達式從左到右線性評估:如果第一個表達式匹配,則評估下一個表達式,依此類推。如果所有表達式都匹配,則執行該規則的語句。每個語句執行一個操作,如設置 netfilter 標記、計數數據包、記錄數據包或做出裁決(如接受、丟棄數據包或跳轉到另一個鏈)。與表達式一樣,多個語句也是從左到右線性評估的:單個規則可以通過使用多個語句來執行多個操作。但請注意,裁決語句會自然結束規則的執行。
沒有內置的每鏈和每規則計數器
-
在 iptables 中,計數器是內置的,用于跟蹤每個鏈和規則的匹配次數。但在 nftables 中,計數器是可選的,可以根據需要啟用它們。這種靈活性允許用戶只在需要時跟蹤特定規則或鏈的性能指標,從而節省系統資源。
更好的動態規則集更新支持
-
iptables 使用一個整體的數據塊(monolithic blob)來存儲其規則集,這意呀著在添加或刪除規則時,可能需要重新加載整個規則集,這可能會影響系統的性能。而 nftables 的規則集在內部以鏈表的形式表示,這使得添加或刪除規則時只影響相關的部分,而不會影響整個規則集的其余部分,從而簡化了內部狀態信息的維護。
簡化的雙棧 IPv4/IPv6 管理
-
nftables 的 inet 家族允許注冊能夠同時查看 IPv4 和 IPv6 流量的基礎鏈。這意味著不再需要依賴腳本來復制你的規則集以同時支持 IPv4 和 IPv6,從而簡化了配置和管理過程。
新的通用集合基礎設施
-
nftables 引入了與核心緊密集成的新的通用集合基礎設施,它允許高級配置,如映射(maps)、決策映射(verdict maps)和間隔(intervals),以實現面向性能的包分類。最重要的是,可以使用任何受支持的選擇器來對流量進行分類,這為復雜的網絡場景提供了更多的靈活性和控制力。
支持拼接
-
自 Linux 內核 4.1 版本以來,nftables 支持將多個關鍵字拼接起來,并將它們與映射和裁決映射組合使用。
無需內核升級即可支持新協議
- 在傳統的防火墻配置中,支持新協議通常需要升級內核。而 nftables 采用了新的虛擬機方法,使得支持新協議通常不需要新的內核版本,而只需要相對簡單的 nft 用戶空間軟件更新。這降低了維護成本,并提高了系統的靈活性和可擴展性。
nftables概念
表鏈的含義和我們前面所介紹的iptables是類似的,更多表與鏈相關的內容可以參考iptables基本概念
表(Tables):Nftables配置由表組成,表是規則的容器。有四種類型的表:filter、nat、mangle、和raw。
鏈(Chains):表包含多個鏈,鏈是規則的集合。Nftables中有五種默認鏈:input、output、forward、prerouting和postrouting。這些鏈用于不同的網絡包處理階段。
規則(Rules):規則是定義如何處理網絡包的指令。規則由條件(匹配條件)和操作(對匹配的包執行的操作)組成。
集合(sets):集合是一種數據結構,用于存儲IP地址、端口號等信息,以便在規則中引用。
當涉及到Nftables時,理解其基本概念和語法是非常重要的。
iptables表
表包含鏈,與 iptables 中的表不同,nftables 中沒有內置表。表的數量及其名稱由用戶決定。不過,每個表只有一個地址族,并且僅適用于該族的數據包。
表可以指定五個族之一:
nftables 族 | iptables 實用程序 |
---|---|
ip | iptables |
ip6 | ip6tables |
inet | iptables 和 ip6tables |
arp | arptables |
bridge | ebtables |
ip
(即 IPv4)是默認族,如果未指定族,則將使用該族。
要創建同時適用于 IPv4 和 IPv6 的規則,請使用?inet
。inet
?允許統一?ip
?和?ip6
?族,從而使同時定義兩者的規則更加容易。
安裝nftables
我目前使用的系統是debian 12,以下直接使用apt install nftables安裝。

配置文件
nftables包附帶了一個簡單而安全的防火墻配置,存儲在?/etc/nftables.conf
?文件中。
nftables.service
?將在啟動或啟用時從該文件加載規則。

保存配置
查看當前的 nftables 配置規則:
nft list ruleset
將輸出重定向到 /etc/nftables.conf
文件中:
nft list ruleset > /etc/nftables.conf
重新加載配置文件
nft -f /etc/nftables.confsystemctl restart nftables//也可通過該命令重啟nftables