Як змінити поведінку глобальної широкомовної адреси (255.255.255.255) у Windows?


10

Бажана поведінка

Коли програма надсилає пакет на IP-адресу глобальної трансляції 255.255.255.255, я хотів би, щоб пакет був надісланий на глобальну електронну адресу Ethernet ( ff:ff:ff:ff:ff:ff), на всіх інтерфейсах.

На Linux і, ймовірно, інших ОС також, здається, це працює. Windows XP та Windows 7 демонструють різну поведінку щодо цього, і жодна поведінка не бажана для моєї ситуації.

Поведінка Windows XP

Пакет буде правильно надісланий до першого мережевого інтерфейсу (порядок інтерфейсу вказаний у "Мережеві з'єднання / Додаткові / розширені налаштування"). Він також буде надісланий на інші інтерфейси.

На сьогодні все правильно. Проблема полягає в тому, що при відправці на інші інтерфейси адресою джерела широкомовного пакету є IP-адреса першого інтерфейсу. Наприклад, уявіть цю конфігурацію мережі (важливий порядок):

  • Адаптер 1: IP-адреса 192.168.0.1
  • Адаптер 2: IP-адреса 10.0.0.1
  • Адаптер 3: IP-адреса 172.17.0.1

Тепер, якщо я надішлю широкомовний пакет, будуть надіслані наступні пакети (із вихідною та цільовою IP адресами):

  • На адаптері 1: 192.168.0.1=>255.255.255.255
  • На адаптері 2: 192.168.0.1=>255.255.255.255
  • На адаптері 3: 192.168.0.1=>255.255.255.255

    На практиці програми, які використовують широкомовні пакети, не працюватимуть на будь-яких інтерфейсах, крім адаптера 1. На мою думку, це кричуща помилка в стеку TCP / IP Windows XP.

Поведінка Windows 7

Зміна порядку мережевого інтерфейсу, схоже, не впливає на Windows 7. Натомість трансляція, як видається, контролюється таблицею маршруту IP.

IPv4 Route Table
===========================================================================
Active Routes:
Network Destination        Netmask          Gateway       Interface  Metric
          0.0.0.0          0.0.0.0   10.202.254.254       10.202.1.2    286
          0.0.0.0          0.0.0.0      192.168.0.1      192.168.0.3     10
       10.202.0.0      255.255.0.0         On-link        10.202.1.2    286
       10.202.1.2  255.255.255.255         On-link        10.202.1.2    286
   10.202.255.255  255.255.255.255         On-link        10.202.1.2    286
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      192.168.0.0    255.255.255.0         On-link       192.168.0.3    266
      192.168.0.3  255.255.255.255         On-link       192.168.0.3    266
    192.168.0.255  255.255.255.255         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link       192.168.0.3    266
        224.0.0.0        240.0.0.0         On-link        10.202.1.2    286
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link       192.168.0.3    266
  255.255.255.255  255.255.255.255         On-link        10.202.1.2    286
===========================================================================

Бачите 255.255.255.255маршрути? Так, вони контролюють широкомовні пакети. У цій ситуації пакети широкомовної передачі будуть надсилатись через те, 192.168.0.3що він має нижню метрику ... але не на інші інтерфейси.

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

Висновок

  • Windows 7 надсилає лише широкомовні пакети в один інтерфейс. Ви можете вибрати, який із них, але тут справа не в цьому.
  • Windows XP надсилає широкомовні пакети на всі інтерфейси, але він надсилає їх лише, як очікувалося, одному інтерфейсу, який на практиці еквівалентний поведінці Windows 7.

Мета

Я хочу змінити цю глобальну підтримку широкомовної IP-адреси в Windows (бажано Windows 7) раз і назавжди. Звичайно, кращим способом було б мати якесь підтримуване зміна конфігурації (злом реєстру чи подібне), але я відкритий для всіх пропозицій.

Будь-які ідеї?


Що ви використовуєте для створення цих трансляцій. Я не можу отримати свій стек XP, щоб нічого не робити, крім направлених передач. тобто 10.202.255.255 у вашому випадку.
Скотт Лундберг

Чи можете ви посилатися на RFC чи інший документ, який вказує правильну поведінку, яку ви описуєте? Хоча я погоджуюся з бажаною поведінкою, щоб називати її правильною поведінкою, слід посилатися на специфікацію, яка визначає, що правильно. Чи може бути, що конкретна реалізація маршрутизації залишається за провайдером (у цьому випадку Microsoft)?
Джейсон Р. Кумбс

Скотт Лундберг: багато додатків (особливо ігор) надсилатимуть глобальну трансляцію. Ви можете створити деякі, використовуючи netcat: "nc -v -u 255.255.255.255 5000", наприклад.
Етьєн Дечамп

Джейсон Р. Кумбс: дійсно, можливо, у мене був поганий вибір слів. Я повинен був використовувати «бажану поведінку». Я не думаю, що для цього є RFC, але я можу помилятися.
Етьєна Дечамп

Ви надсилаєте пакет TCP або UDP? Відповідно до цього важливо social.msdn.microsoft.com/Forums/en/peertopeer/thread/… .
Nissan Fan

Відповіді:


6

Справа не в тому, що я займаюся захистом Microsoft, але, прочитавши наступні RFC, які намагаються визначити, як працюють трансляції, я не думаю, що Microsoft обов'язково порушує будь-які RFC. Проблема IMO повинна бути вирішена на рівні програми (тобто спрямовані трансляції, а не глобальні), які потраплять на відповідні маршрути в таблиці маршрутизації та надсилаються лише з правильного інтерфейсу для цієї мережі IP.

Вони обоє заявляють, що не існує визначеного стандарту для трансляцій. У 919 році також згадується, що для трансляції повинен бути обраний конкретний фізичний інтерфейс. Що стосується багатодомної машини з декількома NIC, що генерує трансляцію, я не думаю, що чітко сказано, що має відбуватися. Трансляції ніколи не повинні передаватися маршрутизаторами від одного інтерфейсу до іншого, тож машина Windows є маршрутизатором чи ні в цьому випадку?
Якщо він діє в якості маршрутизатора, то будь-який хост реагує на трансляцію з некоректною IP - адресою для цієї мережі (адаптери 2 і 3 в вашому прикладі) повинен відправити пакет назад в Ethernet - адреса адаптерів 2 і 3 у відповідь на адаптер IP-адреса 1 та хост Windows повинні направити його у відповідний інтерфейс.
Це звучить заплутано ... але не можу придумати кращого способу це сформулювати

І нарешті, RFC 919 спеціально говорить від RFC 919

Оскільки ми припускаємо, що проблема вже вирішена на рівні каналу передачі даних, хост IP-адреси, який бажає
надіслати або локальну, або пряму трансляцію, повинен лише
вказати відповідну адресу призначення та надіслати дейтаграму як
зазвичай. Будь-які складні алгоритми повинні знаходитися лише в шлюзах.

Читання, яке б підказало, що IP-адреса джерела не має значення для трансляції.


Оскільки, як видається, кожна програма по-різному обробляє трансляції, я думаю, саме тут лежить відповідальність. Наприклад. nbtstatнадсилає спрямовані трансляції на декількох NICed машинах, тоді як ігри можуть використовувати глобальні трансляції.
Коротше кажучи, додаток має бути виправлене, а не ОС у цьому випадку ...

EDIT: Ось посилання на ті самі обставини, але в Linux. Ядро Linux обробляє його, надсилаючи лише один пакет із інтерфейсу за замовчуванням (NIC A у цьому прикладі). Вони рекомендують додатку перелічувати NIC та надсилати спрямований ефір кожного NIC. Посилання


2
Не розумієте, яке відношення між абзацом, який ви цитуєте з RFC 919, та адресою джерела. Мені здається очевидним, що завжди неправильно надсилати IP-пакет на інтерфейс із вихідною адресою іншого інтерфейсу, незалежно від характеру трансляції / одноадресної передачі пакету. Тобто, ви не можете з розумом сказати, що "IP-адреса джерела не має значення для трансляції", звичайно, це! Як інакше додатки повинні знати, хто надіслав трансляцію?
Етьєн Дечампс

1
"У 919 році також згадується, що для трансляції повинен бути обраний конкретний фізичний інтерфейс." Де? "Адреса 255.255.255.255 позначає трансляцію в локальній апаратній мережі" (RFC919 7.)? У такому випадку я з повагою не згоден. Ми обговорюємо, що робити з трансляціями на рівні хосту, а не на рівні мережі. Крім того, сказано трохи нижче, що хост може "транслювати всіх своїх безпосередніх сусідів за допомогою 255.255.255.255". Всі його безпосередні сусіди. Не "всі сусіди на певному мережевому інтерфейсі".
Етьєн Дечамп

1
"Програмам не важливо, який інтерфейс передав трансляцію. Їм просто потрібно відповісти на це." Ага ... їм теж потрібно надсилати трансляції, а не лише відповідати на них. Розглянемо випадок браузера локального ігрового сервера. Він надсилає широкомовні пакети для виявлення ігрових серверів у мережі. Якщо пакети широкомовної інформації надсилаються не на всі інтерфейси, браузер ігрових серверів не показуватиме ігрові сервери, доступні за допомогою цих інтерфейсів. Іншими словами, епос провалюється.
Етьєна Дечамп

1
"Я не впевнений, але я думаю, що ОС бачить запит 255.255.255.255 і каже, що йому потрібно надіслати це на всіх інтерфейсах (щоб знайти всіх безпосередніх сусідів), але його вимагали від конкретної програми, прив'язаної до конкретний IP (може бути типовим на основі метрики). " Я згоден. Це не означає, що це правильна річ. На мою думку, це повністю порушує принцип найменшого здивування з точки зору розробника програми, який просто розраховує, що пакет буде відправлений усім на всіх інтерфейсах.
Етьєн Дечампс

4
Не впевнений, що ви маєте на увазі під дублюванням. RFC спеціально забороняє пересилати широкомовні пакети. Має бути надісланий лише один пакет, який, на мою думку, є сутністю нашої дискусії. Якби операційна система робила, як ви кажете, фактично довелося б генерувати 9 загальних пакетів (3 для кожного інтерфейсу), оскільки IP-рівень повинен був би генерувати три пакети з окремими вихідними IP-адресами (по одному для кожного NIC на рівні 3), а потім кожен NIC повинен був відправити їх на Ethernet (рівень 2). Якщо між мережами були маршрути, то ви отримуєте 3 відповіді назад! Який з них правильний?
Скотт Лундберг

4

Нарешті, я це вирішив програмно. Я написав дуже невелике програмне забезпечення під назвою WinIPBroadcast, яке піклується про ретрансляцію кадрів широкомовної програми до всіх інтерфейсів.

Це працює, використовуючи цікавий факт: під час прослуховування за адресою петлі (127.0.0.1) можливе отримання локально генерованих глобальних пакетів широкомовної передачі. WinIPBroadcast прослуховує локальну адресу для всієї трансляції за допомогою RAW-сокетів, потім для кожного пакету широкомовної передачі він ретранслює його на всі інтерфейси, крім бажаного.


Оскільки стек windows - це роздрібний стек BSD, мені цікаво знати, чи BSD проявляє таку саму поведінку.
x0n

Ваше програмне забезпечення не працює. The program can't start becuase api-ms-win-core-rtlsupport-l1-2-0.dll is missing from your computer.. Успіхів, виявивши це .dllв Google.
Алекс Г

@AlexG: це дивно, я думав, що вирішив цю проблему через github.com/dechamps/WinIPBroadcast/commit/… . Ви впевнені, що використовуєте останню версію (1.6)? Не соромтеся подати помилку на сторінку github.com/dechamps/WinIPBroadcast/isissue, і я перегляну.
Етьєн Дечамп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.