Виртуальный сетевой интерфейс в Mac OS X - PullRequest
43 голосов
/ 18 сентября 2008

Я знаю, что вы можете создать виртуальный сетевой интерфейс в Windows (см. здесь ), а в Linux это также довольно просто с ip-псевдонимами, но существует ли что-то подобное для Mac OS X? Я искал петлевые адаптеры, виртуальные интерфейсы и не мог найти хорошее решение.

Вы можете создать новый интерфейс в сетевой панели на основе существующего интерфейса, но он не будет действовать как реальный полнофункциональный интерфейс (если исходный интерфейс неактивен, то производный также неактивен).

Этот сценарий необходим при работе в полностью отключенной ситуации. Даже в этом случае имеет смысл иметь сетевые возможности при запуске серверов в установке VMWare. Эти виртуальные машины могут быть доступны по их IP-адресу, но не по их DNS-имени, даже если я запускаю DNS-сервер на одной из этих виртуальных машин. Настроив интерфейс для использования виртуального DNS-сервера, я решил проверить некоторые сценарии DNS. К сожалению, ни один интерфейс не разрешает имена DNS, если ни одно из них неактивно ...

Ответы [ 12 ]

53 голосов
/ 09 марта 2009

Адаптер обратной связи всегда включен.

ifconfig lo0 alias 172.16.123.1 добавит псевдоним IP 172.16.123.1 к адаптеру обратной связи

ifconfig lo0 -alias 172.16.123.1 удалит его

22 голосов
/ 16 июня 2011

Отвечая, в частности, на:

Вы можете создать новый интерфейс в сетевой панели на основе существующего интерфейса, но он не будет действовать в качестве реального полнофункционального интерфейса (если исходный интерфейс неактивен, то производный также неактивен).

Это может быть достигнуто с помощью устройства Tun / Tap, как предлагает psv141, и манипулирования файлом /Library/Preferences/SystemConfiguration/preferences.plist для добавления NetworkService на основе интерфейса tun или tap. Mac OS X не позволяет создавать NetworkService на основе интерфейса виртуальной сети, но можно напрямую манипулировать файлом preferences.plist для добавления NetworkService вручную. Обычно вы открываете файл preferences.plist в Xcode (или редактируете XML напрямую, но Xcode, вероятно, будет более надежным) и копируете конфигурацию из существующего интерфейса Ethernet. Место для создания нового NetworkService находится в разделе «NetworkServices», и если на вашем Mac есть устройство Ethernet, профиль NetworkService также будет находиться в этой записи свойства. Запись Ethernet может быть скопирована в значительной степени дословно, единственные поля, которые вы на самом деле изменили бы:

  • UUID
  • UserDefinedName
  • Конфигурация IPv4 и настройте интерфейс для вашего устройства tun или tap (то есть tun0 или tap0).
  • DNS-сервер, если необходимо.

Тогда вы также будете манипулировать определенным местоположением, для которого требуется этот NetworkService (помните, что Mac OS X может настраивать все сетевые интерфейсы в зависимости от вашего "местоположения"). UUID местоположения по умолчанию можно получить в корне PropertyList в качестве ключа «CurrentSet». После выяснения, какое местоположение (или набор) вы хотите, раскройте свойство Set и добавьте записи в Global / IPv4 / ServiceOrder с UUID нового NetworkService. Также в свойстве Set необходимо развернуть свойство Service и добавить здесь UUID в качестве словаря с одной записью String с ключом __LINK__ и значением в качестве UUID (используйте другие интерфейсы в качестве примера).

После изменения файла preferences.plist просто перезагрузите компьютер, и NetworkService будет доступен в SystemPreferences-> Network. Обратите внимание, что мы имитировали устройство Ethernet, поэтому сетевой уровень Mac OS X заметит, что «кабель отключен» и не позволит вам активировать интерфейс через графический интерфейс. Однако, поскольку базовое устройство является устройством настройки / прослушивания и имеет IP-адрес, интерфейс станет активным и будет добавлена ​​правильная маршрутизация на уровне BSD.

Для справки это используется для создания особой магии маршрутизации.

Если вы зашли так далеко и у вас возникли проблемы, вам нужно создать устройство tun / tap, открыв одно из устройств в / dev /. Вы можете использовать любую программу для этого, но я сам фанат старого доброго 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;
}
8 голосов
/ 07 июля 2015

В отношении @bmasterswizzle BRILLIANT ответа - более конкретно - на @DanRamos 'вопрос о том, как заставить состояние интерфейса нового интерфейса «вверх». чье происхождение я не могу вспомнить, но которое работает сказочно (в координации с @ bmasterswizzles "Mona Lisa" ответов ) ...

#!/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

5 голосов
/ 25 апреля 2015

Несколько других, похоже, намекают на это, но следующее демонстрирует использование ifconfig для создания vlan и проверки DNS на виртуальном интерфейсе (используя minidns ) в OS X 10.9.5:

$ 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 голосов
/ 19 ноября 2009

Возможно использование устройства TUN / TAP. http://tuntaposx.sourceforge.net/

1 голос
/ 24 сентября 2010

Взгляните на это руководство, оно предназначено для FreeBSD, но также применимо к OS X. http://people.freebsd.org/~arved/vlan/vlan_en.html

1 голос
/ 18 сентября 2008

Что вы подразумеваете под

"но он не будет действовать как полноценный полностью функциональный интерфейс (если исходный интерфейс неактивен, то производный также неактивен"

Я могу создать новый интерфейс, основать его на уже существующем, затем отключить существующий, и новый все еще работает. Создание второго интерфейса, однако, не создает реального интерфейса (когда вы проверяете с помощью ifconfig), он просто назначит второй IP-адрес уже существующему (однако, это может быть DHCP, в то время как первый, например, жестко запрограммирован).

Так правильно ли я вас понял, что вы хотите создать интерфейс, не привязанный к какому-либо реальному интерфейсу? Как тогда этот интерфейс будет использоваться? Например. если вы отключите все WLAN и вытяните все сетевые кабели, куда этот интерфейс будет отправлять трафик, если вы отправляете трафик на него? Возможно, ваш вопрос немного неясен, он может сильно помочь, если перефразировать его, поэтому ясно, что вы на самом деле пытаетесь сделать с этим «виртуальным интерфейсом», как только он у вас есть.

Как вы упомянули "псевдоним IP" в своем вопросе, это будет означать интерфейс псевдонима. Но псевдоним интерфейса всегда связан с реальным интерфейсом. Разница в том, что в Linux такой интерфейс действительно IS интерфейс (например, интерфейс псевдонима для eth0 может быть eth1), в то время как на Mac не создается интерфейс real вместо виртуального интерфейса создается, который может настраиваться и использоваться независимо, но физически он остается тем же интерфейсом, и, следовательно, новый именованный интерфейс не создается (у вас есть только два интерфейса, оба фактически en0, но оба можно включить / отключить и настроить независимо). ).

0 голосов
/ 08 июня 2018

, если вы находитесь в среде разработчика и хотите получить доступ к какой-либо службе, уже запущенной на локальном хосте / хост-компьютере. в Docker для Mac у вас есть другой option.use docker.for.mac.localhost вместо localhost в контейнере Docker. Вместо docker.for.mac.localhost из Docker Community Edition 17.12.0-ce-mac46 2018-01-09 следует использовать docker.for.mac.host.internal. это позволяет вам подключиться к сервису, работающему на вашем компьютере Mac, из контейнера Docker. Пожалуйста, обратитесь по ссылкам ниже

понимание поведения docker.for.mac.localhost

примечания к выпуску

0 голосов
/ 22 октября 2013

Вот хорошее руководство: http://gerrydevstory.com/2012/08/20/how-to-create-virtual-network-interface-on-mac-os-x/

Обычно вы выбираете сетевой адаптер на панели «Сетевые настройки» системных настроек, затем нажимаете на «Дублировать сервис». После дублирования службы вы вручную назначаете IP-адрес в одном из диапазонов частных адресов. Затем проверьте связь;)

0 голосов
/ 05 января 2011

Перейти к настройкам сети.

В нижней части списка сетевых адаптеров нажмите + значки

Выберите существующий интерфейс, который вы хотите arp (скажем, Ethernet 1), и укажите имя службы, которое вы хотите для нового порта (скажем, Ethernet 1.1), затем нажмите create.

Теперь у вас есть новый виртуальный интерфейс в графическом интерфейсе и вы можете управлять IP-адресами и т. Д. Обычным способом.

ifconfig -a подтвердит, что у вас есть несколько IP-адресов на интерфейсе, и они все еще будут присутствовать при перезагрузке.

Это Mac. Не борись, сделай это легким путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...