跨網路命名空間的 Linux 數據包標記
我正在嘗試使用 iptables
mangle
在給定主機的表中對某個源/目標 IP 的數據包進行分組標記。數據包稍後會被轉發到同一主機上的特定網路命名空間,但我在該網路命名空間中安裝的 iptables 規則並沒有得到標記。因此,我想知道:數據包標記是否僅位於標記所在的網路名稱空間的本地?我的印像是,由於標記是與 skb 關聯的“屬性”,因此核心將跟踪標記在主機上路由的任何位置,而與命名空間無關。或者,有人對如何調試有任何想法嗎?我在我的目標網路命名空間內安裝了一條
TRACE
規則,但我的印像是我需要執行dmesg
才能查看輸出,這對網路命名空間沒有多大意義。
數據包標記是否僅位於標記所在的網路名稱空間的本地?
是的。該標記是網路命名空間的本地標記。每個命名空間都有一個獨立的網路堆棧,因此當一個數據包從一個命名空間傳輸到另一個命名空間時,它就像是通過網路傳輸:沒有標記保留。
我在網路命名空間內安裝了一條 TRACE 規則
這取決於…
如果使用
iptables-legacy
’sTRACE
目標,則選擇是有限的:
- 預設情況下,只有初始網路命名空間可以將 netfilter 事件記錄到dmesg
- 或者所有網路名稱空間都將記錄到
sysctl -w net.netfilter.nf_log_all_netns=1
dmesg *,*當大量網路名稱空間生成大量日誌時,這可能是一個問題這是因為dmesg不是每個命名空間而是全域的,並且將日誌發送到dmesg最初是
TRACE
.現在,如果使用nftables的
nftrace
語句或 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-nft
於iptables
.在這種情況下,並行調試由
ip netns add ...
, 創建的多個網路命名空間的一種方法是並行執行多次xtables-monitor
,每個網路命名空間一次,並寫入單獨的日誌,或者例如用於ts
標記輸出的每一行以具有時間戳並標識每個命名空間,以便在以後需要時輕鬆拆分結果。netns foo bar和baz是這樣的:
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 inspect
…lxc-info
)相反,使用nftables
nft monitor trace
時的命令在網路命名空間方面表現相同。實際上nft monitor trace
也會顯示由iptables-nft的TRACE
目標創建的跟踪,因為它是相同的 API。