SCCM; OSD; WDS; PXE; UEFI & BIOS & DHCP options 66, 67. Часть 2: Vendor Classes

С периодичностью в неделю на профильных ресурсах возникает один и тот же вопрос – “У меня появилось устройство, загружающееся по UEFI и вот оно не загружается, в DHCP опцию 067 меняю, теперь UEFI — работает, а BIOS (legacy) нет”.

В первой части – “Часть 1: DHCP Relay Agent”, мы разбирались как с наименьшими трудозатратами поддерживать сразу все текущие платформы загрузки клиента (UEFI и BIOS) с помощью возможности WDS-сервера прикидываться DHCP-сервером и отдавать PXE-клиенту необходимый загрузчик.

Но что делать если мы не можем обеспечить возможность получать широковещательные запросы клиента (DHCP Discover) — WDS сервером? Например, для каждой подсети (домена широковещания) — настроен отдельный DHCP-сервер, который как бы, не желает делиться запросом PXE-клиента с WDS-сервером. Еще вариант, когда WDS-сервер и DHCP-сервер находятся на одном сервере, т.е. WDS не может прослушивать 67 порт, т.к. он занят DHCP.

Ответ простой — использовать возможность DHCP сервера — фильтровать запросы клиентов по “Option 60 — Vendor class identifier” (DHCP-Сервер на Windows Server) или “Option 93 — Client System Architecture” (например, “ISC DHCP”). Кстати PXE-сервер тоже ориентируется именно на архитектуру клиента в Option 93) и в зависимости от них предоставлять клиенту разные ответы (DHCP Offer) с DHCP-опциями 66, 67 для поддержки каждой из платформ.

Vendor Classes Filtering

И так, клиентский, широковещательный пакет “DHCP Discover”, получает только DHCP-сервер и пакет не достигает WDS сервера (либо WDS не прослушивает 67 порт).

BIOS и UEFI загрузчики ведут себя по-разному. UEFI — при отсутствии Option 60 = “PXEClient”, вообще не пытается обратиться к PXE — серверу, даже если заданы Option 66+67. BIOS же наоборот, при указанной опции 60 — игнорирует Option 66.

Возьмем самую распространённую схему – “DHCP и WDS (PXE) — отдельные сервера”. На DHCP-сервере, добавлены “Vendor Classes” и включена политика фильтрация по этим классам, чтобы в зависимости от информации, которую предоставляет PXE-клиент (в DHCP Discover) — выдавать клиенту разный набор DHCP-опций: опцию 60 — для UEFI-загрузчика и 66, 67 — для всех типов загрузчика.

Как в этом случае будет происходить процесс поиска PXE-сервера и файла загрузки, PXE-клиентом.

Не хочется перебирать все возможные варианты заданных опций и пакетов, которыми при этом обмениваются клиент-сервера. Вы всегда можете поставить себе “сниффер” и провести несколько часов за увлекательным занятием просмотра содержимого, этих самых пакетов, ломая голову почему разные клиенты ведут себя так, или иначе при наборе определенных опций. Основное отличие — UEFI-загрузчик “чуть умнее” (видимо в силу его современности). Даже если вы укажите ему 67-ю опцию, он отправит UDP-пакет WDS-серверу, на порт 4011, в котором укажет свои “Client System Architecture” и “Vendor class identifier”. А WDS-сервер отправит пакет-ответ с указанием файла для загрузки (например, “smsboot\x64\wdsmgfw.efi”).

Выглядит это так:

Вариант 1. BIOS (legacy) загрузчик:

  1. (Discover) PXE-Клиент отправляет пакет, с списком DHCP-options которые его интересуют (Option 55 — Parameter Request List), в этот пакет входят опции и про PXE (60, 67). Так же клиент сообщает информацию о себе:
    — Option 93, свой тип архитектуры системы – “Client System Architecture”, например, “IA x86 PC (0)”;
    — И Option 60 — Vendor class identifier, например, “PXEClient:Arch:00000:UNDI:002001”;

  2. (Offer) DHCP-серверы, получившие “запрос” клиента, резервируют под клиента IP и отправляют широковещательный пакет – “Предложение”. В этом “предложении” опции, которые клиент запросил и которыми DHCP-сервер обладает:
    — Обладает он опциями, напрямую относящимися к его работе — IP-адрес, маска, DNS-сервера, время аренды и т.д.;
    — А также Option 66 (Адрес PXE-сервера), 67 (файл для загрузки);

  3. (Request) Клиент подтверждает DHCP-серверу, что будет использовать предложенный IP-адрес и прочие настройки. В этом пакете клиент так же сообщает информацию о себе:
    — Option 93, свой тип архитектуры системы – “Client System Architecture”, например, “IA x86 PC (0)”;
    — И Option 60 — Vendor class identifier, например, “PXEClient:Arch:00000:UNDI:002001”;

  4. (Acknowledgement) DHCP — шлет клиенту пакет-подтверждение что IP-адрес ему выдан.
  5. (TFTP) Клиент запрашивает по протоколу TFTP у PXE-сервера, файл, который получил от DHCP-сервера.

clip_image001

Вариант 2. UEFI загрузчик:

  1. (Discover) PXE-Клиент отправляет пакет, с списком DHCP-options которые его интересуют (Option 55 — Parameter Request List), в этот пакет входят опции и про PXE (60, 67). Так же клиент сообщает информацию о себе:
    — Option 93, свой тип архитектуры системы – “Client System Architecture”, например, “EFI BC (7)”;
    — И Option 60 — Vendor class identifier, например, “PXEClient:Arch:00007:UNDI:003016”;
  2. (Offer) DHCP-серверы, получившие “запрос” клиента, резервируют под клиента IP и отправляют широковещательный пакет – “Предложение”. В этом “предложении” опции, которые клиент запросил и которыми DHCP-сервер обладает. Обладает он опциями, напрямую относящимися к его работе — IP-адрес, маска, DNS-сервера, время аренды, а также Option 66 (Адрес PXE-сервера), 67 (файл для загрузки) и Option 60 = “PXEClient”;
  3. (Request) Клиент подтверждает DHCP-серверу, что будет использовать предложенный IP-адрес и прочие настройки. В этом пакете клиент так же сообщает информацию о себе:
    — Option 93, свой тип архитектуры системы – “Client System Architecture”, например, “EFI BC (7)”;
    — И Option 60 — Vendor class identifier, например, “PXEClient:Arch:00007:UNDI:003016”;
  4. (Acknowledgement) DHCP — шлет клиенту пакет-подтверждение что IP-адрес ему выдан;
  5. (UDP) Клиент по UDP, на порт 4011, шлет пакет WDS-серверу, в котором содержится информация об архитектуре клиента – “Client System Architecture” и “Vendor class identifier”, например, “PXEClient:Arch:00007:UNDI:003000”;
  6. (UDP) WDS-сервер на основании полученной от клиента информации отправляет в ответ – путь до файла загрузки, например, “smsboot\x64\wdsmgfw.efi”;
  7. (TFTP) Клиент запрашивает по протоколу TFTP у PXE-сервера, файл, который получил на шаге 6.

clip_image002

Немного про формат “PXEClient:Arch:00000:UNDI:002001”. Мы будем ориентироваться именно на значение Arch – Архитектуру процессора. Основные, зарегистрированные варианты можно найти здесь: http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xhtml#processor-architecture. Это далеко не исчерпывающий список, каждый разработчик может добавить свой тип и предоставить свой загрузчик для этого типа (но это уже не про CCM). UNDI – “Universal Network Device Interface”, нас интересовать не будет, именно по этому в разделе “создания политик” мы будем подставлять “Append wildcard(*)” вместо его значения. Дополнительные подробности можно почерпнуть в RFC 2132(9.13), RFC 4578 и RFC 5970.

Теперь чтобы вся эта схема начала работать, настроим DHCP-сервер.

Note: Можно здорово сэкономить на количестве вносимых записей. Например, если все области будут ссылаться на один сервер WDS (SCCM-DP). Так же для UEFI и BIOS — файлы загрузки будут одинаковыми для всех областей. Так что вынесем необходимые опции из конкретной DHCP-области уровнем выше – в “Server Options” / “Policies”.

Добавляем опцию 60

Если DHCP-опции 60 у вас нет, т.е. до этого момента опцию 60 еще не использовали, её надо добавить:

В консоли DHCP правой кнопкой на “IPv4” / “Set Predefined Options…” / “Add…”

Заполняем поля:

  • Name: произвольно
  • Data type: String
  • Code: 60
  • Description: произвольно

clip_image003

Тут же вносим значение по умолчанию:

clip_image004

Создаем Vendor Classes

Создаем классы согласно следующей таблицы:

Name Vendor class identifier Bootfile Name
PXEClient: BIOS (00) PXEClient:Arch:00000 smsboot\x64\wdsnbp.com
PXEClient: UEFI x86 (02) PXEClient:Arch:00002 smsboot\x86\wdsmgfw.efi
PXEClient: UEFI x86 (06) PXEClient:Arch:00006 smsboot\x86\wdsmgfw.efi
PXEClient: UEFI x64 (07) PXEClient:Arch:00007 smsboot\x64\wdsmgfw.efi
PXEClient: UEFI x64 (08) PXEClient:Arch:00008 smsboot\x64\wdsmgfw.efi
PXEClient: UEFI x64 (09) PXEClient:Arch:00009 smsboot\x64\wdsmgfw.efi

В консоли DHCP правой кнопкой на “IPv4” / “Define Vendor Classes…” / “Add…”

  • Display name: PXEClient: BIOS (00)
  • ASCII: PXEClient:Arch:00000

clip_image005

По аналогии добавляем остальные классы. Должно получиться так:

image

Активируем проверку политик.

Правой кнопкой на “Policy” / “Activate”

clip_image006

Добавляем DHCP-политики

Как вы уже заметили, файл загрузки для некоторых Vendor class ID совпадает, поэтому не имеет смысл задавать их отдельными политиками. Создадим их согласно следующей таблицы:

Name Value 60 PXEClient 67 Bootfile Name
x64\wdsnbp.com PXEClient: BIOS (00) smsboot\x64\wdsnbp.com
x86\wdsmgfw.efi PXEClient: UEFI x86 (02) PXEClient smsboot\x86\wdsmgfw.efi
PXEClient: UEFI x86 (06)
x64\wdsmgfw.efi PXEClient: UEFI x64 (07) PXEClient smsboot\x64\wdsmgfw.efi
PXEClient: UEFI x64 (08)
PXEClient: UEFI x64 (09)

Пример, создания политики для файла UEFI (x86) (x86\wdsmgfw.efi)

Правой кнопкой на “Policy” / “New Policy…”

Задаем имя: x86\wdsmgfw.efi

clip_image007

Добавляем условие кнопкой “Add…”

  • Criteria: Vendor Class
  • Operator: Equals
  • Value (Согласно таблицы): PXEClient: UEFI x86 (02)
  • Обязательно выбираем: “Append wildcard(*)”
  • Добавляем кнопкой “Add”
  • Жмем “Ok”

clip_image008

Добавляем второе условие кнопкой “Add…”

  • Criteria: Vendor Class
  • Operator: Equals
  • Value (Согласно таблицы): PXEClient: UEFI x86 (06)
  • Обязательно выбираем: “Append wildcard(*)”
  • Добавляем кнопкой “Add”
  • Жмем “Ok”

clip_image009

Убеждаемся, что добавили все условия, оставляем условие “OR”, жмем “Next”.

Задаем опцию 60 и 67 для этого типа загрузчика:

clip_image010

clip_image011

Убеждаемся, что все задано верно:

clip_image012

Жмем “Finish”.

По аналогии создаем остальные политики для BIOS и UEFI x64.

В итоге должно получится так:

clip_image013

Единственное что осталось это добавить DHCP-Option 66: “Boot Server Host Name” для необходимых DHCP-областей, либо, если WDS-сервер будет один на все области, можно добавить его на уровне сервера:

clip_image014

В общем то и все.

Как увидеть какой Vendor class identifier у клиента

Увидеть, что передает клиент о себе можно в логе DHCP-сервера:

%windir%\System32\dhcp\DhcpSrvLog-<Day>.log

a0d52-clip-71kb

Bonus: На DHCP-сервере быстро найти PowerShell-ом все “Vendor class identifier” в логе:

Select-String -Path "$($env:windir)\System32\dhcp\DhcpSrvLog-*log" -Pattern "PXEClient:Arch:" | % {
    ($_ -split ",")[14].Substring(0, 20)
} | Group-Object -NoElement

Или сниффером, например Wireshark:

bbfa3-clip-43kb

Для Wireshark фильтр который отобразит только нужную информацию процесса загрузки клиента по PXE:

bootp or tftp or udp.port eq 4011

Update 2018-08-27: С версии SCCM 1806 формат лога SMSPXE значительно доработали, теперь там достаточно информации для понимания и траблшутинга. Что запросил клиент и что ответил сервер теперь видно прямо в логе. Нет необходимости что-то “снифить” или лазить по DHCP-логам. По сути там весь процесс DORA (без ответов сервера DHCP) + логика ответа DP. Отличная доработка!

Почитать:

Managing Network Boot Programs

How PXE Requests Work

Use DHCP to detect UEFI or Legacy BIOS system and PXE boot to SCCM

Реклама
Запись опубликована в рубрике OSD, SCCM, Tricks. Добавьте в закладки постоянную ссылку.

6 отзывов на “SCCM; OSD; WDS; PXE; UEFI & BIOS & DHCP options 66, 67. Часть 2: Vendor Classes

  1. Уведомление: SCCM; OSD; WDS; PXE; UEFI & BIOS & DHCP options 66, 67. Часть 1: DHCP Relay Agent | Sergey Korotkov's Blog

  2. Ozzy:

    Сергей, где вы были год назад, когда я столкнулся с подобной необходимостью и реализовывал у себя по https://2pintsoftware.com/whitepaper-using-dhcp-uefi-bios-pxe-booting/
    :-)
    Сейчас нашел вашу статью во время написания собственной по данной тематике

    • Ну, пост писал именно как ответ, на русском языке, для большого количества вопросов на эту тему. В свою защиту — статья вышла 1 год 1 мес. назад ;-)
      Подключайтесь к группе в Телеграмм, там все новости и ответы на все вопросы CCM :)

      • Ozzy:

        Уже подключился. На самом деле, есть чего по SCCM рассказать, решил придать этому какую-то форму.

  3. Anonymous:

    Большое спасибо за статью, подставлять костыли для кривых PXE-клиентов стало намного удобнее!

    Для лентяев вот создание классов через PoSH:

    Add-DhcpServerv4OptionDefinition -Name 'PXECleint' -OptionId '60' -Type 'String' -DefaultValue 'PXEClient' -Description 'Support PXE Client'
    Add-DhcpServerv4Class -Name 'PXEClient: BIOS (00)' -Type 'Vendor' -Data '0x505845436c69656e743a417263683a3030303030'
    Add-DhcpServerv4Class -Name 'PXEClient: UEFI (07)' -Type 'Vendor' -Data '0x505845436c69656e743a417263683a3030303037'
    Add-DhcpServerv4Class -Name 'PXEClient: UEFI (08)' -Type 'Vendor' -Data '0x505845436c69656e743a417263683a3030303038'
    Add-DhcpServerv4Class -Name 'PXEClient: UEFI (09)' -Type 'Vendor' -Data '0x505845436c69656e743a417263683a3030303039'
  4. Уведомление: DHCP options vs IP-helpers | Ozzy's Blog

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s