55

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

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

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

4

12 回答 12

63

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

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

ifconfig lo0 -alias 172.16.123.1将删除它

于 2009-03-09T01:03:29.047 回答
27

特别回复:

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

这可以使用 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;
}
于 2011-06-16T16:27:41.803 回答
12

关于@bmasterswizzle's BRILLIANT answer - 更具体地说 -@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

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

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

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

在此处输入图像描述

于 2015-07-07T04:15:02.107 回答
9

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

$ 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
于 2015-04-24T22:49:42.370 回答
6

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

于 2009-11-19T15:29:45.543 回答
2

如果您在开发环境中并且想要访问已经在 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 上运行的服务。请参阅下面的链接

了解 docker.for.mac.localhost 的行为

发行说明

于 2018-06-08T07:21:22.670 回答
1

你是什​​么意思

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

?

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

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

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

于 2008-09-17T20:58:51.860 回答
1

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

于 2010-09-24T01:32:24.700 回答
0

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

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

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

我正在尝试这是相似之处……</p>

会让你知道进展如何...

于 2010-06-08T17:49:31.687 回答
0

转到网络首选项。

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

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

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

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

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

于 2011-01-05T14:25:35.240 回答
-1

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

于 2008-09-17T21:01:43.880 回答
-1

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

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

于 2013-10-22T14:46:49.703 回答