
我需要標記發送到指定 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 位址。