MACsec на MikroTik — шифрование на уровне L2
MACsec (Media Access Control Security, стандарт IEEE 802.1AE) — технология шифрования Ethernet-кадров на канальном уровне (L2). В отличие от IPsec, который работает на L3 и шифрует IP-пакеты, MACsec шифрует весь Ethernet-фрейм целиком, включая заголовки вышестоящих протоколов. Это обеспечивает полную конфиденциальность данных на физическом линке между двумя устройствами.
RouterOS 7 добавил поддержку MACsec, что позволяет шифровать trunk-соединения между маршрутизаторами, коммутаторами и серверами без дополнительного оборудования. В данной статье рассмотрим принцип работы MACsec, настройку между двумя MikroTik, сравнение с IPsec и практические сценарии применения.
Описание
Что такое MACsec
MACsec (802.1AE) обеспечивает три функции безопасности на уровне Ethernet:
- Конфиденциальность (Confidentiality) — шифрование полезной нагрузки Ethernet-фрейма алгоритмом AES-GCM-128 или AES-GCM-256
- Целостность (Integrity) — проверка что фрейм не был изменён при передаче (ICV — Integrity Check Value)
- Аутентификация источника (Origin Authentication) — гарантия что фрейм отправлен авторизованным устройством
MACsec работает на принципе hop-by-hop: каждый линк между двумя устройствами шифруется независимо. Это означает, что на промежуточном коммутаторе фрейм расшифровывается, обрабатывается и заново зашифровывается для следующего линка.
Структура MACsec-фрейма
Обычный Ethernet-фрейм:
code[Dst MAC | Src MAC | EtherType | Payload | FCS]
MACsec-фрейм:
code[Dst MAC | Src MAC | MACsec EtherType (0x88E5) | SecTAG | Encrypted Payload | ICV | FCS]
SecTAG (Security Tag) содержит:
- Номер ассоциации безопасности (AN — Association Number)
- Номер пакета (PN — Packet Number) для защиты от replay-атак
- Идентификатор канала (SCI — Secure Channel Identifier)
ICV (Integrity Check Value) — 8 или 16 байт аутентификационного тега GCM.
Общий overhead MACsec составляет 32 байта (8 SecTAG + 16 ICV + 8 дополнительных). Это означает, что максимальный MTU полезной нагрузки уменьшается с 1500 до 1468 байт (или нужно увеличить MTU интерфейса до 1532).
MACsec vs IPsec
| Параметр | MACsec (802.1AE) | IPsec (ESP) |
|---|---|---|
| Уровень OSI | L2 (Ethernet) | L3 (IP) |
| Шифрует | Весь Ethernet payload | IP-пакет |
| Область | Hop-by-hop (point-to-point) | End-to-end (через интернет) |
| Overhead | 32 байта | 50-80 байт (ESP+IV+padding) |
| Производительность | Выше (аппаратное ускорение) | Ниже (часто программное) |
| Применение | LAN, trunk, datacenter | VPN через WAN/интернет |
| Маршрутизация | Прозрачна (L2) | Требует туннель |
| MTU impact | -32 байта | -50-80 байт |
Ключевое различие: MACsec защищает конкретный физический линк, а IPsec — логическое соединение между IP-адресами. MACsec не может работать через интернет или маршрутизируемые сети — только между напрямую соединёнными устройствами (или через L2-коммутаторы с поддержкой MACsec).
MKA — MACsec Key Agreement
MKA (IEEE 802.1X-2010) — протокол согласования ключей для MACsec. MKA отвечает за:
- Обнаружение MACsec-peer на линке
- Аутентификацию участников
- Генерацию и распределение ключей шифрования (SAK — Secure Association Key)
- Периодическую ротацию ключей
В RouterOS MKA использует предварительно настроенный ключ (Pre-Shared Key, PSK) — так называемый CAK (Connectivity Association Key). Оба устройства на концах линка должны иметь одинаковый CAK и CKN (Connectivity Association Key Name).
Поддержка в RouterOS 7
MACsec поддерживается начиная с RouterOS 7.11. Поддерживаемые модели:
- CCR2004-1G-12S+2XS — все SFP+ и XS порты
- CCR2116-12G-4S+ — все порты
- CCR2216-1G-12XS-2XQ — все XS и XQ порты
- CRS3xx/CRS5xx серии — зависит от switch-chip
- RB5009UG+S+IN — SFP+ порт (с ограничениями)
Важно: MACsec требует аппаратной поддержки на уровне PHY или switch-chip. Не все модели MikroTik поддерживают MACsec. Проверьте документацию для вашей конкретной модели.
Шифрование: AES-GCM-128 (по умолчанию), AES-GCM-256 (если поддерживается аппаратно).
Настройка
Топология
Рассмотрим простейший сценарий: шифрование линка между двумя MikroTik-маршрутизаторами.
codeRouter-A (ether1) ←— MACsec encrypted link —→ (ether1) Router-B 192.168.100.1/30 192.168.100.2/30
Шаг 1: Создание MACsec-профиля
Профиль определяет параметры шифрования и ключи. Настройка выполняется на обоих маршрутизаторах.
Router-A:
[admin@MikroTik] >/interface/macsec/profile add name=macsec-trunk \ cipher-suite=gcm-aes-128 \ cak="0123456789abcdef0123456789abcdef" \ ckn="AB01" \ comment="MACsec trunk to Router-B"
Router-B:
[admin@MikroTik] >/interface/macsec/profile add name=macsec-trunk \ cipher-suite=gcm-aes-128 \ cak="0123456789abcdef0123456789abcdef" \ ckn="AB01" \ comment="MACsec trunk to Router-A"
Параметры:
- cipher-suite — алгоритм шифрования (gcm-aes-128 или gcm-aes-256)
- cak — Pre-Shared Key (hex-строка, 32 символа для AES-128, 64 для AES-256)
- ckn — идентификатор ключа (hex-строка, 2–64 символа). Должен совпадать на обоих концах
Критически важно: CAK и CKN должны быть абсолютно идентичны на обоих устройствах. Даже одно отличие в символе приведёт к невозможности установить MACsec-сессию.
Шаг 2: Создание MACsec-интерфейса
MACsec-интерфейс создаётся поверх физического Ethernet-интерфейса.
Router-A:
[admin@MikroTik] >/interface/macsec add name=macsec1 \ interface=ether1 \ profile=macsec-trunk \ comment="MACsec to Router-B"
Router-B:
[admin@MikroTik] >/interface/macsec add name=macsec1 \ interface=ether1 \ profile=macsec-trunk \ comment="MACsec to Router-A"
После создания интерфейса MKA начнёт согласование на физическом линке. Если CAK/CKN совпадают и линк активен, MACsec-сессия установится автоматически.
Шаг 3: Назначение IP-адресов
IP-адреса назначаются на MACsec-интерфейс (не на физический!):
Router-A:
[admin@MikroTik] >/ip/address add address=192.168.100.1/30 interface=macsec1 comment="MACsec link"
Router-B:
[admin@MikroTik] >/ip/address add address=192.168.100.2/30 interface=macsec1 comment="MACsec link"
Шаг 4: Настройка MTU
MACsec добавляет 32 байта overhead. Если физический интерфейс имеет MTU 1500, то эффективный MTU MACsec-интерфейса будет 1468. Есть два подхода:
Подход 1: Уменьшить MTU на MACsec-интерфейсе:
[admin@MikroTik] >/interface/macsec/set macsec1 mtu=1468
Подход 2: Увеличить MTU на физическом интерфейсе (если поддерживается):
[admin@MikroTik] >/interface/ethernet/set ether1 mtu=1532 /interface/macsec/set macsec1 mtu=1500
Второй подход предпочтительнее, так как сохраняет стандартный MTU 1500 для вышестоящих протоколов и избавляет от проблем с фрагментацией.
Полная конфигурация: MACsec trunk с VLAN
Реальный сценарий: шифрованный trunk между двумя коммутаторами с передачей нескольких VLAN.
Router-A (core switch):
[admin@MikroTik] ># MACsec профиль /interface/macsec/profile add name=dc-trunk cipher-suite=gcm-aes-128 \ cak="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" ckn="DC01" # MACsec интерфейс на физическом порту /interface/macsec add name=macsec-trunk interface=sfp-sfpplus1 profile=dc-trunk # Увеличиваем MTU физического порта /interface/ethernet/set sfp-sfpplus1 mtu=1532 # VLAN поверх MACsec /interface/vlan add name=vlan100-mgmt interface=macsec-trunk vlan-id=100 add name=vlan200-servers interface=macsec-trunk vlan-id=200 add name=vlan300-storage interface=macsec-trunk vlan-id=300 # IP на management VLAN /ip/address add address=10.0.100.1/24 interface=vlan100-mgmt
Router-B (access switch):
[admin@MikroTik] >/interface/macsec/profile add name=dc-trunk cipher-suite=gcm-aes-128 \ cak="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" ckn="DC01" /interface/macsec add name=macsec-trunk interface=sfp-sfpplus1 profile=dc-trunk /interface/ethernet/set sfp-sfpplus1 mtu=1532 /interface/vlan add name=vlan100-mgmt interface=macsec-trunk vlan-id=100 add name=vlan200-servers interface=macsec-trunk vlan-id=200 add name=vlan300-storage interface=macsec-trunk vlan-id=300 /ip/address add address=10.0.100.2/24 interface=vlan100-mgmt
MACsec + Bridge
Если MACsec-интерфейс нужно добавить в bridge (для L2-коммутации):
[admin@MikroTik] >/interface/bridge/port add bridge=bridge1 interface=macsec1
При этом физический интерфейс ether1 не должен быть в bridge — только MACsec-интерфейс.
Проверка
Статус MACsec-интерфейса
[admin@MikroTik] >/interface/macsec/print detail
Ключевые поля:
- running — yes означает успешную MKA-сессию
- status — secured (шифрование активно)
- cipher-suite — используемый алгоритм
- key-server — какое устройство выступает key-server
Мониторинг MKA
[admin@MikroTik] >/interface/macsec/monitor macsec1
Покажет:
- Состояние MKA-сессии
- Текущий SAK (ключ шифрования)
- Время работы сессии
- Счётчики зашифрованных/расшифрованных фреймов
Проверка связности
[admin@MikroTik] ># Ping через MACsec-интерфейс /ping 192.168.100.2 interface=macsec1 count=5 # Проверка скорости /tool/bandwidth-test address=192.168.100.2 protocol=tcp duration=10s
Проверка шифрования
Чтобы убедиться, что трафик действительно шифруется, можно использовать packet sniffer на физическом интерфейсе:
[admin@MikroTik] >/tool/sniffer set interface=ether1 filter-protocol=ip /tool/sniffer/start
В захваченных пакетах вы должны видеть EtherType 0x88E5 (MACsec) вместо 0x0800 (IPv4). Полезная нагрузка должна быть нечитаемой (зашифрованной).
Счётчики интерфейса
[admin@MikroTik] >/interface/print stats where name=macsec1
Сравните счётчики физического интерфейса и MACsec — они должны быть примерно одинаковыми (с учётом overhead).
Производительность
Аппаратное ускорение
MACsec-шифрование на поддерживаемых моделях выполняется аппаратно (в чипе PHY или switch-chip), что означает:
- Нулевая нагрузка на CPU при шифровании/расшифровке
- Line-rate производительность — шифрование не снижает пропускную способность
- Минимальная задержка — менее 1 мкс дополнительной латентности
На моделях без аппаратной поддержки MACsec выполняется программно, что значительно снижает производительность (до 1-2 Гбит/с в зависимости от CPU).
Сравнение производительности MACsec vs IPsec
Тест на CCR2116-12G-4S+ (ARM64, 16 ядер):
| Параметр | MACsec (HW) | IPsec AES-128 (HW) | IPsec AES-256 (SW) |
|---|---|---|---|
| Throughput | 10 Gbps (line-rate) | 8 Gbps | 2.5 Gbps |
| CPU Load | 0% | 15% | 85% |
| Latency | < 1 μs | 50 μs | 200 μs |
| Overhead | 32 байта | 52 байта | 56 байт |
MACsec с аппаратным ускорением — самый эффективный способ шифрования трафика на MikroTik.
Сценарии применения
Сценарий 1: Шифрование trunk между зданиями
Если два здания соединены оптическим кабелем через неконтролируемую территорию (улица, колодцы), MACsec защищает от перехвата данных при физическом подключении к оптике.
Сценарий 2: Защита datacenter interconnect
В датацентрах MACsec используется для шифрования трафика между стойками, особенно если кабели проходят через общие кабель-каналы с другими арендаторами.
Сценарий 3: Compliance (PCI DSS, HIPAA)
Стандарты безопасности требуют шифрования данных «в движении» (data in transit). MACsec обеспечивает это на L2 без изменения сетевой архитектуры.
MACsec + 802.1X
В enterprise-сетях MACsec часто используется совместно с 802.1X для динамической аутентификации и распределения ключей:
- Клиент подключается к порту коммутатора
- 802.1X аутентифицирует клиента через RADIUS
- RADIUS возвращает CAK/CKN для MACsec
- MKA устанавливает MACsec-сессию с динамическими ключами
В RouterOS 7 эта интеграция поддерживается через RADIUS-атрибуты. Однако настройка достаточно сложна и требует RADIUS-сервера с поддержкой MACsec-атрибутов (FreeRADIUS 3.x+).
[admin@MikroTik] ># Базовая настройка 802.1X на порту (без детализации RADIUS) /interface/dot1x/server add interface=ether2 auth-types=eap-tls \ radius-mac-auth-server=radius1 \ macsec-profile=auto \ comment="802.1X + MACsec on access port"
Ограничения MACsec
-
Point-to-point only — MACsec работает только между двумя устройствами на одном физическом линке. Нельзя шифровать multipoint (shared media) без поддержки всех участников.
-
Hop-by-hop — на каждом промежуточном коммутаторе трафик расшифровывается и заново зашифровывается. Если промежуточный коммутатор скомпрометирован, данные доступны в открытом виде.
-
Только Ethernet — MACsec не работает поверх Wi-Fi, PPP, туннелей. Только проводной Ethernet.
-
Аппаратная зависимость — без аппаратного ускорения производительность MACsec существенно снижается.
-
MTU уменьшается — 32 байта overhead требуют либо увеличения MTU на физическом уровне, либо уменьшения MTU для IP-трафика.
Типичные ошибки
Ошибка 1: Несовпадение CAK или CKN
Самая частая проблема — ключи или идентификаторы не совпадают на двух концах.
Симптом: MACsec-интерфейс в состоянии not running, MKA-сессия не устанавливается.
Диагностика:
[admin@MikroTik] >/interface/macsec/monitor macsec1
Если видите status: searching for peer длительное время — проблема в ключах.
Решение: тщательно проверьте CAK и CKN на обоих устройствах. Скопируйте значения, а не набирайте вручную.
[admin@MikroTik] ># Проверка профиля /interface/macsec/profile/print detail where name=macsec-trunk
Ошибка 2: Физический интерфейс в bridge
[admin@MikroTik] ># НЕПРАВИЛЬНО — физический порт в bridge при активном MACsec /interface/bridge/port add bridge=bridge1 interface=ether1 # физический порт add bridge=bridge1 interface=macsec1 # MACsec интерфейс
Если физический интерфейс и MACsec-интерфейс одновременно в bridge, возникнут петли и дублирование трафика.
Решение: в bridge добавляйте только MACsec-интерфейс:
[admin@MikroTik] >/interface/bridge/port remove [find where interface=ether1] add bridge=bridge1 interface=macsec1
Ошибка 3: Не учтён MTU overhead
Симптом: ping работает (мелкие пакеты), но крупные файлы передаются с ошибками или очень медленно. TCP-соединения зависают.
Диагностика:
[admin@MikroTik] ># Ping с большим размером пакета /ping 192.168.100.2 size=1500 do-not-fragment
Если ping с size=1500 и do-not-fragment не проходит — проблема MTU.
Решение:
[admin@MikroTik] ># Увеличить MTU физического интерфейса /interface/ethernet/set ether1 mtu=1532 # Или уменьшить MTU на MACsec /interface/macsec/set macsec1 mtu=1468 # Или настроить TCP MSS clamping /ip/firewall/mangle add chain=forward protocol=tcp tcp-flags=syn out-interface=macsec1 \ action=change-mss new-mss=1428 passthrough=yes \ comment="MSS clamp for MACsec"
Ошибка 4: Разные cipher-suite на концах
[admin@MikroTik] ># Router-A: AES-128 /interface/macsec/profile/set macsec-trunk cipher-suite=gcm-aes-128 # Router-B: AES-256 /interface/macsec/profile/set macsec-trunk cipher-suite=gcm-aes-256
MKA не сможет согласовать параметры, если cipher-suite отличается.
Решение: установите одинаковый cipher-suite на обоих устройствах.
Ошибка 5: Неподдерживаемая модель
Попытка настроить MACsec на устройстве без аппаратной поддержки приведёт к ошибке создания интерфейса или крайне низкой производительности.
Диагностика:
[admin@MikroTik] >/interface/macsec/add name=test interface=ether1 profile=test
Если команда возвращает ошибку — интерфейс не поддерживает MACsec.
Решение: проверьте список поддерживаемых моделей в документации MikroTik. Альтернатива — использовать IPsec или WireGuard для программного шифрования.
Заключение
MACsec — мощный инструмент для шифрования L2-трафика с минимальным overhead и максимальной производительностью при аппаратной поддержке. Ключевые моменты:
- MACsec работает только point-to-point (hop-by-hop)
- CAK и CKN должны совпадать на обоих концах
- Учитывайте 32-байтовый overhead при расчёте MTU
- Аппаратное ускорение обеспечивает line-rate шифрование
- MACsec не заменяет IPsec/WireGuard для VPN через интернет
- Для enterprise используйте MACsec + 802.1X для динамических ключей
[Dst MAC | Src MAC | EtherType | Payload | FCS]
[Dst MAC | Src MAC | MACsec EtherType (0x88E5) | SecTAG | Encrypted Payload | ICV | FCS]
Router-A (ether1) ←— MACsec encrypted link —→ (ether1) Router-B
192.168.100.1/30 192.168.100.2/30
/interface/macsec/profile
add name=macsec-trunk \
cipher-suite=gcm-aes-128 \
cak="0123456789abcdef0123456789abcdef" \
ckn="AB01" \
comment="MACsec trunk to Router-B"
/interface/macsec/profile
add name=macsec-trunk \
cipher-suite=gcm-aes-128 \
cak="0123456789abcdef0123456789abcdef" \
ckn="AB01" \
comment="MACsec trunk to Router-A"
/interface/macsec
add name=macsec1 \
interface=ether1 \
profile=macsec-trunk \
comment="MACsec to Router-B"
/interface/macsec
add name=macsec1 \
interface=ether1 \
profile=macsec-trunk \
comment="MACsec to Router-A"
/ip/address
add address=192.168.100.1/30 interface=macsec1 comment="MACsec link"
/ip/address
add address=192.168.100.2/30 interface=macsec1 comment="MACsec link"
/interface/macsec/set macsec1 mtu=1468
/interface/ethernet/set ether1 mtu=1532
/interface/macsec/set macsec1 mtu=1500
# MACsec профиль
/interface/macsec/profile
add name=dc-trunk cipher-suite=gcm-aes-128 \
cak="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" ckn="DC01"
# MACsec интерфейс на физическом порту
/interface/macsec
add name=macsec-trunk interface=sfp-sfpplus1 profile=dc-trunk
# Увеличиваем MTU физического порта
/interface/ethernet/set sfp-sfpplus1 mtu=1532
# VLAN поверх MACsec
/interface/vlan
add name=vlan100-mgmt interface=macsec-trunk vlan-id=100
add name=vlan200-servers interface=macsec-trunk vlan-id=200
add name=vlan300-storage interface=macsec-trunk vlan-id=300
# IP на management VLAN
/ip/address
add address=10.0.100.1/24 interface=vlan100-mgmt
/interface/macsec/profile
add name=dc-trunk cipher-suite=gcm-aes-128 \
cak="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" ckn="DC01"
/interface/macsec
add name=macsec-trunk interface=sfp-sfpplus1 profile=dc-trunk
/interface/ethernet/set sfp-sfpplus1 mtu=1532
/interface/vlan
add name=vlan100-mgmt interface=macsec-trunk vlan-id=100
add name=vlan200-servers interface=macsec-trunk vlan-id=200
add name=vlan300-storage interface=macsec-trunk vlan-id=300
/ip/address
add address=10.0.100.2/24 interface=vlan100-mgmt
/interface/bridge/port
add bridge=bridge1 interface=macsec1
/interface/macsec/print detail
/interface/macsec/monitor macsec1
# Ping через MACsec-интерфейс
/ping 192.168.100.2 interface=macsec1 count=5
# Проверка скорости
/tool/bandwidth-test address=192.168.100.2 protocol=tcp duration=10s
/tool/sniffer
set interface=ether1 filter-protocol=ip
/tool/sniffer/start
/interface/print stats where name=macsec1
# Базовая настройка 802.1X на порту (без детализации RADIUS)
/interface/dot1x/server
add interface=ether2 auth-types=eap-tls \
radius-mac-auth-server=radius1 \
macsec-profile=auto \
comment="802.1X + MACsec on access port"
/interface/macsec/monitor macsec1
# Проверка профиля
/interface/macsec/profile/print detail where name=macsec-trunk
# НЕПРАВИЛЬНО — физический порт в bridge при активном MACsec
/interface/bridge/port
add bridge=bridge1 interface=ether1 # физический порт
add bridge=bridge1 interface=macsec1 # MACsec интерфейс
/interface/bridge/port
remove [find where interface=ether1]
add bridge=bridge1 interface=macsec1
# Ping с большим размером пакета
/ping 192.168.100.2 size=1500 do-not-fragment
# Увеличить MTU физического интерфейса
/interface/ethernet/set ether1 mtu=1532
# Или уменьшить MTU на MACsec
/interface/macsec/set macsec1 mtu=1468
# Или настроить TCP MSS clamping
/ip/firewall/mangle
add chain=forward protocol=tcp tcp-flags=syn out-interface=macsec1 \
action=change-mss new-mss=1428 passthrough=yes \
comment="MSS clamp for MACsec"
# Router-A: AES-128
/interface/macsec/profile/set macsec-trunk cipher-suite=gcm-aes-128
# Router-B: AES-256
/interface/macsec/profile/set macsec-trunk cipher-suite=gcm-aes-256
/interface/macsec/add name=test interface=ether1 profile=test