在內核層,只提供了一個通用的協議無關接口,提供從數據包中提取數據、對數據進行操作和控制流量的基本功能。 過濾規則本身和特定於協議的處理程序被編譯成用戶空間字節碼,之後使用 Netlink 接口將該字節碼加載到內核中,並在類似於 BPF(Berkeley Packet Filters)的特殊虛擬機中在內核中執行。 這種方法可以顯著減少在內核級別運行的過濾代碼的大小,並將解析規則的所有功能和使用協議的邏輯移至用戶空間。
主要創新:
- 支持連接中的範圍(連接、地址和端口的特定綁定,以簡化匹配)。 例如,對於其元素是附件的“白名單”集,指定“間隔”標誌將指示該集可以包含附件中的範圍(對於附件“ipv4_addr.ipv4_addr.inet_service”,以前可以準確列出匹配如“192.168.10.35”,現在您可以指定地址組“192.68.11.123-80-192.168.10.35”):
表 ip foo {
設置白名單{
輸入 ipv4_addr 。 ipv4_地址。 inet_service
標誌間隔
元素 = { 192.168.10.35-192.168.10.40 。 192.68.11.123-192.168.11.125。 80}
}鏈條{
type filter hook 預路由優先過濾器; 政策下降;
知識產權地址。 ip 爸爸。 tcp dport@whitelist 接受
}
} - 在集合和映射列表中,可以使用“typeof”指令,它確定映射時元素的格式。
例如:表 ip foo {
設置白名單{
ip地址類型
元素 = { 192.168.10.35, 192.168.10.101, 192.168.10.135 }
}鏈條{
type filter hook 預路由優先過濾器; 政策下降;
ip daddr @whitelist 接受
}
}表 ip foo {
地圖 addr2mark {
typeof ip saddr : 元標記
元素 = { 192.168.10.35 : 0x00000001, 192.168.10.135 : 0x00000002 }
}
} - 添加了在 NAT 綁定中使用附件的功能,這允許您在基於映射列表或命名集定義 NAT 轉換時指定地址和端口:
nft 添加規則 ip nat pre dnat ip addr。 端口到 ip saddr 映射 { 1.1.1.1 : 2.2.2.2 . 三十 }
nft 添加地圖 ip nat 目的地 { 輸入 ipv4_addr 。 inet_service : ipv4_addr 。 inet_服務\\; }
nft 添加規則 ip nat pre dnat ip addr。 端口到 ip saddr 。 tcp dport 映射@destinations - 支持硬件加速,去除網卡肩上的一些過濾操作。 加速通過 ethtool 實用程序(“ethtool -K eth0 hw-tc-offload on”)啟用,之後使用“offload”標誌在主鏈的 nftables 中激活。 使用 Linux 5.6 內核時,結合接收、丟棄、複製 (dup) 和轉發 (fwd) 數據包,支持頭字段匹配和傳入接口檢查的硬件加速。 在下面的示例中,丟棄來自地址 192.168.30.20 的數據包的操作是在網卡級別執行的,而不會將數據包傳遞給內核:
# 貓文件.nft
表 netdev x {
鏈 y {
type filter hook 入口設備 eth0 優先級 10; 標誌卸載;
ip saddr 192.168.30.20 下降
}
}
# nft -f 文件.nft - 改進了有關規則中錯誤位置的信息。
# nft 刪除規則 ip yz handle 7
錯誤:無法處理規則:沒有這樣的文件或目錄
刪除規則 ip yz handle 7
^# nft 刪除規則 ip xx handle 7
錯誤:無法處理規則:沒有這樣的文件或目錄
刪除規則 ip xx handle 7
^# nft 刪除表 twst
錯誤:沒有那個文件或目錄; 您是說家庭 ip 中的表“測試”嗎?
刪除表扭曲
^^^^第一個示例顯示系統中不存在表“y”,第二個示例顯示缺少“7”處理程序,第三個示例在鍵入表名時顯示拼寫錯誤提示。
- 添加了通過指定“meta sdif”或“meta sdifname”檢查從接口的支持:
… 元 sdifname vrf1 …
- 添加了對右移或左移操作的支持。 例如,要將現有數據包標籤左移 1 位並將較低位設置為 1:
... 元標記集元標記 lshift 1 或 0x1 ...
- 實施“-V”選項以顯示擴展版本信息。
#nft-V
nftables v0.9.4(五點鐘)
cli:readline
JSON:是的
迷你版:沒有
libxtables:是的 - 現在必須在命令之前要求命令行選項。 比如需要指定“nft -a list ruleset”,運行“nft list ruleset -a”會報錯。
來源: opennet.ru