В большинстве домашних и городских сетей используется доступ через
DHCP, с привязкой внутреннего IP-адреса к MAC-адресу сетевой карты. Что
само по себе не хорошо и не плохо - ибо в большинстве случаев
пользователя никак не касается: при смене машины (и сетевой карты)
достаточно позвонить провайдеру для перепривязки. Тем не менее, можно
представить себе минимум две ситуации, когда смена MAC-адреса
пользователем становится необходимостью - без всякого злого умысла.
1. потребность выходить в сеть попеременно с двух машин, при отсуствии возможности (или желания) налаживать сеть внутреннюю; 2. наличие двух операционок и двух сетевых карт, каждая из которых поддерживается только одной операционкой.
Не
так невероятно, как кажется. Первая причина может быть обусловлена еще
и тем, что провайдеры, предоставляющие безлимитный доступ, без восторга
относятся к тому, что пользователь качает сразу с двух машин - хотя как
это может повредить при соответствующим образом обрезанной скорости (а
дешевые безлимитные тарифы всегда обрезаны), я не очень представляю.
А
во второй ситуации я оказался недавно при покупке новой машины:
встроенная сетевая от чипсета nForce250 (не Ultra) прекрасно
поддерживалась Linux'ом (при должным образом собранном ядре), но
категорически не виделась ни во FreeBSD, ни в DragonFly. С извлеченной
же из загашников NE2000-совместимой карточкой неизвестного (подозреваю,
очень китайского) генезиса ситуация была почти обратная: она нормально
опознавалась в DragonFly, но в Linux'е... не то чтобы совсем не
работала, но время от времени куда-то девалась, так что и назвать это
работой язык тоже не поворачивался.
Конечно, все эти проблемы
были решаемы (и в конечном счете решены), но в тот момент мне
требовался доступ в Интернет - и немедленно (дело происходило в
выходные дни, что усложняло ситауцию). И я вспомнил о возможности
подмены MAC-адреса, предоставляемой волшебной палочкой
сетевика-POSIX'ивиста - утилитой ifconfig.
Начнем с Linux'а -
проверялось на дистрибутивах CRUX и Archlinux, при как бы настроенной
сети. Как бы - потому что все, касающееся старта DHCP, было прописано в
конфигах должным образом. Но поскольку MAC-адресы карты не совпадал с
зафиксированным у провайдера, старт этот при загрузке системы
завершался ошибкой. В чем легко было убедиться, запустив ifconfig без
параметров.
Оказалось, что во исправление положения всего то требовалась простая команда (опчерпнуто из man ifcongif):
$ ifcongif eth0 hw ether 00:00:00:00:00:00
где
eth0 - имя сетевого интерфейса, hw (от hardware) - опция,
предписывающая сменить "железный" идентификатор карты, ether - указание
на класс сетевых устройств, а нули заменяются реальным MAC-адресом.
После чего оставалось только перезапустить dhcp-демона. Как - зависит
от дистрибутива. В Archlinux (как и в CRUX) подходящим способом
оказался такой:
$ /etc/rc.d/networks restart
А для того,
чтобы не проделывать все эту процедуру после каждой перезагрузки,
достаточно прописать приведенную выше команду ifconfig с
соответствующими параметрами в какой-либо из подходящих стартовых
скриптов, отрабатываемых до запуска dhcp-демона. В моем случае
подходящим оказался тот же /etc/rc.d/networks, отвечающий в Archlinux
(и в CRUX) за поднятие сети вообще.
В BSD-системах - все
чуть-чуть иначе: различия связаны и с именами сетевых интерфейсов, и с
форматом команды ifconfig, и с особенностями скриптов инициализации.
Для начала - там не стандартного имени интерфейса, eth#, а есть
множество интерфейсных устройств, имена которых более-менее коррелируют
с используемым в сетевой карте чипом. В моем случае (как я уже говорил,
для BSD использовалась карта из семейства NE2000), имя ему было - ed0.
Далее, опции hw в BSD'шном варианте ifconfig нет - достаточно указать
класс устройств и собственно адрес. В результате команда приобретает
такую форму:
$ ifconfig ed0 ether 00:00:00:00:00:00
После чего опять же перезапуск dhcp-службы. Что делается так:
$ /etc/rc.d/dhclient restart
Ну
и увековечить переопределение MAC-адреса можно в том же файле - дописав
в самое его начало приведенную выше строку с командой ifconfig.