Как сменить MAC-адрес сетевой карты в Linux: ip link, NetworkManager, netplan, systemd

Сменить MAC-адрес сетевой карты в Linux можно двумя способами: временно, до перезагрузки, и постоянно, через конфигурацию сетевой подсистемы. Временная смена делается одной командой ip link set dev <интерфейс> address <MAC> и работает в любом дистрибутиве. Постоянная зависит от того, кто управляет сетью: NetworkManager, netplan, systemd-networkd или ifupdown.

Самый частый случай на сервере с AlmaLinux, Rocky Linux или RHEL 9/10 — NetworkManager. Там MAC задаётся параметром cloned-mac-address в профиле подключения: nmcli connection modify ens18 ethernet.cloned-mac-address 02:11:22:33:44:55. На Ubuntu 24.04 это ключ macaddress в YAML-файле netplan, на Debian 12/13 с классическим ifupdown — строка hwaddress в /etc/network/interfaces.

Аппаратный (заводской) адрес в прошивке карты при этом не меняется. Меняется адрес, который ядро использует для отправки кадров. После сброса настроек или загрузки с другого носителя карта снова будет работать с заводским MAC.

Зачем менять MAC и чем это грозит

Типичные причины на серверах:

  • замена сетевой карты или переезд системы на другое железо, когда провайдер или DHCP-сервер выдаёт адрес по старому MAC;
  • клонирование виртуальной машины, у которой MAC совпал с оригиналом;
  • программа с лицензией, привязанной к MAC (некоторые лицензионные серверы так делают);
  • тестирование правил DHCP, port security на коммутаторе, фильтров на маршрутизаторе.

Риски стоит оценить заранее:

  • DHCP. Сервер увидит новый MAC и выдаст другой IP-адрес. Если машина доступна только по SSH, вы можете потерять к ней доступ.
  • Провайдер и дата-центр. На выделенных серверах коммутатор часто пропускает трафик только с MAC, который закреплён за портом. С чужим MAC сервер пропадёт из сети. Перед сменой уточните правила у провайдера.
  • Виртуализация. Гипервизор может блокировать кадры с MAC, который не совпадает с адресом виртуальной карты (MAC spoofing filter). Правильнее менять MAC в настройках виртуальной машины на хосте, а не внутри гостя.
  • Лицензии. Если ПО привязано к MAC, смена адреса может как «починить» лицензию после замены карты, так и сломать её. Перенос лицензии на новое железо часто регулируется договором, проверьте его.
  • Конфликты. Два одинаковых MAC в одном сегменте сети — это потеря пакетов и трудноуловимые сбои.

Любые изменения сети на удалённом сервере делайте при наличии консоли: IPMI, iDRAC, iLO, VNC-консоль гипервизора или панель провайдера.

Какой MAC-адрес выбрать

MAC — это 6 байт, обычно в записи aa:bb:cc:dd:ee:ff. Два младших бита первого байта имеют значение:

  • младший бит должен быть 0 — иначе адрес групповой (multicast), такой адрес интерфейсу назначить нельзя;
  • второй бит, равный 1, означает «локально администрируемый адрес». Такие адреса не пересекаются с заводскими адресами производителей.

Практическое правило: вторая шестнадцатеричная цифра первого байта — 2, 6, A или E. Например, 02:11:22:33:44:55 или 0a:1b:2c:3d:4e:5f. Если нужно вернуть машине конкретный старый адрес (DHCP-резервирование, лицензия), используйте именно его.

Временно: ip link

Команда работает в Debian, Ubuntu, AlmaLinux, Rocky Linux и любом другом дистрибутиве с iproute2. Изменение пропадёт после перезагрузки или переподключения интерфейса сетевым менеджером.

# узнать имя интерфейса и текущий MAC
ip -br link

# сменить адрес
sudo ip link set dev ens18 down
sudo ip link set dev ens18 address 02:11:22:33:44:55
sudo ip link set dev ens18 up

Многие драйверы позволяют сменить MAC без отключения интерфейса, но на части карт команда без down вернёт ошибку Device or resource busy. Учтите: если вы подключены через этот интерфейс по SSH, после down сессия оборвётся. Выполняйте все три команды одной строкой через && или из консоли.

Если интерфейсом управляет NetworkManager, он может вернуть свой адрес при следующей активации профиля. Для постоянной смены используйте способы ниже.

Постоянно: NetworkManager и nmcli

Подходит для AlmaLinux и Rocky Linux 9/10, RHEL, Fedora, а также для Debian и Ubuntu, если интерфейсом управляет NetworkManager. Настройка хранится в профиле подключения.

В профиле есть два похожих параметра, их часто путают:

Параметр nmcliЧто делаетАналог в старом ifcfg
ethernet.mac-addressПривязывает профиль к карте с этим заводским MAC. Адрес не меняет.HWADDR=
ethernet.cloned-mac-addressЗадаёт MAC, который будет установлен на интерфейс.MACADDR=

Это ровно та ловушка, о которой писали ещё во времена CentOS 6: если поменять HWADDR, система не найдёт карту с таким адресом и откажется поднимать интерфейс. Менять нужно MACADDR, а в современном NetworkManager — cloned-mac-address.

# список профилей и устройств
nmcli connection show
nmcli device status

# задать MAC для профиля ens18
sudo nmcli connection modify ens18 ethernet.cloned-mac-address 02:11:22:33:44:55

# применить
sudo nmcli connection up ens18

Кроме конкретного адреса, cloned-mac-address принимает специальные значения:

  • permanent — использовать заводской адрес;
  • preserve — не трогать адрес, который уже стоит на интерфейсе;
  • random — новый случайный адрес при каждом подключении;
  • stable — сгенерированный адрес, постоянный для этого профиля и машины.

Чтобы вернуть заводской MAC, очистите параметр: nmcli connection modify ens18 ethernet.cloned-mac-address "", затем снова nmcli connection up ens18. Для Wi-Fi параметр называется wifi.cloned-mac-address.

Где лежит настройка в AlmaLinux и RHEL

В AlmaLinux, Rocky Linux и RHEL 9 новые профили хранятся в формате keyfile в каталоге /etc/NetworkManager/system-connections/. Файл профиля выглядит примерно так:

[connection]
id=ens18
type=ethernet
interface-name=ens18

[ethernet]
cloned-mac-address=02:11:22:33:44:55

[ipv4]
method=auto

Если редактируете файл вручную, после правки выполните sudo nmcli connection reload и sudo nmcli connection up ens18. Права на файл должны быть 600 и владелец root, иначе NetworkManager его проигнорирует.

Старые профили /etc/sysconfig/network-scripts/ifcfg-* в версии 9 ещё читаются, и строка MACADDR= там по-прежнему работает. В версии 10 поддержку ifcfg убрали, поэтому перед обновлением переведите профили в keyfile командой nmcli connection migrate. Подробнее о профилях, nmtui и keyfile — в статье Настройка сети в AlmaLinux и RHEL 9: nmtui и nmcli.

Постоянно: netplan в Ubuntu 24.04

На Ubuntu Server сеть описывается в YAML-файлах в /etc/netplan/, а netplan генерирует из них конфигурацию для systemd-networkd (по умолчанию на сервере) или NetworkManager (на десктопе). MAC задаётся ключом macaddress.

Документация netplan предупреждает: при рендерере networkd смена MAC надёжно работает, только если устройство выбрано по MAC через match, а не по имени. Поэтому пример такой:

# /etc/netplan/50-cloud-init.yaml (имя файла у вас может отличаться)
network:
  version: 2
  ethernets:
    lan0:
      match:
        macaddress: "52:54:00:aa:bb:cc"   # заводской MAC карты
      set-name: ens18
      macaddress: "02:11:22:33:44:55"     # новый MAC
      dhcp4: true

Проверьте и примените:

sudo netplan generate
sudo netplan try      # откатится сам через 120 секунд, если не подтвердить
sudo netplan apply

netplan try удобен на удалённых серверах: если после применения пропал доступ, через две минуты вернётся старая конфигурация. Если файл создан cloud-init, проверьте, что cloud-init не перезапишет его при следующей загрузке. Обычно для этого в /etc/cloud/cloud.cfg.d/ кладут файл с network: {config: disabled}.

Права на YAML-файлы netplan должны быть 600, иначе netplan apply выдаст предупреждение.

Постоянно: systemd-networkd и файл .link

Если вы используете systemd-networkd напрямую (без netplan) или хотите задать MAC на уровне udev для любого сетевого менеджера, подойдёт файл .link. Его применяет systemd-udevd в момент появления устройства.

# /etc/systemd/network/10-ens18.link
[Match]
PermanentMACAddress=52:54:00:aa:bb:cc

[Link]
MACAddress=02:11:22:33:44:55

Что важно:

  • Имя файла должно идти раньше системного 99-default.link в алфавитном порядке, отсюда префикс 10-. Применяется первый подходящий файл.
  • В [Match] используйте PermanentMACAddress= — заводской адрес. Сопоставление по текущему MACAddress= после смены адреса перестанет совпадать.
  • Если в файле указан MACAddress=, параметр MACAddressPolicy= должен быть пустым или none.
  • Если .link переопределяет и имя интерфейса, правило может срабатывать уже в initramfs. Тогда после правки обновите initramfs: update-initramfs -u в Debian/Ubuntu или dracut -f в AlmaLinux.

Самый надёжный способ применить .link — перезагрузка. Без неё можно попробовать sudo udevadm trigger --action=add /sys/class/net/ens18, но на работающем интерфейсе это срабатывает не всегда. Проверить, какой файл применился к устройству: udevadm test-builtin net_setup_link /sys/class/net/ens18.

Альтернатива для чистого systemd-networkd — ключ MACAddress= в секции [Link] файла .network. Но .link работает независимо от того, кто дальше настраивает IP-адрес.

Постоянно: ifupdown в Debian 12 и 13

На Debian, установленном без графики, сетью обычно управляет ifupdown через файл /etc/network/interfaces. MAC задаётся опцией hwaddress в описании интерфейса:

# /etc/network/interfaces
auto ens18
iface ens18 inet static
    address 192.0.2.10/24
    gateway 192.0.2.1
    hwaddress 02:11:22:33:44:55

Для DHCP так же:

auto ens18
iface ens18 inet dhcp
    hwaddress 02:11:22:33:44:55

Встречается и старая запись hwaddress ether 02:11:22:33:44:55, современный ifupdown понимает обе формы. Применить:

sudo ifdown ens18 && sudo ifup ens18

На удалённом сервере выполняйте это только одной строкой и при наличии консоли. Вместо ручной правки можно поставить пакет macchanger из репозитория Debian/Ubuntu: он умеет показать заводской адрес (macchanger -s ens18) и сгенерировать случайный. Но для постоянной настройки всё равно нужна запись в конфигурации.

Проверка результата

ip link show ens18

Вывод примерно такой:

2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 02:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff permaddr 52:54:00:aa:bb:cc

В строке link/ether — текущий адрес. Поле permaddr показывается, когда текущий адрес отличается от заводского. Заводской адрес также покажет ethtool -P ens18.

Дополнительно:

  • nmcli -f GENERAL.HWADDR device show ens18 — адрес глазами NetworkManager;
  • ip -br addr show ens18 — получил ли интерфейс IP после смены MAC;
  • на другой машине в той же сети: ip neigh — какой MAC видят соседи (после истечения ARP-кэша);
  • перезагрузите сервер и проверьте ещё раз: постоянная настройка должна пережить перезагрузку.

Таблица: симптом, причина, решение

СимптомПричинаРешение
RTNETLINK answers: Device or resource busyДрайвер не меняет MAC на поднятом интерфейсеСначала ip link set dev ens18 down, потом смена адреса
Cannot assign requested addressГрупповой адрес: нечётный первый байтВозьмите адрес вида 02:xx:xx:xx:xx:xx
После перезагрузки вернулся старый MACМеняли через ip link, это временноЗадайте адрес в nmcli, netplan, .link или interfaces
Интерфейс не поднимается после правки профиляИзменён HWADDR или ethernet.mac-address вместо клонированного адресаВерните заводской адрес в привязку, новый задайте через cloned-mac-address / MACADDR
Сменили MAC — пропал IPDHCP выдал новый адрес или резервирование было по старому MACОбновите резервирование на DHCP-сервере или используйте статический IP
MAC сменился, но трафика нетPort security на коммутаторе или фильтр MAC в гипервизореСогласуйте адрес с провайдером, меняйте MAC в настройках ВМ на хосте
netplan: MAC не применяетсяУстройство выбрано по имени при рендерере networkdВыберите устройство через match: macaddress и set-name
.link не срабатываетИмя файла после 99-default.link или неверный [Match]Префикс 10-, сопоставление по PermanentMACAddress=, перезагрузка

Различия между Debian, Ubuntu и AlmaLinux

СистемаКто обычно управляет сетьюГде задать MAC
AlmaLinux / Rocky Linux 9NetworkManager, keyfilenmcli ... ethernet.cloned-mac-address; в старых ifcfg — MACADDR=
AlmaLinux / Rocky Linux 10NetworkManager, только keyfilenmcli ... ethernet.cloned-mac-address
Ubuntu 24.04 Servernetplan + systemd-networkdmacaddress в /etc/netplan/*.yaml
Ubuntu 24.04 Desktopnetplan + NetworkManagernmcli или настройки GNOME
Debian 12 / 13 без графикиifupdownhwaddress в /etc/network/interfaces
Debian 12 / 13 с графикойNetworkManagernmcli
Любая система с systemdsystemd-udevdфайл /etc/systemd/network/*.link

Если вы не знаете, кто управляет сетью, посмотрите: systemctl is-active NetworkManager systemd-networkd networking. Активный сервис и подскажет, какой раздел статьи вам нужен.

Для виртуальных машин помните: MAC гостя задаётся в гипервизоре. В Proxmox VE это поле MAC в свойствах сетевого устройства ВМ. Как развернуть сам гипервизор, рассказано в статье Установка Proxmox VE на свой сервер.

Частые вопросы

Меняется ли MAC в самой сетевой карте?

Нет. Заводской адрес хранится в прошивке карты и остаётся прежним. Linux лишь сообщает драйверу, какой адрес использовать. Заводской адрес можно увидеть командой ethtool -P ens18 или в поле permaddr вывода ip link.

Почему в RHEL нельзя просто поменять HWADDR?

HWADDR в ifcfg и ethernet.mac-address в NetworkManager — это не установка адреса, а привязка профиля к конкретной карте. Если указать там другой адрес, NetworkManager не найдёт подходящее устройство и не поднимет профиль. Для смены адреса предназначены MACADDR и cloned-mac-address.

Можно ли сменить MAC без потери SSH-сессии?

Иногда да: многие драйверы меняют адрес без отключения интерфейса, а при статическом IP связь восстановится после обновления ARP-кэша у шлюза. Но гарантии нет, особенно если IP выдаётся по DHCP или провайдер фильтрует MAC. Держите под рукой консоль и делайте изменения одной командой.

Как вернуть заводской MAC?

Удалите свою настройку: очистите cloned-mac-address в nmcli, уберите macaddress из netplan или hwaddress из /etc/network/interfaces, удалите свой .link-файл. Затем переподключите интерфейс или перезагрузите сервер. В NetworkManager можно явно указать значение permanent.

Нужно ли менять MAC у bond или моста?

Обычно нет. Bond и мост берут MAC одного из подчинённых интерфейсов. Если адрес всё же нужен фиксированный, задавайте его в профиле самого bond или моста: в nmcli для них тоже есть cloned-mac-address, в netplan — macaddress. После смены проверьте, что коммутатор не блокирует новый адрес.

Помогает ли смена MAC при проблемах с IPv6?

Только косвенно. При автонастройке SLAAC с EUI-64 IPv6-адрес строится из MAC, поэтому после смены MAC он тоже изменится. Если задача — вовсе убрать IPv6, смотрите статью Как отключить IPv6 в Linux.