特别回复:
您可以在网络面板中基于现有接口创建新接口,但它不会充当真正的全功能接口(如果原始接口处于非活动状态,则派生的接口也将处于非活动状态)。
这可以使用 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 属性,并在 Global/IPv4/ServiceOrder 下添加具有新 NetworkService 的 UUID 的条目。同样在 Set 属性下,您需要展开 Service 属性并在此处添加 UUID 作为字典,其中包含一个带有键 __LINK__ 和值作为 UUID 的字符串条目(以其他接口为例)。
修改preferences.plist
文件后,只需重新启动,NetworkService 将在 SystemPreferences->Network 下可用。请注意,我们模拟了以太网设备,因此 Mac OS X 网络层会注意到“电缆已拔出”,并且不会让您通过 GUI 激活接口。然而,由于底层设备是一个 tun/tap 设备并且它有一个 IP 地址,接口将变为活动状态,并且将在 BSD 级别添加正确的路由。
作为参考,这用于执行特殊的路由魔术。
如果您走到这一步并且遇到问题,您必须通过打开 /dev/ 下的设备之一来创建 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;
}