关于macos:Mac OS X中的虚拟网络接口

Virtual network interface in Mac OS X

我知道您可以在Windows中创建虚拟网络接口(请参阅此处),在Linux中使用ip别名也很容易,但是Mac OS X是否存在类似的功能?我一直在寻找回送适配器,虚拟接口,但找不到一个好的解决方案。

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

在完全断开连接的情况下工作时,需要这种情况。即使这样,在VMWare安装中运行服务器时,具有联网功能也是有意义的。即使我在这些虚拟机之一中运行DNS服务器,也可以通过其IP地址访问这些虚拟机,但不能通过其DNS名称访问。通过配置使用虚拟DNS服务器的接口,我认为我可以测试某些DNS方案。不幸的是,如果没有一个接口处于非活动状态,则没有接口会解析DNS名称...


回送适配器始终打开。

ifconfig lo0别名172.16.123.1将向回送适配器添加别名IP 172.16.123.1

ifconfig lo0 -alias 172.16.123.1将其删除


特别回复:

You can create a new interface in the networking panel, based on an existing interface, but it will not act as a real fully functional interface (if the original interface is inactive, then the derived one is also inactive).

这可以通过使用psv141建议的Tun / Tap设备并基于Tun或Tap接口操纵/Library/Preferences/SystemConfiguration/preferences.plist文件以添加NetworkService来实现。 Mac OS X不允许基于虚拟网络接口创建NetworkService,但可以直接操作preferences.plist文件以手动添加NetworkService。基本上,您将在Xcode中打开preferences.plist文件(或直接编辑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的String条目(使用其他接口作为示例)。

修改preferences.plist文件后,只需重新启动,NetworkService将在SystemPreferences-> Network下可用。请注意,我们已经模仿了以太网设备,因此Mac OS X网络层会注意到"电缆已拔出",并且不允许您通过GUI激活接口。但是,由于基础设备是tun / tap设备,并且具有IP地址,因此该接口将变为活动状态,并且将在BSD级别添加正确的路由。

作为参考,它用于执行特殊的路由魔术。

如果您走得太远并且遇到麻烦,则必须通过打开/ dev /下的设备之一来创建tun / tap设备。您可以使用任何程序来执行此操作,但我本人是老式C的粉丝:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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?\
");
      return -1;
   }
   while (1)
   {
      sleep(100000);
   }
   return 0;
}

关于@bmasterswizzle的BRILLIANT答案-更具体地说-关于@DanRamos的问题,该问题关于如何强制将新接口的链接状态设置为" up"。.我使用此脚本,该脚本的起源我不记得了,但是出色地工作(与@bmasterswizzles的答案" Mona Lisa"配合使用)...

1
2
3
4
5
6
7
8
9
10
11
#!/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

我不太确定我是否理解结尾处提示的更改,或者...

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

但是无所谓。有用。链接指示灯?:绿色?。喜欢它?

enter image description here


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ 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

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


如果您在开发环境中,并且想要访问已在localhost /主机上运行的某些服务。 在Mac的docker中,您还有另一个选择。在docker容器中使用docker.for.mac.localhost而不是localhost。
应该使用docker.for.mac.host.internal代替Docker Community Edition 17.12.0-ce-mac46 2018-01-09中的docker.for.mac.localhost。
这允许您从Docker容器中连接到Mac上运行的服务。请参考以下链接

了解docker.for.mac.localhost行为

发行说明


看一下本教程,它适用于FreeBSD,但也适用于OSX。http://people.freebsd.org/~arved/vlan/vlan_en.html


你是什??么意思

"but it will not act as a real fully functional interface (if the original interface is inactive, then the derived one is also inactive"

我可以创建一个新接口,将其建立在现有接口的基础上,然后禁用现有接口,新接口仍然可以使用。但是,创建第二个接口并不会创建真实的接口(当您使用ifconfig进行检查时),只会将第二个IP分配给已经存在的IP(但是,该IP可以是DHCP,而第一个IP是硬编码的)。

那么,我是否理解正确,您想创建一个接口,而不是绑定到任何实际接口?那么该接口将如何使用?例如。如果断开所有WLAN的连接并拔出所有网络电缆,那么如果将流量发送到该接口,该接口会将流量发送到哪里?也许您的问题尚不清楚,如果改写它可能会很有帮助,因此很明显,一旦拥有了这个"虚拟接口",您实际上是在尝试做什么。

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


转到网络首选项。

在网络适配器列表的底部,单击+图标

选择您想要arp的现有接口(例如,以太网1),并为新端口(例如,以太网1.1)提供所需的服务名称,然后按create。

现在,您在gui中有了新的虚拟接口,可以以常规方式管理IP地址等。

ifconfig -a将确认您在接口上具有多个IP,并且在您重新引导时这些IP仍将存在。

它是Mac。不要打架,做起来很简单。


我采取了运行PFSense(一种基于BSD的路由器/防火墙)来实现此目标的方法。

为什么?因为OS X Server在没有静态IP的情况下变得如此怪异……

因此,在与DAYS搏斗之后,制作了NAT,DHCP和防火墙以及……

我正在尝试这是相似的...

让你知道事情的进展...


这是一个很好的指南:https://web.archive.org/web/20160301104014/http://gerrydevstory.com/2012/08/20/how-to-create-virtual-network-interface-on-mac-os -X/

基本上,您可以在系统偏好设置的"网络"窗格中选择一个网络适配器,然后单击"复制服务"齿轮。复制服务后,您可以在一个专用地址范围中手动分配一个IP。然后对其进行ping操作以确保;)


ifconfig interfacename create将创建一个虚拟接口,


推荐阅读