按目標 MAC 位址使用 iptables 標記封包

按目標 MAC 位址使用 iptables 標記封包

我需要標記發送到指定 MAC 位址的封包。

我需要這個在 shaper 中使用tc

--mac-destination不存在於iptables.

我也嘗試使用ebtables

ebtables -t nat -A POSTROUTING -d 9c:4e:36:aa:bb:cc -j mark --set-mark 0x2003 --mark-target ACCEPT

但它沒有標記任何東西(至少ebtables -t nat -L --Lc顯示了 0 個計數器)

請幫忙!太感謝了!

答案1

訣竅是將 iptables--mac-source與以下內容結合CONNMARK

  • 首先用於--mac-source匹配來自您感興趣的 mac 位址的資料包。
  • 用於CONNMARK標記整個連接,即兩個方向(!)和
  • 從連接標記設定標記--restore-mark


# lan interface
if_lan=eth0

# create 'mark_mac' table for marking connections:
iptables -t mangle -N mark_mac
iptables -t mangle -A mark_mac -j MARK --set-mark 1234
iptables -t mangle -A mark_mac -j CONNMARK --save-mark

# mark connections involving mac address:
iptables -t mangle -A PREROUTING -i $if_lan -m state --state NEW -m mac --mac-source 9c:4e:36:aa:bb:cc -j mark_mac

# mark packets going to mac:
iptables -t mangle -A POSTROUTING -o $if_lan -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark


最初我認為這僅適用於源自 lan 的 tcp 連接,但考慮到--state NEW它的定義,它應該適用於 tcp 和 udp 的兩個方向(!)

也可以看看Linux 上基於發送者 MAC 位址的策略路由這就是這個答案的靈感。

答案2

iptables工作在 OSI 第 3 層,因此它對 MAC 位址一無所知。

事實上,它確實有一個mac模組,但是僅包含進一步的過濾器--mac-source:這是因為傳入的乙太網路封包確實攜帶其來源的 MAC 位址。然而,對於透過 wifi 傳入的封包來說,這樣的 MAC 位址並不存在,並且與傳出封包無關。上面的參考文獻指出:

請注意,這僅對來自乙太網路裝置並進入 PREROUTING、FORWARD 或 INPUT 鏈的資料包有意義。

至於ebtables,首先它只能用於乙太網路幀,因為 wifi 幀會丟失一個 MAC 位址。其次,正如我上面所說,MAC來源位址不存在於IP封包中。

如果你想控制ARP封包,很快就會發現有指令

arp-mac-dst [!] 位址[/遮罩]

(R)ARP MAC 目標位址規範

但是,這又是因為 ARP 協議與 IP 協定不同,使用 MAC 位址。

相關內容