Nftables

聲明鏈以使用(netdev)入口掛鉤時如何使用變數作為設備名稱?

  • May 2, 2021

對於netdev過濾表的ingress 鉤子,我想將設備名稱儲存在一個變數中,但我不知何故無法弄清楚正確的語法。

它的工作原理如下:

table netdev filter {
   chain ingress {
       type filter hook ingress device ens33 priority -500;

       # ...
   }
}

…但我想用一個變數代替ens33就行:

type filter hook ingress device ens33 priority -500;

當我使用以下內容時,出現錯誤:

define extif = ens33

table netdev filter {
   chain ingress {
       type filter hook ingress device $extif priority -500;

       # ...
   }
}

錯誤內容如下:

Error: syntax error, unexpected '$', expecting string or quoted string or string with a trailing asterisk

現在我也嘗試ens*希望它類似於ens+in iptables,但隨後錯誤變為我在提供無效設備名稱時也遇到的錯誤:

Error: Could not process rule: No such file or directory
       chain ingress {
             ^^^^^^^

同樣的引用對我不起作用。該文件也沒有提供可以使其工作的線索。

如何將外部介面的名稱(或名稱)放在變數中,以便將它們用作節device上的參數type filter hook ...


核心為 5.8,系統為 Ubuntu 20.04。nftables報告為v0.9.3 (Topsy).

唉,這個功能是從nftables 0.9.7開始添加的。使用 nftables 0.9.8 測試時,您的規則集按原樣工作。

src:允許在流表和鏈設備中使用變數

此更新檔增加了對在鍊 和流表定義中使用設備變數的支持,例如。

define if_main = lo

table netdev filter1 {
   chain Main_Ingress1 {
       type filter hook ingress device $if_main priority -500; policy accept;
   }
}

簽字人:Pablo Neira Ayuso pablo@netfilter.org


netdev 系列鏈註冊到一個或多個從核心 5.5 和 nftables 0.9.3 開始)介面,這些介面必須在鏈定義之前都存在。不能使用萬用字元。

設備鏈語法略有不同:

table netdev filter {
   chain ingress {
       type filter hook ingress devices = { ens33, ens34 } priority -500;

       # ...
   }
}

或者使用nftables >= 0.9.7:

define extifs = { ens33, ens34 }

table netdev filter {
   chain ingress {
       type filter hook ingress devices = $extifs priority -500;

       # ...
   }
}

只有一個界面(例如{ ens33 }:)以先前的現有語法顯示回來。

引用自:https://unix.stackexchange.com/questions/647626