經過一年的發展
核心層僅提供通用的與協定無關的接口,提供從資料包中提取資料、執行資料操作和流量控制的基本功能。
過濾邏輯本身和特定於協定的處理程序在使用者空間中編譯為字節碼,然後使用Netlink 介面將該字節碼載入到核心中,並在特殊的虛擬機器(類似於BPF(伯克利資料包過濾器))中執行。 這種方法可讓您大幅減少在核心層級執行的過濾程式碼的大小,並將用於處理協定的解析規則和邏輯的所有功能移至使用者空間。
主要創新:
- IPsec 支持,允許根據資料包、IPsec 請求 ID 和 SPI(安全參數索引)標籤來匹配隧道位址。 例如,
... ip Saddr 192.168.1.0/24 中的 ipsec
... spi 中的 ipsec 1-65536也可以檢查路由是否經過IPsec 隧道。 例如,要封鎖不通過 IPSec 的流量:
… 過濾器輸出 rt ipsec 遺失丟棄
- 支援 IGMP(網際網路組管理協定)。 例如,您可以使用規則來丟棄傳入的 IGMP 群組成員身分請求
nft 新增規則 netdev foo bar igmp 類型成員資格查詢計數器下降
- 使用變數定義轉換鏈(跳轉/轉到)的可能性。 例如:
定義 dest = ber
新增規則 ip foo bar 跳轉 $dest - 支援遮罩根據標頭中的 TTL 值識別作業系統(OS Fingerprint)。 例如,若要根據發送方作業系統標記資料包,可以使用下列命令:
... 元標記設定 osf ttl 跳過名稱映射 { "Linux" : 0x1,
“Windows”:0x2,
“MacOS”:0x3,
「未知」:0x0}
... osf ttl 跳過版本“Linux:4.20” - 能夠匹配發送方的 ARP 位址和目標系統的 IPv4 位址。 例如,要增加從位址 192.168.2.1 發送的 ARP 封包的計數器,可以使用下列規則:
表 arp x {
鏈 y {
type過濾器鉤子輸入優先權過濾器; 政策接受;
arp Saddr ip 192.168.2.1 計數器封包 1 位元組 46
}
} - 支援透過代理(tproxy)透明轉發請求。 例如,要將對連接埠 80 的呼叫重定向到代理端口 8080:
表 ip x {
鏈 y {
類型過濾器鉤子預路由優先權-150; 政策接受;
tcp dport 80 tproxy 到:8080
}
} - 支援標記套接字,並能夠在 SO_MARK 模式下透過setsockopt()進一步取得設定標記。 例如:
表 inet x {
鏈 y {
類型過濾器鉤子預路由優先權-150; 政策接受;
tcp dport 8080 標記 設定套接字標記
}
} - 支援指定鏈的優先權文字名稱。 例如:
nft add chain ip x raw { 類型過濾器鉤子預先路由優先權 raw; }
nft add chain ip x filter { 類型過濾器鉤子預路由優先權過濾器; }
nft add chain ip x filter_later { 類型過濾器鉤子預先路由優先權過濾器 + 10; } - 支援 SELinux 標籤 (Secmark)。 例如,要在 SELinux 上下文中定義「sshtag」標籤,您可以執行:
nft 新增 secmark inet 過濾器 sshtag“system_u:object_r:ssh_server_packet_t:s0”
然後在規則中使用這個標籤:
nft 新增規則 inet 過濾器輸入 tcp dport 22 元 secmark 設定“sshtag”
nft 新增映射 inet 篩選器 secmap { 類型 inet_service : secmark; }
nft 新增元素 inet 過濾器 secmapping { 22 : "sshtag" }
nft 新增規則 inet 過濾器輸入元 secmark 設定 tcp dport 映射 @secmapping - 能夠以文字形式指定分配給協定的端口,如 /etc/services 檔案中定義的那樣。 例如:
nft 新增規則 xy tcp dport“ssh”
nft 清單規則集 -l
表 x {
鏈 y {
...
TCP 資料連接埠“ssh”
}
} - 能夠檢查網路介面的類型。 例如:
新增規則 inet raw 預先路由元 iifkind "vrf" 接受
- 透過明確指定「動態」標誌,改進了對動態更新集內容的支援。 例如,要更新集合“s”以新增來源位址,並在 30 秒內沒有資料包時重設條目:
添加表x
新增設定 xs { 類型 ipv4_addr; 尺寸 128; 超時30s; 動態標誌; }
新增鏈 xy { 類型過濾器鉤子輸入優先權 0; }
新增規則 xy update @s { ip Saddr } - 能夠設定單獨的超時條件。 例如,要覆寫到達連接埠 8888 的封包的預設逾時,您可以指定:
表 ip 過濾器 {
ct 超時激進-tcp {
TCP 協定;
l3proto ip;
策略 = {已建立:100,close_wait:4,關閉:4}
}
鏈輸出{
...
tcp dport 8888 ct 逾時設定“aggressive-tcp”
}
} - 對 inet 系列的 NAT 支援:
表 inet nat {
...
ip6 baddr 死亡::2::1 dnat 死亡:2::99
} - 改進的拼字錯誤報告:
nft添加鍊式過濾器測試
錯誤:沒有這樣的檔案或目錄; 您指的是家庭 ip 中的「篩選器」表嗎?
新增鍊式過濾器測試
^^^^^^ - 能夠在集合中指定介面名稱:
設定 SC {
輸入 inet_service 。 如果名稱
元素= {“ssh”。 “eth0”}
} - 更新了 Flowtable 規則語法:
nft 新增表 x
nft add flowtable x ft { 鉤子入口優先權 0; 設備 = { eth0, wlan0 }; }
...
nft 新增規則 x 轉送 ip 協定 { tcp, udp } flow add @ft - 改進了 JSON 支援。
來源: opennet.ru