Mac OS X 中的虚拟网络接口

Posted

技术标签:

【中文标题】Mac OS X 中的虚拟网络接口【英文标题】:Virtual network interface in Mac OS X 【发布时间】:2010-09-10 09:19:22 【问题描述】:

我知道你可以在 Windows 中创建一个虚拟网络接口(请参阅here),在 Linux 中使用 ip-aliases 也很容易,但 Mac OS X 是否存在类似的东西?我一直在寻找环回适配器、虚拟接口,但找不到好的解决方案。

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

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

【问题讨论】:

关于你的同一个话题,或多或少compileyouidontevenknowyou.blogspot.com/2009/03/… 【参考方案1】:

环回适配器始终处于启动状态。

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

ifconfig lo0 -alias 172.16.123.1 将删除它

【讨论】:

这对于创建别名是正确的,但据我所知,您无法定义链接到环回适配器的 DNS 服务器,因此如上所述在我的场景中它不起作用。 对我来说这是最好的解决方案。所以我可以从主机ping到虚拟机,反之亦然。【参考方案2】:

特别回复:

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

这可以通过使用 psv141 建议的 Tun/Tap 设备来实现,并操作 /Library/Preferences/SystemConfiguration/preferences.plist 文件以添加基于 tun 或 tap 接口的 NetworkService。 Mac OS X 不允许创建基于虚拟网络接口的 NetworkService,但可以直接操作 preferences.plist 文件手动添加 NetworkService。基本上你会在 Xcode 中打开 preferences.plist 文件(或直接编辑 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 作为字典,其中包含一个 String 条目,键为 __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;

【讨论】:

此解决方案是否允许您打开“Internet 共享”以将 Tap 接口桥接到以太网或机场接口? 我已经测试过了,是的,确实如此。我能够使用这种方法通过我的 WiFi 共享我的 Open*** tun0 设备(来自我的以太网连接)。 注意:我在 vmnet(VMware 虚拟网络适配器)上进行了尝试,但无法通过 IP 激活它。 (如讨论的与 tun/tap 设备一起使用,此解决方案确实有效) 有没有办法解决“电缆被拔掉”的问题?我按照说明进行操作,它们运行良好,但是在“拔掉电缆”的情况下,OS X 认为主机处于离线状态,尝试导航到浏览器中的任何站点都会告诉我没有互联网连接。【参考方案3】:

关于@bmasterswizzle 的BRILLIANT answer - 更具体地说 - 到@DanRamos' 关于如何强制新接口的链接状态为“up”的问题.. 我使用这个脚本,我不能回想一下,但效果非常好(与@bmasterswizzles "Mona Lisa" of answers协调)...

#!/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 &lt;&amp;4 &amp; # continuously reads from buffer and dumps to null

但无论如何。有用。链接灯?:绿色✅。 喜欢它?。

【讨论】:

如何销毁水龙头适配器(通过脚本)? 如果你想做一个 Python 实现,你可能想使用***.com/a/15139727/1097104 作为基础。 它给了我以下错误:第 5 行:/dev/tap0: Operation not allowed【参考方案4】:

其他一些人似乎暗示了这一点,但以下演示了在 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

【讨论】:

【参考方案5】:

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

【讨论】:

用户 yar 通过一篇博文提出了类似的建议。我看过了,但我没有测试它,因为没有时间,我不再需要了。不过谢谢。【参考方案6】:

如果您在开发环境中并希望访问已在 localhost/主机上运行的某些服务。在 docker for mac 中你有另一个选项。在 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 上运行的服务。请参阅下面的链接

understanding the docker.for.mac.localhost behavior

release notes

【讨论】:

非常感谢!【参考方案7】:

什么意思

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

?

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

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

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

【讨论】:

【参考方案8】:

看看这个教程,它适用于 FreeBSD,但也适用于 OS X。http://people.freebsd.org/~arved/vlan/vlan_en.html

【讨论】:

【参考方案9】:

转到网络首选项。

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

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

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

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

它是 Mac。不要打它,做简单的方法。

【讨论】:

如原始问题中所述,这并没有达到与物理接口隔离的虚拟接口的预期效果。您描述的命令只是使用第二个 IP 配置为同一物理接口添加别名。【参考方案10】:

我已经求助于运行 PFSense,一个基于 BSD 的路由器/防火墙来实现这个目标......

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

所以在与它搏斗了 DAYS 以制作 NAT、DHCP 和防火墙之后......

我正在尝试这是相似之处……

会告诉你进展如何...

【讨论】:

【参考方案11】:

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

【讨论】:

你能提供一个例子吗?如果我尝试这样做,它不会起作用,而且据我所知从未起作用。 ifconfig vlan0 create 如 ifconfig 手册页 "create 创建指定的网络伪设备。如果给出的接口没有单元号,请尝试创建一个具有任意单元号的新设备。 " 它不会工作,因为上面的 vlan0 不能被激活(状态),所以它不会收到任何数据包...... 嗯,您的问题与虚拟界面有关,没有任何迹象表明您想用它做什么,这就是我回答的具体内容。此功能适用于 vlan,您可以执行 ifconfig vlan0 vlan sometag vlandev en0 ipconfig set vlan0 DHCP 如果 vlan 是您的目标。 @HansDoggen你知道为什么vlan接口不能激活吗?【参考方案12】:

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

基本上,您在系统偏好设置的“网络”窗格中选择一个网络适配器,然后单击齿轮以“复制服务”。复制服务后,您可以在其中一个私有地址范围内手动分配 IP。然后ping它以确保;)

【讨论】:

原帖请求帮助创建一个NEW 虚拟网络接口,而不是要求为现有 网络接口。 我同意这个问题清楚地指定了一个虚拟接口,我的回答和我提供的链接没有在虚拟接口和物理接口之间划定。然而,这个问题并没有特别要求任何这些。它要求“类似于”在 Windows 中制作虚拟网络设备。

以上是关于Mac OS X 中的虚拟网络接口的主要内容,如果未能解决你的问题,请参考以下文章

如何确定实际物理网卡的 MAC 地址——不是由 *** (.NET C#) 创建的虚拟网络接口

在c中识别虚拟网络接口

Mac OS 系统 L2TP 怎么设置

容器网络专题

虚拟多Mac地址工具Multimac

如何配置Mac OS X 与 Windows之间共享网络