💾

LinuxのネットワークインターフェイスのMACアドレス変更

2022/06/21に公開

小ネタです。

以下の記事にあるようにパケットキャプチャをしました。

https://zenn.dev/takai404/articles/1cd9bc85f53331

こんなSTPトポロジの図を描いたりパケットの動きを追っていたりしたのですが、Windowsを再起動してしまいました。

ipコマンドで作ったBridgeとかvEthernetは再起動したら消えてしまいます。
環境を再作成するスクリプト(というかコマンドの羅列)はここにあるのですが、作り直すとMACアドレスが変わってしまいます。
MACアドレスが変わるとSTPのトポロジが変わるんですね。

また図を描きなおすのは面倒なので、Bridge, vEthernetのMACアドレスを変更することにしました。
幸い、以下の記事に書いたように以前のMACアドレスは残してあったので、これをもとにMACアドレスを再設定しました。
https://zenn.dev/takai404/articles/d9c0e8e882405d

MACアドレス変更のコマンドはip link set ネットワークインターフェイス名 address MACアドレスです。

BridgeでもvEthernetでもコマンド構文は同じです。

ip link set access1    address 32:c8:70:0d:8a:30
ip link set access1_e2 address 32:c8:70:0d:8a:30
ip link set access1_e0 address 52:65:55:a4:d6:45
ip link set access1_e1 address d2:62:ef:5b:0d:85

Linux BridgeでMACアドレスを変えてみて気づいたことは以下の通りです。

  • Bridgeは作成時に固有のMACアドレスが設定される。
  • ポート追加時にBridgeのポートのMACアドレスの中で最小のMACアドレスがBridge本体に設定される
  • ただしポートのMACアドレスを変更しても、Bridge本体のMACアドレスは変更されない

おまけで、今後のためにMACアドレスのセーブ、リストアShellを書きました。

save_mac.shは標準出力に「network namespace,デバイス名,MACアドレス」の形式のCSVを出力します。
restore_mac.shは標準出力からそのCSVを読み込んでセットします。

save_mac.sh
#!/bin/bash -ue

# default namespace
(ip -br link show type veth; ip -br link show type bridge) \
        | awk '{gsub(/@.*/,"",$1); print ","$1","$3}' \
        | sort

# each namespaces
for ns in `ip netns | awk '{print $1}' | sort`; do
        (ip -n $ns -br link show type veth; ip -n $ns -br link show type bridge) \
                | awk '{gsub(/@.*/,"",$1); print "'$ns',"$1","$3}' \
                | sort
done
restore_mac.sh
#!/bin/bash -ue

while read line; do
        ns=`echo $line | awk -F , '{print $1}'`
        name=`echo $line | awk -F , '{print $2}'`
        mac=`echo $line | awk -F , '{print $3}'`
        opt=""
        if [ -n "$ns" ]; then
                opt="-n $ns"
        fi
        echo ip $opt link set $name address $mac
        ip $opt link set $name address $mac
done

Discussion