宛先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 NEWTCP と UDP の両方向で機能するはずです (!)

参照送信元 MAC アドレスに基づく Linux 上のポリシー ルーティングそれがこの答えのインスピレーションとなりました。

答え2

iptablesOSI レイヤー 3 で動作するため、MAC アドレスについてはまったく認識しません。

実際、それはmacモジュールただし、これには追加のフィルタのみが含まれています--mac-source。これは、入ってくるイーサネット パケットが送信元の MAC アドレスを運ぶためです。ただし、このような MAC アドレスは Wi-Fi 経由で入ってくるパケットには存在せず、送信パケットには関係ありません。上記の参照には次のように記載されています。

これは、イーサネット デバイスから送信され、PREROUTING、FORWARD、または INPUT チェーンに入るパケットに対してのみ意味があることに注意してください。

に関してはebtables、まず、Wi-Fi フレームには 1 つの MAC アドレスが欠けているため、イーサネット フレームでのみ使用できます。次に、上で述べたように、MAC 送信元アドレスは IP パケットには存在しません。

ARPパケットを制御したい場合、命令があることがすぐにわかるでしょう。

arp-mac-dst [!] アドレス[/マスク]

(R)ARP MAC宛先アドレス指定

しかし、これはARPプロトコルがするIP プロトコルとは異なり、MAC アドレスを使用します。

関連情報