💾
LinuxのネットワークインターフェイスのMACアドレス変更
小ネタです。
以下の記事にあるようにパケットキャプチャをしました。
こんなSTPトポロジの図を描いたりパケットの動きを追っていたりしたのですが、Windowsを再起動してしまいました。
ipコマンドで作ったBridgeとかvEthernetは再起動したら消えてしまいます。
環境を再作成するスクリプト(というかコマンドの羅列)はここにあるのですが、作り直すとMACアドレスが変わってしまいます。
MACアドレスが変わるとSTPのトポロジが変わるんですね。
また図を描きなおすのは面倒なので、Bridge, vEthernetのMACアドレスを変更することにしました。
幸い、以下の記事に書いたように以前のMACアドレスは残してあったので、これをもとにMACアドレスを再設定しました。
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