特に返信先:
ネットワーク パネルで、既存のインターフェースに基づいて新しいインターフェースを作成できますが、実際には完全に機能するインターフェースとしては機能しません (元のインターフェースが非アクティブの場合、派生したインターフェースも非アクティブになります)。
これは、psv141 で提案されているように Tun/Tap デバイスを使用し、/Library/Preferences/SystemConfiguration/preferences.plist
ファイルを操作して、tun または tap インターフェイスに基づいて NetworkService を追加することで実現できます。Mac OS X では、仮想ネットワーク インターフェイスに基づいて NetworkService を作成することはできませんが、preferences.plist
ファイルを直接操作して手動で NetworkService を追加することはできます。基本的にはpreferences.plist
、Xcode でファイルを開き (または XML を直接編集しますが、Xcode の方が簡単に実行できる可能性があります)、既存のイーサネット インターフェイスから構成をコピーします。新しい NetworkService を作成する場所は "NetworkServices" の下です。Mac にイーサネット デバイスがある場合は、NetworkService プロファイルもこのプロパティ エントリの下にあります。イーサネット エントリはほぼそのままコピーできます。実際に変更するフィールドは次のとおりです。
- UUID
- ユーザー定義名
- IPv4 設定を行い、インターフェイスを tun または tap デバイス (つまり、tun0 または tap0) に設定します。
- 必要に応じて DNS サーバー。
次に、この NetworkService が必要な特定の場所も操作します (Mac OS X では、「場所」に依存するすべてのネットワーク インターフェイスを構成できることを思い出してください)。デフォルトのロケーション UUID は、PropertyList のルートでキー「CurrentSet」として取得できます。必要な場所 (またはセット) を特定したら、Set プロパティを展開し、新しい NetworkService の UUID を使用して Global/IPv4/ServiceOrder の下にエントリを追加します。また、Set プロパティの下で、Service プロパティを展開し、UUID を、キー __LINK__ と UUID としての値を持つ 1 つの文字列エントリを持つディクショナリとしてここに追加する必要があります (例として他のインターフェイスを使用します)。
ファイルを変更したらpreferences.plist
、再起動するだけで、NetworkService が SystemPreferences->Network で利用できるようになります。イーサネット デバイスを模倣しているため、ネットワークの Mac OS X 層は「ケーブルが抜かれた」ことを認識し、GUI を介してインターフェイスをアクティブにできないことに注意してください。ただし、基礎となるデバイスは tun/tap デバイスであり、IP アドレスを持っているため、インターフェースがアクティブになり、適切なルーティングが BSD レベルで追加されます。
参照として、これは特別なルーティング マジックを行うために使用されます。
ここまで進んで問題が発生した場合は、/dev/ の下にあるデバイスの 1 つを開いて tun/tap デバイスを作成する必要があります。これにはどのプログラムでも使用できますが、私自身は昔ながらの C のファンです。
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fd = open("/dev/tun0", O_RDONLY);
if (fd < 0)
{
printf("Failed to open tun/tap device. Are you root? Are the drivers installed?\n");
return -1;
}
while (1)
{
sleep(100000);
}
return 0;
}