根据目标 mac 地址使用 iptables 标记数据包

根据目标 mac 地址使用 iptables 标记数据包

我需要标记发往指定 mac 地址的数据包。

我需要这个来在整形器中使用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 地址的数据包。这是错误的方向,因为你感兴趣的是发往这个 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 两个方向都有效(!)

也可以看看基于发送方 MAC 地址的 Linux 策略路由这是这个答案的灵感来源。

答案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 协议使用 MAC 地址,与 IP 协议不同。

相关内容