Я хочу настроить DHCP-сервер таким образом, чтобы он помещал "обычные" смартфоны и планшеты в отдельную подсеть. Можно ли определить, исходит ли DHCP-запрос от устройства Android или iOS, на основе самого DHCP-запроса?
Например: телефон Sony на базе Android, который был рядом, установил следующие параметры DHCP в запросе, которые потенциально могут быть полезны для идентификации.
bootp.option.vendor_class_id == "dhcpcd-5.2.10:Linux-2.6.32.9-perf:armv7l:mogami"
bootp.option.hostname == "android-c7d342d011ea6419"
Существуют ли какие-либо известные общие шаблоны в DHCP-запросах смартфонов, которые лучше, чем префикс MAC?
Использование имени хоста для сопоставления. Пользователи могут изменить его на Android, выбрав «Настройки»> «Параметры разработчика»> «Имя хоста устройства». Но я почти уверен, что 90% пользователей оставляют эту настройку в покое. iPhone и iPad
class "Android" {
match if substring(option host-name,0,7) = "Android";
}
class "iPhone" {
match if substring(option host-name,0,6) = "iPhone";
}
class "iPad" {
match if substring(option host-name,0,4) = "iPad";
}
class "Windows-Phone" {
match if substring(option host-name,0,13) = "Windows-Phone";
}
class "BLACKBERRY" {
match if substring(option host-name,0,10) = "BLACKBERRY";
}
Телефон Android отправил здесь похожий идентификатор поставщика:
Option: (t=60,l=52) Vendor class identifier = "dhcpcd-5.2.10:Linux-3.0.16-ge733189:armv7l:shooter_u"
Однако устройство iPhone ничего не отправило, кроме своего MAC-адреса и имени хоста. То же самое и с устройством Nokia Symbian (E71). Мой образец из трех устройств показывает, что только устройства Android отправляют что-нибудь полезное. У вас может быть некоторый успех, если вы узнаете, какую информацию запрашивает каждый клиент (SIP-сервер, поиск домена) и действительно запрашивает не запрос, и используя его как «отпечаток пальца».
Однако, на мой взгляд, реальный ответ - поместить «неизвестных» клиентов в сеть по умолчанию, а явно известные устройства - в другую.
Вы можете ограничить доступ к сети на своем DHCP-сервере. Например, в ISC DHCP вы можете определить класс или несколько подклассов, используя строку, которую отправляет Android:
class "Android" {
match if substring(option vendor-class-identifier,0,5) = "dhcpd";
}
Вы можете зарегистрировать эту информацию для отладки в ваших файлах журналов, добавив в ваш cfg файл:
log (debug, substring (option vendor-class-identifier, 0, 5));