Mac OS X中的虚拟网络接口

Han*_*gen 44 macos networking

我知道你可以在Windows中创建一个虚拟网络接口(见这里),在Linux中使用ip-aliases也很容易,但Mac OS X有类似的东西吗?我一直在寻找环回适配器,虚拟接口,但找不到一个好的解决方案.

您可以在网络面板中基于现有接口创建新接口,但它不会充当真正的全功能接口(如果原始接口处于非活动状态,则派生的接口也处于非活动状态).

在完全断开连接的情况下工作时需要此方案.即便如此,在VMWare安装中运行服务器时具有网络功能也是有意义的.这些虚拟机可以通过其IP地址访问,但不能通过其DNS名称访问,即使我在其中一个虚拟机中运行DNS服务器也是如此.通过配置接口以使用虚拟DNS服务器,我想我可以测试一些DNS场景.不幸的是,如果DNS名称都不是非活动的,那么没有接口可以解析DNS名称......

小智 56

环回适配器始终处于启用状态.

ifconfig lo0别名172.16.123.1将别名IP 172.16.123.1添加到环回适配器

ifconfig lo0 -alias 172.16.123.1将删除它

  • 这不是真正的虚拟网络接口. (4认同)

小智 22

特别回复:

您可以在网络面板中基于现有接口创建新接口,但它不会充当真正的全功能接口(如果原始接口处于非活动状态,则派生的接口也处于非活动状态).

这可以使用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
  • UserDefinedName
  • IPv4配置并设置接口到tun或tap设备(即tun0或tap0).
  • DNS服务器,如果需要.

然后,您还将操作您想要此NetworkService的特定位置(请记住,Mac OS X可以根据您的"位置"配置所有网络接口).可以在PropertyList的根中获取默认位置UUID作为键"CurrentSet".确定所需的位置(或集合)后,展开Set属性,并使用新NetworkService的UUID在Global/IPv4/ServiceOrder下添加条目.同样在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我测试了它,是的,确实如此.我可以使用这种方法通过我的WiFi共享我的OpenVPN tun0设备(来自我的以太网连接). (2认同)

Ale*_*ray 8

关于@bmasterswizzle' BRILLIANT的答案 - 更具体地说 - @DanRamos关于如何强制新界面的链接状态为"向上"的问题.我使用这个脚本,我的记忆起源我不记得,但是它的工作非常有效(与@bmasterswizzles"蒙娜丽莎"的答案)...

#!/bin/zsh

[[ "$UID" -ne "0" ]] && echo "You must be root. Goodbye..." && exit 1
echo "starting"
exec 4<>/dev/tap0
ifconfig tap0 10.10.10.1 10.10.10.255
ifconfig tap0 up
ping -c1 10.10.10.1
echo "ending"
export PS1="tap interface>"
dd of=/dev/null <&4 & # continuously reads from buffer and dumps to null
Run Code Online (Sandbox Code Playgroud)

我不太确定我理解最后对提示的更改,或者......

dd of=/dev/null <&4 & # continuously reads from buffer and dumps to null

但是无所谓.有用.链接灯:绿色 ✅. 喜欢它.

在此输入图像描述

  • 它给我以下错误:第5行:/ dev / tap0:不允许操作 (3认同)

小智 5

可以使用TUN/TAP设备. http://tuntaposx.sourceforge.net/


小智 5

其他一些人似乎暗示了这一点,但下面演示了在OS X 10.9.5上使用ifconfig创建vlan并在虚拟接口上测试DNS(使用minidns):

$ sw_vers -productVersion
10.9.5
$ sudo ifconfig vlan169 create && echo vlan169 created
vlan169 created
$ sudo ifconfig vlan169 inet 169.254.169.254 netmask 255.255.255.255 && echo vlan169 configured
vlan169 configured
$ sudo ./minidns.py 169.254.169.254 &
[1] 35125
$ miniDNS :: * 60 IN A 169.254.169.254


$ dig @169.254.169.254 +short test.host
Request: test.host. -> 169.254.169.254
Request: test.host. -> 169.254.169.254
169.254.169.254
$ sudo kill 35125
$ 
[1]+  Exit 143                sudo ./minidns.py 169.254.169.254
$ sudo ifconfig vlan169 destroy && echo vlan169 destroyed
vlan169 destroyed
Run Code Online (Sandbox Code Playgroud)


Mec*_*cki 1

你是什​​么意思

“但它不会充当真正的全功能界面(如果原始界面处于非活动状态,则派生界面也处于非活动状态”

我可以创建一个新界面,将其基于现有界面,然后禁用现有界面,新界面仍然可以工作。然而,创建第二个接口并不会创建一个真正的接口(当您使用 ifconfig 检查时),它只会将第二个 IP 分配给已经存在的接口(但是,这个接口可以是 DHCP,而第一个接口例如是硬编码的)。

那么我对你的理解是否正确,你想创建一个接口,而不绑定到任何真实的接口?那么这个接口如何使用呢?例如,如果您断开所有 WLAN 并拉动所有网络电缆,如果您向该接口发送流量,那么该接口会将流量发送到哪里?也许你的问题有点不清楚,如果重新表述它可能会有很大帮助,所以一旦你拥有这个“虚拟界面”,你就很清楚你实际上想用它做什么。

正如您在问题中提到的“别名 IP”,这意味着别名接口。但别名接口始终绑定到真实接口。不同之处在于,在 Linux 中,这样的接口实际上一个接口(例如 eth0 的别名接口可以是 eth1),而在 Mac 上,没有创建真正的接口,而是创建一个虚拟接口,可以独立配置和使用,但它物理上仍然是相同的接口,因此不会生成新的命名接口(您只有两个接口,实际上都是 en0,但都可以独立启用/禁用和配置)。