Как включить рандомизированный MAC-адрес на любом устройстве
Случайный MAC-адрес встроен во многие ОС, такие как Android, iPhone и Windows 10. В macOS и Linux, если есть обходной путь, вы все равно можете получить эту функцию. Итак, вот как вы включаете рандомизированный MAC-адрес на любом устройстве.
Как получить рандомизированный MAC-адрес на любом устройстве
Что такое рандомизированный MAC-адрес?
MAC-адрес – это уникальный 12-значный буквенно-цифровой код, который назначается каждому устройству, которое может подключаться к сети. Этот MAC-адрес жестко запрограммирован производителем на сетевом чипе устройства, поэтому, в отличие от IP-адресов, MAC-адреса не меняются. Проще говоря, рандомизация MAC блокирует ваше устройство, чтобы использовать его исходный MAC-адрес. Вместо этого он создает случайные 12-значные буквенно-цифровые символы и передает их в качестве исходного MAC-адреса вашего устройства. Если вы хотите изменить свой MAC-адрес на какой-то конкретный, ознакомьтесь с этой статьей.
Android
Начиная с Android 10, рандомизация MAC-адресов включена по умолчанию при подключении к новой сети. Однако, если у вас есть сохраненная сеть при обновлении с Android 9.0, Android все же может предпочесть использовать исходный MAC-адрес. В этом случае вам, возможно, придется заставить Android использовать случайный MAC-адрес. Чтобы проверить, использует ли ваше устройство случайный MAC-адрес для определенного Wi-Fi, перейдите в меню настроек.
В разделе «Настройки» нажмите «Подключения». Затем нажмите «Wi-Fi».
В разделе Wi-Fi нажмите значок шестеренки рядом с именем Wi-Fi. В настройках Wi-Fi вы увидите опцию «Тип MAC-адреса». Убедитесь, что он установлен на «Использовать рандомизированный MAC-адрес».
В Android 10 вы получаете случайный MAC-адрес каждый раз, когда подключаетесь к новой сети Wi-Fi. Он остается неизменным для этой конкретной сети Wi-Fi, если вы ее не сбросите. Если вы хотите установить собственный MAC-адрес для конкретной сети Wi-Fi, вам потребуется рутированное устройство и стороннее приложение.
Из многих приложений, которые я тестировал, Изменить мой MAC работает неплохо. Установите приложение и откройте его. Теперь в приложении вы можете сгенерировать случайный MAC-адрес одним нажатием. Однако имейте в виду, что при перезапуске устройства ваш телефон вернется к старому MAC-адресу.
В iOS 14 Apple объявила о возможности iPhone иметь случайный MAC-адрес, известный как «частный адрес». Если вы не используете iOS 14, вы можете следовать этому руководству, чтобы перейти на iOS 14. Частный адрес будет включен по умолчанию при каждом подключении к новой сети. Чтобы проверить, перейдите в приложение «Настройки» и нажмите Wi-Fi.
На странице Wi-Fi нажмите кнопку «i» рядом с именем Wi-Fi. Затем прокрутите вниз и найдите «Использовать частный адрес». Включите переключатель, и все. Теперь ваш iPhone создаст случайный MAC-адрес и предоставит его маршрутизатору.
Windows 10
Windows 10 также поддерживает случайные MAC-адреса. Однако по умолчанию он не включен. Чтобы включить его, перейдите в меню «Пуск», введите «использовать случайный аппаратный адрес» и нажмите Enter.
На странице Wi-Fi включите переключатель под опцией «Случайные адреса оборудования». Если вы не знаете, MAC-адрес также известен как аппаратные адреса или машинный адрес. Это позволит вашему ПК с Windows 10 использовать случайный MAC-адрес.
Обратите внимание: если вы сделаете это на офисном ноутбуке, это может привести к проблемам с доступом в удаленной сети. Если вы столкнулись с тем же, отмените изменения и запустите «ipconfig / flushdns» в командной строке.
macOS
iOS 14, iPad OS 14 и WatchOS 7 поддерживают рандомизированные MAC-адреса, за исключением macOS. Теперь нет никакого способа получить рандомизированный MAC-адрес в macOS как таковой. Однако вы можете заставить свой Wi-Fi подключаться к беспроводной сети с поддельным MAC-адресом. Это известно как «подмена MAC-адреса».
Для этого нам сначала понадобится имя вашего адаптера Wi-Fi. В основном это en0. Но вы можете быстро проверить это, открыв терминал и выполнив следующую команду.
ifconfig
В выходных данных команды проверьте наличие активного сетевого адаптера. В моем случае активен en0.
Теперь давайте проверим наш исходный MAC-адрес. Для этого выполните следующую команду.
Читайте: Как отключить автоматическое подключение в определенных сетях Wi-Fi
Теперь вы можете вставить случайный MAC-адрес или использовать веб-приложение под названием Генератор MAC-адресов сделать так. Используйте следующую команду для замены исходного MAC-адреса. В моем случае я заменяю свой исходный MAC-адрес на «19: e4: 91: 8f: bd: 41».
Обратите внимание, что вам потребуются права администратора для выполнения этой команды.
sudo ifconfig en0 эфир 19: e4: 91: 8f: bd: 41
Этот обходной путь действует только до перезагрузки. Следовательно, если что-то работает не так, как задумано, или вы хотите сбросить эту настройку, выполните быструю перезагрузку.
Linux
В Linux процесс чем-то похож на macOS. Вы можете вручную изменить свой MAC-адрес, и он будет сброшен после перезагрузки.
Затем нам нужно выключить наш адаптер Wi-Fi, чтобы изменить имя. Ниже представлена команда для отключения адаптера Wi-Fi.
sudo ip link set dev wlp3s0 вниз
После выключения адаптера Wi-Fi мы можем изменить MAC-адрес. Для этого ниже приводится команда. Обратите внимание, что вы не можете получить доступ к Wi-Fi, когда он выключен.
sudo ip link set dev wlp3s0 address
В качестве MAC-адреса можно использовать любой случайный 14-значный буквенно-цифровой адрес. Я использовал «70: 5E: 55: 65: F4: 10».
Теперь, когда мы изменили наш MAC-адрес, мы можем включить наш адаптер Wi-Fi.
sudo ip link set dev wlp3s0 вверх
Чтобы убедиться, что мы используем измененный MAC-адрес, используйте следующую команду.
ip a | grep эфир
Как вы можете видеть на скриншоте выше, я использую назначенный MAC-адрес.
Заключительные слова
Таким образом, это были способы получения рандомизированных MAC-адресов на различных платформах. Если у вас возникнут дополнительные проблемы или вопросы, дайте мне знать в комментариях ниже.
Также читайте: Как установить приоритет сетей Wi-Fi в Windows, macOS, iOS и Android
Хождение по граблям в чистом поле или как собрать MAC-адреса близлежащих Wi-Fi-устройств
Все свои публичные выступления (благо, их не так много) я начинаю с явного или неявного упоминания тезиса “Наша индустрия — сложная, проблемы могут вскрыться на любом, даже самом очевидном шаге, а оптимистично предполагать, что все будет просто и легко — наивно”. Как ни странно, эта простая мысль, полученная многолетним набиванием шишек, порой является откровением и для более опытных специалистов, хотя, казалось бы, весь оголтелый задор и вера в непогрешимость собственных идей и практик должна была выветриться уже давно. Расскажу байку на этот счет, пример простого, с первого взгляда, проекта.

В один прекрасный день товарищ скинул мне ссылку на интересный стартап. Ребята предлагали представителям малого бизнеса из сферы услуг и продаж поставить у себя точку доступа (с captive portal-ом) для своих клиентов, дабы раздавать интернет, попутно собирая MAC-адреса смартфонов людей, проходящих мимо. Цель сего действия весьма простая — большое количество рекламных сетей позволяют таргетироваться по списку адресов устройств, поэтому, направив рекламную компанию на проходящих мимо пользователей, мы с большой долей вероятности получим новых посетителей (потому что близко и “где-то это я уже видел”). Т.е. такая раздача виртуальных флаеров. Товарищ спросил, как это делается и сможем ли мы такое повторить.
Быстрый гуглеж на тему вскрыл механизм такого сбора данных. WiFi-адаптер запускался в режиме прослушивания эфира и бегал по каналам, захватывая пакеты, анализируя их и агрегируя полученные данные. Существовали и готовые открытые утилиты для этого, например, airodump-ng из состава aircrack-ng. Т.е. для повторения нам надо просто запустить эту утилиту, желательно, на отдельном компактном и носимом устройстве, и запихнуть полученные данные в БД, из которой потом уже доставать готовые списки MAC-адресов для рекламных сетей. Вроде бы задача простая, решаемая за один, максимум — два вечера неспешной работы, почти все готово же.
Разумеется, это оказалось ни разу не так.
Как известно, что позволено Юпитеру, то не разрешено быку. И когда в ход идут одноплатники, то приходится жертвовать, в первую очередь вычислительными ресурсами и памятью. Далее, за жертвой ресурсов идет жертва удобства разработки и отладки — тащить инструменты компиляции на устройство позволит не каждая система.
Первоначально мы хотели взять что-то простое и дешевое, например, коробочки Orange Pi Zero, поставить туда airodump-ng и пробросить данные, выплевываемые утилитой на сервер, где благополучно их сложить в базу. У меня был опыт работы с такими распределенными системами с выделенным центром (правда, там в роли рабочих лошадок выступали виртуальные машины, поднимаемые через API облака этим же самым центром по мере необходимости, но не суть), так что часть кода благополучно перекочевала в новый проект.
Инструментом проброса данных на сервер послужило написанное простейшее Erlang-приложение, которое, как предполагалось, будет выдергивать данные с дампера эфира (парсинг), сериализовать их (родной сериализацией Erlang-а) и передавать через web-сокет на сервер по HTTPS (не вызывая подозрений у DPI-систем и не изобретая собственных протоколов). Процессоры Allwinner H2+, которые использовались в Orange Pi, достаточно мощные, чтобы собираться и отлаживаться прямо на устройстве. Опять же, в теории все хорошо.
На практике началось.
1. как оказалось, встроенный WiFi в Orange Pi годился только на то, чтобы подцепиться к точке доступа и швырнуть данные в сервер. Ну, точнее, не сам адаптер, а поддержка его чипсета в ядре. Для большинства IoT проектов этого, наверняка, было бы достаточно. Впрочем, к этому удару мы были готовы, потому что предварительное изучение сайта aircrack-ng дало вполне четкое и неоднозначное “везде это работать не будет, если что — мы не виноваты, список проверенных чипсетов прилагаем”. В списке обнаружились почти все устройства Atheros (купленной Qualcomm) и Ralink (купленной MediaTek), что внушало некоторые перспективы в случае перехода с прожорливых китайских ARM-ов на более аскетичные MIPS-ы из чипсетов для роутеров.
Но, пока это все собирается из соплей и палок, т.е. прототипируется — надо решить проблему здесь и сейчас. Поэтому мы воспользовались такой экзотикой в наше технологичное время (когда беспроводная связь есть в любой зажигалке) как Wi-Fi USB-адаптер. Изучение списка совместимости и сопоставление его с ассортиментом ближайшего магазина выдало жертву — DLink DWA-160 в ревизии C1 (это важно, поскольку другие аппаратные ревизии использовали другой чип и вызывали неиллюзорную головную боль в плане принуждения к работе). Двухдиапазонный, не требующий плясок с драйвером, поскольку поддержка давно в ядре, этот свисток пригодился в дальнейшем и в эксплуатации в других проектах, поэтому я скупил их, наверное, все (пять штук), что оказались доступны в нашем провинциальном городе.
Убедившись в работоспособности устройства, я подключил его к одноплатнику и выключил встроенный WiFi-адаптер с расчетом, что интернет будет доступен через Ethernet-интерфейс.
Вторую свинью подложил aircrack-ng. Этот набор утилит был создан с целью взлома проверки на проникновение WiFi-сетей, т.е. был написан хакерами для хакеров. Не знаю, благодаря какой логике они предпочли использовать дампер эфира беспроводных сетей не в виде традиционного unix-way подхода выплюнуть структурированный текст для последующей обработки, а сделать полноценный term-интерфейс, на котором почти в реальном времени (и с учетом настроек терминала) отображать информацию по обнаруженным сетям и устройствам, но они сделали именно так. Да, я нашел Python API неизвестной степени готовности ко всему этому, но, опять же, паук прототипирования, обитавший в моей голове, жестко запретил тащить еще один язык, переключаться на другой (мы же помним, серверная часть уже была частично готова и написана она была далеко не на Python-е) или, упаси боже, реализовывать airodump-ng самостоятельно на базе tcpdump-а. А, следовательно, надо было искать обходные пути.
К счастью, беспроводные хакеры начали что-то подозревать, что постоянно тупить в интерфейс — такое себе занятие, поэтому реализовали периодическое выкладывание всего найденного и агрегированного в виде CSV-файлов. С задаваемым интервалом. С этим уже можно жить. Разумеется, наивный вариант — запустить утилиту и перечитывать файл по таймеру — тут же дал по рукам. Работающий на ноутбуке, при переносе на одноплатник, он начал сбоить в процессе вычитывания файла по понятным причинам — порой утилита просто не успевала выгрузить все и часть данных безвозвратно терялась.
Решением этого стал механизм inotify в ядре, уведомляющий об файловых операциях — как только мой код видел изменения файла с данными, он инициировал его чтение с небольшой задержкой (скорее, имеющей чисто психологическое значение, успокоить его автора). Проведенные опыты показали, что в этом случае сбоев при чтении и потерь данных не возникает. Ну славно, парсим CSV, укладываем во внутренние структуры и передаем на сервер. На сервере сохраняем в PostgreSQL (спасибо за jsonb) и после этого уже можно делать запросы, формировать выгрузки и т.д. Добавим простейшей авторизации по симметричному ключу, чтобы нам туда не напихали мусора и мы могли бы привязать данные к точке, где установлено устройство, и вроде бы все хорошо, можно в бой.
Ага, сейчас, как же. Тестовая сборка этой цепочки (а написание кода и отладка заняла действительно пару вечеров) вскрыла забавный факт — количество адресов, пойманных за сутки в нашем офисе, достаточно удаленном от публичных проходимых мест, колебалось в районе пары тысяч штук. Да, конечно, рядом была небольшая гостиница (это было в докарантинно-изоляционное время, не удивляйтесь), но все равно, что-то много.
Освежив знание по структуре MAC-адреса и вспомнив факт, что мобильные устройства, зачастую, для сокрытия своего истинного MAC-адреса генерируют локальные адреса, я доработал серверную часть простейшим фильтром, вычищающим все broadcast и local адреса на входе. Список сократился на порядок и уже выглядел похожим на правду. Все было готово к полевым испытаниям.
Как известно, при смене локации с теплого и уютного офиса на беспощадные боевые условия прототипы имеют свойство прекращать нормально функционировать, поэтому процесс внедрения должен сопровождаться поставкой карманного инженера, который будет исправлять все всплывшие недочеты. С другой стороны, также хорошо известно, что устройство, не требующее дополнительных плясок с бубном в начале эксплуатации, скорее всего скоро сломается, причем бесповоротно. Это, наверняка, нашло свое отражение в законах Мерфи, но, увы, автору этих строк лень проверять, в каком именно, поэтому сойдемся на термине “закон подлости”.
Первая установка вскрыла сразу кучу недостатков.
Во-первых, большинство китайских плат для прототипирования поставляется с долгосрочной памятью на MicroSD в противовес NAND/NOR flash чипам. Исключение делается только для мощных SoC, явно избыточных для данной задачи. Увы, MicroSD — это непосредственная головная боль эксплуатационщика — окисление контактных площадок, выход из строя SD-карт, зависимость контактов от температуры внутри корпуса (а она немалая, китайские чипы не являются сильно энергоэффективными, а платы, зачастую, и вовсе рассчитываются сразу исходя из пикового энергопотребления, поэтому без дополнительного радиатора ну никак). Так и оказалось, что при выдергивании питания из устройства система приходила в неработоспособное состояние — повреждались файлы с байт-кодом ERTS, после перезагрузки приложение отказывалось работать.
Второй неприятный момент — на точке установки интернет обеспечивался LTE-роутером и был, мягко говоря, посредственного качества, в отличие от офисного провода. Сеть постоянно искрила, приложение часто переподключалось, а то и вовсе умирало от скопившихся в очередях на отправку сообщений.
Конечно, обе проблемы являются преодолимыми, так, например, потеря данных устранялась бы поиском оптимальной комбинации хорошей MicroSD-карты и настроек файловой системы, а нестабильность соединения можно было бы компенсировать предварительной агрегацией данных, короткими сессиями отправки, разряженными по времени и т.п. Но вскрывшиеся проблемы — это повод задуматься, а правильный ли был выбран путь. Необходимость постоянного соединения с сервером ставила крест на событийных сборах данных, когда устройство вешается на внешнюю батарею питания и забрасывается в рюкзак, владелец которого идет на массовое мероприятие, где, понятно, стабильности соединения ожидать не приходится.
Соответственно, следующий шаг был в отказе от серверной части и локализации хранилища данных прямо на устройстве. Кроме того, во избежание долгих и весьма муторных экспериментов с SD-картами, решено было в следующей итерации использовать макетные платы с flash-чипами.
В это момент я вспомнил, что у меня в коллекции есть замечательная плата Carambola 2 от литовских товарищей 8Devices. А если зайти на их сайт, то можно обнаружить еще более компактное устройство на том же чипе под названием Centipede. Прошлые эксперименты с данным классом устройств показали, что Erlang вполне влезает в отведенные 16 МБайт flash-памяти (и еще немного остается приложению). Единственный минус (который, скорее, даже плюс) — это маломощный MIPS и необходимость кросс-компиляции, что делает сборку Erlang-приложения чуть более нетривиальной. Но это был уже известный маршрут, поэтому я заказал парочку Centipede, а сам пока портировал существующую версию, работающую с сервером, на Carambol-у.
Когда приехали компоненты, начался новый этап. Чип AR9331 успешно поддерживался aircrack-ng из коробки, данные можно забирать с Ethernet-интерфейса, последние версии OpenWRT и ERTS собраны и успешно опробованы. Приложение переписано — часть кода переехала в код устройства, данные накапливались в отдельном процессе и периодически сбрасывались в файл в виде сериализованного Erlang-терма. К этому был нарисован простейший web-интерфейс, получающий данные через websocket. Порты для inotify и erlexec благополучно собраны средствами OpenWRT.
Смущало только одно — на данные оставалось 300 килобайт. Не то, чтобы мало, если хранить только MAC-адреса клиентских устройств, но airodump-ng отдает гораздо больше интересной информации, в том числе адреса точек доступа, их ESSID-ы и прочее, которое тоже неплохо было бы запомнить. На всякий случай. Ладно, будем действовать по обстоятельствам.
Собираем, проверяем. С ходу вскрывается проблема.
OpenWRT, как мы все знаем — это такой минималистичный вариант сборки Linux, который предназначен специально для устройств с ограниченными объемами памяти. Как следствие — оттуда выкинуто то, что можно было выкинуть безболезненно, и упрощенно то, что можно было упростить, в том числе многопользовательский режим. Т.е. обычная практика, когда код стартует от root-а и работает с максимальными привилегиями, что, конечно, облегчает вопросы связанные с группами, пользователями и контроль их действий. Да-да, буква S в аббревиатуре IoT отвечает за безопасность. Беда заключается в том, что erlexec, который я использовал для запуска и управления airodump-ng, не может выполнять операции из-под root-а — для этого ему необходим дополнительный пользователь, от имени которого он будет порождать назначенные ему процессы. А при создании дополнительного пользователя с другим уровнем привилегий… правильно, не дает airodump-у достучаться до сетевого устройства. Выкрутить это ограничение из библиотеки показалось процессом небыстрым, поэтому erlexec был заменен на порты — встроенный механизм запуска сторонних процессов в Erlang. Мелочь, а неприятно.
Итак, устройства получены, перепрошиты и даже работают в тепличных условиях. Цепляем батарею, кидаем коробку в рюкзак, идем в молл. На следующий день смотрим на результат — фиаско, файл данных нулевой длины — либо не хватило места, либо передергивание питания сработало не в очень удачный момент. Правим код, чтобы сохранение происходило в два этапа — сначала создавался временный файл, потом он замещал текущий.
Проверить, впрочем, работоспособность этого варианта руки так и не дошли — в поле зрения попала очередная игрушка — Onion Omega2+ на Mediatek 7688. Как и у их собратьев, конструктора LinkIt Smart 7688, там было много всего, но самое главное — вдвое больше flash-памяти, а, значит, уже можно не переживать за нехватку места для хранения данных. Окей.
Заказываем, ждем. Месяц. Два. Терпение лопается — пишем американцам на предмет “где товар, Зин”. Тишина. Открываем спор на PayPal. Американцы просыпаются. Говорят “Ой, у нас система приема заказов сбойнула, сейчас все пришлем”. Высылают, ждем три недели. Фух, устройство на руках и даже работает.
Тут надо сделать небольшое отступление — при том, что у меня в шаговой доступности лежало несколько плат LinkIt Smart, я не рассматривал их в качестве платформы, потому как в самом начале эпопеи попытка использовать их как устройства захвата провалилась. Тогда драйвера для чипа поставлялись в виде собранных модулей под конкретные версии ядра и, видимо, это и стало причиной неработоспособности. В последних версиях OpenWRT появилась как родная поддержка 7688, так и открытый драйвер, так что это повод пересмотреть подход к данным устройствам.
Впрочем, наличие WiFi прямо на чипе было принято использовать по прямому назначению — все-таки устройству нужен хоть какой-нибудь интерфейс управления, причем и в полевых условиях тоже, хотя бы для того, чтобы понять, работоспособно оно или не очень. Посмотреть на полученные данные тоже было бы небесполезно.
Соответственно, комбинируем предыдущие подходы — используем единственный выведенный на MiniDoc USB-интерфейс под WiFi-свисток для сканирования пространства, а встроенный WiFi — для управления устройством в виде маломощной точки доступа. Собираем, проверяем, все работает.
Но аппетит приходит во время еды. Начнем с того, что файл с данными в виде Erlang-сериализации — удел настоящих маньяков, а чуть более широкому спектру специально обученных профессионалов надо что-то попроще. Опять же, помимо складывания данных от airodump-а хотелось бы еще и точное время измерения, и, желательно, хоть какая-то привязка к расположению устройства в пространстве.
Встраиваем между WiFi-свистком и устройством USB-хаб. Настройки (а они зависят от положения устройства на шине в случае OpenWRT) идут лесом, но это уже незначительные мелочи. Правим. Вытаскиваем из завалов USB-GPS приемник, благо, уже проверенный временем и с написанным кодом разбора NMEA-0183 (код, конечно же, все равно пришлось подправить). Проверяем — устройство благополучно не обнаруживается системой, явно нехватка драйверов. Собираем драйвера USB Serial и закидываем на устройство — тоже тишина. Потом вспоминаем, что в больших системах GPS-свисток обнаруживался не как ttyUSBx, а как ttyACMx, т.е. USB GSM modem. Ну отлично, второй заход на добавление драйверов, успех.
Берем код, интегрируем в приложение. Добавляем в приложение sqlite3 в качестве хранилища. Теперь не надо будет проверять наличие записи в состоянии и вообще работа с данными упрощается до небольшого количества строчек. Собираем все в кучу, учим при добавлении данных забирать показания GPS, правим JS-код на мордочке для отображения в случае неполного набора данных (может случится, когда GPS еще не поймал спутники, а данные сканирования эфира уже идут). Проверяем работу — вроде живет. Можно объявлять промежуточную победу.
За пару недель бесперебойной работы — куча данных как по станциям в эфире, так и по клиентам. Теперь борюсь с искушением предложить это устройство инфобезовцам для контроля эфира на вверенных территориях и государству для контроля за перемещением телефонов граждан. Шутка, конечно же, они и так сами все знают.
Так вот, все вышеописанные мытарства — это только pet-проект с очень низкой сложностью (почти сразу было понятно, что и как делать), отсутствием разработки аппаратной части (привет, физика) и выходом на сколько-нибудь более-менее завершенное изделие. Нет, конечно, нельзя исключить, что автор этих строк — дремучий дилетант, а настоящие гуру проходят этот путь за один вечер в промежутке между вечерним чаем и рюмкой коньяка, но пока опыт показывает только одно: ИТ это сложно и оптимизм здесь наказуем финансово, репутационно и мотивационно, а те, кто говорит “там все просто” — либо гении, либо жулики, причем второе более вероятно.





















