Linux

跨網路命名空間的 Linux 數據包標記

  • May 31, 2022

我正在嘗試使用 iptablesmangle在給定主機的表中對某個源/目標 IP 的數據包進行分組標記。數據包稍後會被轉發到同一主機上的特定網路命名空間,但我在該網路命名空間中安裝的 iptables 規則並沒有得到標記。因此,我想知道:數據包標記是否僅位於標記所在的網路名稱空間的本地?我的印像是,由於標記是與 skb 關聯的“屬性”,因此核心將跟踪標記在主機上路由的任何位置,而與命名空間無關。

或者,有人對如何調試有任何想法嗎?我在我的目標網路命名空間內安裝了一條TRACE規則,但我的印像是我需要執行dmesg才能查看輸出,這對網路命名空間沒有多大意義。

數據包標記是否僅位於標記所在的網路名稱空間的本地?

是的。該標記是網路命名空間的本地標記。每個命名空間都有一個獨立的網路堆棧,因此當一個數據包從一個命名空間傳輸到另一個命名空間時,它就像是通過網路傳輸:沒有標記保留。

我在網路命名空間內安裝了一條 TRACE 規則

這取決於…

如果使用iptables-legacy’sTRACE目標,則選擇是有限的:

  • 預設情況下,只有初始網路命名空間可以將 netfilter 事件記錄到dmesg
  • 或者所有網路名稱空間都將記錄到sysctl -w net.netfilter.nf_log_all_netns=1dmesg *,*當大量網路名稱空間生成大量日誌時,這可能是一個問題

這是因為dmesg不是每個命名空間而是全域的,並且將日誌發送到dmesg最初是TRACE.

現在,如果使用nftablesnftrace語句或 using ,則使用 (netfilter) netlink 套接字 API替換iptables-nft先前使用目標發送消息的方法,該API是命名空間感知的並且僅發送給偵聽器(即:多播)。TRACE

這意味著當nft變體如下所示:

# iptables-nft -V
iptables v1.8.7 (nf_tables)

但不是像下面這樣的舊變體:

# iptables-legacy -V
iptables v1.8.7 (legacy)

被使用,然後跟踪不再發送到dmesg,而是可以被擷取xtables-monitor --trace。再次:xtables-monitor僅適用iptables-nftiptables.

在這種情況下,並行調試由ip netns add ..., 創建的多個網路命名空間的一種方法是並行執行多次xtables-monitor,每個網路命名空間一次,並寫入單獨的日誌,或者例如用於ts標記輸出的每一行以具有時間戳並標識每個命名空間,以便在以後需要時輕鬆拆分結果。

netns foo barbaz是這樣的:

for ns in foo bar baz; do
   ip netns exec "$ns" xtables-monitor --trace | ts -s "%.s $ns" &
done

pkill xtables-monitor以後可能需要。)

網路命名空間不是通過ip netns add一個可以替換ip netns exec的方式創建的,nsenter而且通常涉及來自創建它們的應用程序的資訊(docker inspectlxc-info

相反,使用nftablesnft monitor trace時的命令在網路命名空間方面表現相同。實際上nft monitor trace也會顯示由iptables-nftTRACE目標創建的跟踪,因為它是相同的 API。

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