Назад | Перейти на главную страницу

Как добавить широковещательный IP-адрес к интерфейсу обратной связи в os / x с помощью ifconfig, когда на моем компьютере нет сети?

Я новичок в продвинутом сетевом администрировании, и я хотел бы провести некоторое тестирование с широковещательной передачей UDP, поэтому мне нужно широковещательный адрес на моем интерфейсе обратной связи. Машина не в сети, то есть сети нет.

Как я могу добиться этого через ifconfig без необходимости покупать коммутатор, как предложил один пользователь в комментариях. В Linux все, что мне нужно сделать, это использовать 127.255.255.255, и трансляции работают нормально без какой-либо сети или какого-либо переключателя. Если у меня есть сеть, я могу просто использовать 255.255.255.255, очевидно.


Вот как вы можете убедиться, что он работает в linux, но не в os / x:

  1. Откройте два терминала и введите на обоих:

    nc -u -l 55555

  2. Откройте третий терминал, при необходимости установите socat и введите: (если вы спросите, netcat НЕ поддерживает трансляцию)

    echo -n "TEST" | socat - udp-datagram:127.255.255.255:55555,broadcast

  3. Тебе следует увидеть оба терминала получение сообщения.

Если вы попробуете тот же эксперимент с 127.0.0.1, только один терминал получит ожидаемое сообщение.

Выполнение того же теста в OS X не дает такого же поведения.

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

Вы не «добавляете» широковещательный адрес. Вы направлять трафик на широковещательный адрес сети.
Широковещательный адрес - это полностью виртуальная концепция, и не должна быть "добавленным" или иным образом назначенным любому хосту в обычной практике.

Исключением из приведенного выше правила является указание широковещательный адрес (с использованием ifconfig broadcast), что делается в случаях, когда широковещательный адрес может быть нестандартным. Как правило, если вы решите использовать broadcast вариант ifconfig вы делаете что-то странное и, вероятно, неправильно...

Если вы хотите отправить широковещательную рассылку в сеть 127.0.0.0/8 (локальная / кольцевая), теоретически вы бы просто направили трафик на 127.255.255.255, но если вы попытаетесь это сделать, вы обнаружите, что это НЕ РАБОТАЕТ, потому что устройство обратной связи не поддерживает BROADCAST трафик.

Вы можете убедиться в этом сами, запустив ifconfig lo0 на вашем Mac, который будет производить такой вывод:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 ::1 prefixlen 128 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    inet 127.0.0.1 netmask 0xff000000 
    nd6 options=1<PERFORMNUD>

Обратите внимание на отсутствие BROADCAST в поле флагов.
Настройка устройства с указанным параметром широковещания (адресом) приводит к игнорированию адреса. Коробка BSD или Linux (Debian) ведет себя аналогичным образом, и я ожидаю, что другие платформы поступят так же, хотя вы можете найти странную утку, которая позволяет вам установить BROADCAST установите флажок на устройстве с обратной связью, если вы ищете достаточно усердно.

Обсуждается логика этого в этом сообщении списка рассылки FreeBSD. Альтернативная причина запрета трансляции также обсуждается в комментариях к этот ответ сбоя сервера, который предлагает альтернативу использования MULTICAST (который является обычно поддерживается интерфейсом обратной связи).


Конкретно в отношении вашего тестового примера: то, что вы видите, не является ожидаемым поведением. Мне удалось воспроизвести ваше поведение, но только в очень узком стечении обстоятельств.

Для более надежного теста, который показывает, что широковещательные сообщения на устройстве обратной связи на самом деле не работает в Linux попробуйте следующий тестовый пример на удобной машине с Linux (мой тестовый пример: Ubuntu 13.04):

  • Настройте второй адрес (третий, четвертый, пятый - сколько хотите) на вашем интерфейсе обратной связи.

  • Запустите экземпляр netcat, прослушивающий каждый адрес обратной связи, например -
    nc -u -l 127.0.0.1 5555
    nc -u -l 127.0.0.2 5555
    nc -u -l 127.0.0.3 5555
    ...и т.д

  • Запустите команду теста вещания, используя socat
    echo TEST | socat - udp-datagram:127.255.255.255:5555,broadcast

Вы заметите, что никто ваших окон netcat получит сообщение (Ожидаемое поведение поскольку интерфейс обратной связи не рекламирует поддержку BROADCAST в поле флагов), однако если вы обратитесь к ним напрямую (например, echo TEST2 | socat - udp-datagram:127.0.0.2:5555) они получают сообщение без проблем.

«Решение», о котором вы просите, не существует (или, по крайней мере, не должно работать) на любой платформе, если интерфейс обратной связи не поддерживает BROADCAST (как можно определить по flags поле в ifconfig) - платформы, о которых вы говорите не рекламировать поддержку широковещательной передачи на интерфейсе обратной связи, поэтому вы не можете делать то, что просите.