macOS のデュアルブート環境で、それぞれの OS に異なる MAC アドレスを設定する。

ネットワーク設定

ひとつの MacBook に複数の macOS をインストールしたときにそのそれぞれで異なる MAC アドレスを使いたくて SpoofMAC を使ってみました。


ひとつの MacBook に複数の macOS をインストールしたときに、普通はそれぞれの OS で同じ MAC アドレスで Wi-Fi を使う感じになると思います。ただ、それだとネットワーク接続された別の PC などにアクセスしたときに同じコンピューターだと思われてややこしくなる場面がときおりあります。

そこで、それぞれの OS 環境で異なる MAC アドレスを設定できないかと思って調べてみたところ、SpoofMAC というソフトウェアを使うと実現できるようだったので、さっそく試してみることにしました。

今回の設定で使用した機種は MacBook Air 2022 で、それに macOS 13.2 がインストールされています。

SpoofMAC のインストール

SpoofMAC をインストールする方法はいくつかあるようですけれど、今回は以前に こちら でインストールしてあったパッケージマネージャー Homebrew を使ってインストールしてみることにしました。

Homebrew が入っていればインストールは簡単で、次のコマンドを実行することで SpoofMAC が spoof-mac コマンドとして使えるようになります。

brew install spoof-mac

MAC アドレスを変更する

SpoofMAC のインストールが完了したら、次のようにして簡単に MAC アドレスを変更できました。

sudo spoof-mac randomize Wi-Fi

なお、ここでは Wi-Fi インターフェイスの MAC アドレスをテキトウな値に設定するために Wi-Fi に対して randomize を指定して spoof-mac コマンドを実行しています。

他のネットワークインターフェイスの MAC アドレスを変えたいときには、たとえば spoof-mac list コマンドを実行することで確認できる en0 みたいな具体的なデバイス名を指定する感じになるようです。

MAC アドレス変更時は、通信の切断に注意

上のようにして MAC アドレスを変更したとき、接続中の Wi-Fi が切断される様子でした。手作業で再接続する必要がある様子だったので、リモート接続などで設定を行っている場合には、通信が切断されて復帰できなくならないように配慮して作業を行う必要がありそうです。

MAC アドレスを指定したいとき

先ほどの例では MAC アドレスをランダムで設定しましたけれど、これを特定のアドレスにしたいときには、次のようにします。

sudo spoof-mac set 00:50:56:34:69:fe Wi-Fi

設定画面では、変更前の MAC アドレスが表示される

このようにして MAC アドレスを変更しても、macOS の システム環境設定 にある ネットワーク 設定からは、変更前のオリジナルな MAC アドレスだけを確認できる様子です。それでもちゃんと変更した MAC アドレスは有効になっていて、他のコンピューターと通信する際にはそれで通信が行われます。

そんな感じで設定画面の MAC アドレスと実際のそれとが違ってくるので、たとえば「ルーターの MAC フィルタリングなどに MAC アドレスを手入力する」みたいな場面では、うっかりすると無効な方の MAC アドレスを指定してしまい、思ったように動いてくれないみたいなことにもなったりする可能性があるので注意が必要そうです。

現在、どの MAC アドレスが有効になっているかについては、次のコマンドを実行することで確認できます。

spoof-mac list

アドレスを変更しているときには、このコマンドで表示された結果の中に currently set to 00:50:56:34:69:fe みたいに表示されます。

macOS 起動時に MAC アドレスを変更する

SpoofMAC で変更した MAC アドレスは、何もしなければ macOS を再起動すると元のオリジナルな MAC アドレスに戻る様子です。macOS を再起動したときにも MAC アドレスが変更されて欲しいときには LaunchDaemon を使って起動時に SpoofMAC を自動起動されるように設定します。

この設定方法については SpoofMAC の公式ドキュメントにも記されています。

プロパティーリストファイルの用意

LaunchDaemon でどのような処理をしたいかは、プロパティーリストファイルで記載します。

このファイルは決められた書式で記載する必要がありますけれど、SpoofMAC では公式でその雛形が用意されているので、それをダウンロードして微調整を行う感じで用意できます。

curl https://raw.githubusercontent.com/feross/SpoofMAC/master/misc/local.macspoof.plist > local.macspoof.plist

cat local.macspoof.plist | sed "s|/usr/local/bin/spoof-mac.py|`which spoof-mac.py`|" | tee local.macspoof.plist

この2つのコマンドを実行すると、インターネットから SpoofMAC 用のプロパティーリストファイルの雛形がこのコマンドを実行したディレクトリー内に local.macspoof.plist という名前でダウンロードされて、その内容を現在の環境に合わせて微調整されます。

プロパティーリストファイルの内容

そんなに長いファイルではなかったので抜粋すると、自分の環境では の時点では次の内容になっていました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
	    <key>Label</key>
	    <string>MacSpoof</string>

	    <key>ProgramArguments</key>
	    <array>
            <string>/opt/homebrew/bin/spoof-mac.py</string>
	        <string>randomize</string>
	        <string>en0</string>
	    </array>

	    <key>RunAtLoad</key>
	    <true/>
</dict>
</plist>

設定内容自体はシンプルで、特に大事になってくるのは RunAtLoad キーが true に設定されていることで macOS 起動時に実行されるようになっているところと、あとはその起動時に ProgramArguments で指定したコマンドが実行されるところの2箇所です。

特に後者の ProgramArguments は重要で、ここには先ほど MAC アドレスを変更するときに使った spoof-mac を、空白文字で隔てた項目毎に <string>...</string> で括って連ねたものになっています。最初のひとつ目は、先ほど実行するときに使った spoof-mac と比べて少し違った記載になっていますけれど、実質的に同等なものと思っておいて大丈夫そうです。

必要に合わせてプロパティーリストファイルを編集する

ダウンロードされた local.macspoof.plist ファイルを読んでいくと、初期の状態では「en0 インターフェイスの MAC アドレスを起動のたびにランダムな値に設定する」内容になっているのが窺えます。

これで理想通りであればこれで問題ないですし、調整したいときには spoof-mac コマンドを手動で実行したときのことを思い出して、適切なパラメーターを記載していきます。たとえば、起動のたびに Wi-Fi インターフェイスに対して 00:50:56:34:69:fe という MAC アドレスの値を設定したい場合には、その実行コマンドは sudo spoof-mac set 00:50:56:34:69:fe Wi-Fi でしたから、これに合わせた次のようなプロパティーリストファイルに書き換えます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
	    <key>Label</key>
	    <string>MacSpoof</string>

	    <key>ProgramArguments</key>
	    <array>
            <string>/opt/homebrew/bin/spoof-mac.py</string>
	        <string>set</string>
			<string>00:50:56:34:69:fe</string>
	        <string>Wi-Fi</string>
	    </array>

	    <key>RunAtLoad</key>
	    <true/>
</dict>
</plist>

このような感じに微調整したら、プロパティーリストの準備は完了です。引き続き、これをシステム登録して、macOS 起動時に MAC アドレスが自動設定されるようにしていきます。

プロパティーリストファイルを登録する

これまでに記載したようにして local.macspoof.plist ファイルを準備できたら、あとはこれを /Library/LaunchDaemons ディレクトリーに配置して、適切なアクセス権を設定してあげれば完了です。

sudo cp local.macspoof.plist /Library/LaunchDaemons

sudo chown root:wheel /Library/LaunchDaemonslocal.macspoof.plist
sudo chmod 0644 /Library/LaunchDaemonslocal.macspoof.plist

このようにすることで、macOS 起動時に用意したプロパティーリストが LaunchDaemon によって認識されて、自動的に MAC アドレスが変更された状態になってくれます。途中で手動変更したときには接続解除されて手動での再接続が必要だった Wi-Fi の接続も、この方法なら自動で行われてくれる可能性もあるようです。

MAC アドレス変更後に Wi-Fi を復帰させる

公式に案内されている手順でのインストールは終わったのですが、この場合、何かログインのタイミングによってなのか macOS 再起動後に Wi-Fi 接続が自動的には行われないことが度々ある印象でした。

何かスマートな方法で、たとえば Wi-Fi が有効化されるタイミングを加味して LaunchDaemon からの SpoofMAC 起動タイミングを調整できたりするなどして、MAC アドレス変更後にちゃんと Wi-Fi 接続が行われてくれる方法を見つけられればよかったのですが、簡単に調べる限りでは見つけられなかったので、スクリプトを自前で1つ用意して、それを LaunchDaemon で起動させるようにしてみます。

MAC アドレス変更と Wi-Fi 再有効化を行うスクリプト作成

まず、スクリプトファイルを作成します。この中では、これまでに行った spoof-mac による MAC アドレスの変更処理と、それに続けて networksetup コマンドを使った Wi-Fi の OFF → ON の処理を行います。

#!/bin/sh

DEVICE="Wi-Fi"
MAC="00:0C:29:50:C8:CE"

/opt/homebrew/bin/spoof-mac.py set "$MAC" "$DEVICE"

networksetup -setairportpower "$DEVICE" off
networksetup -setairportpower "$DEVICE" on

これをひとまず、ChangeMAC.sh という名前で現在のディレクトリーに保存しておきます。

スクリプトのインストール準備

スクリプトを用意できたので、これを先ほどのプロパティーリストのときと同じようにこのスクリプトをシステムにインストールします。

今回は /usr/local/bin ディレクトリーにインストールすることにしようと思うのですけれど、このディレクトリーが用意されていない場合もあるので、まずは次のようにしてこのディレクトリーを作成しておきます。既に存在している場合は実行してもエラーになります。

sudo mkdir /usr/local/bin

スクリプトのインストール

ここまでの準備ができたら次のコマンドを実行して、スクリプトのインストールと権限の調整を行います。

sudo cp ChangeMAC.sh /usr/local/bin
sudo chown root:wheel /usr/local/bin/ChangeMAC.sh
sudo chmod 0755 /usr/local/bin/ChangeMAC.sh 

あとは、先ほどインストールした /Library/LaunchDaemon/local.macspoof.plist の内容を変更して、今にインストールしたスクリプトを実行するように変更します。それとついでに、LaunchDaemon で使うプロパティーリストファイルの Label の値は、ドメインの表記を逆にしたみたいな感じの "Unique Identifier" を指定するのが一般的なはずなので、それも調整調整しておくことにします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
	<dict>
	    <key>Label</key>
	    <string>jp.ez-net.ChangeMAC</string>

	    <key>ProgramArguments</key>
	    <array>
            <string>/usr/local/bin/ChangeMAC.sh</string>
	    </array>

	    <key>RunAtLoad</key>
	    <true/>
</dict>
</plist>

内容を書き換えて /Library/LaunchDaemon/local.macspoof.plist に上書きしたら、これでインストール完了です。これで次の再起動時には新たに用意したスクリプトが実行されて、MAC アドレスを変更した上で Wi-Fi を OFF → ON することによって、優先的な SSID への再接続も行われるようになります。