Настройка VLAN на Proxmox: VLAN aware, trunk и SDN

Настройка VLAN на Proxmox: VLAN aware, trunk и SDN

Настройка VLAN на Proxmox: VLAN-aware мост, теги и trunk за 20 минут

Настройка VLAN на Proxmox делается в трёх местах: порт коммутатора в режиме trunk, мост vmbr0 с флагом VLAN aware и тег на сетевом адаптере ВМ. Ошибка в любом из трёх даёт одинаковый симптом: ВМ без сети. Ниже рецепт с проверкой каждого звена.

Быстрый ответ
  1. Переведи порт коммутатора, куда воткнут сервер, в trunk: нужные VLAN тегированные, VLAN управления нетегированный.
  2. В /etc/network/interfaces хоста добавь мосту vmbr0 строки bridge-vlan-aware yes и bridge-vids со списком VLAN, примени через ifreload -a.
  3. В настройках сетевого адаптера ВМ или контейнера укажи мост vmbr0 и номер VLAN в поле VLAN Tag.
  4. Проверь командой bridge vlan show и tcpdump на физическом порту, что кадры уходят с нужным тегом.

Нет времени читать — вот минимальная рабочая схема. Конфиг хоста и тег для ВМ. Перед применением поставь таймер отката, он описан в шаге 2, иначе рискуешь остаться без доступа к серверу.


# Файл /etc/network/interfaces на хосте Proxmox
auto vmbr0
iface vmbr0 inet static
        address 192.168.10.5/24
        gateway 192.168.10.1
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 10 20 30 40

# Где выполнять: хост Proxmox, shell под root
ifreload -a
bridge vlan show dev eno1
qm set 101 --net0 virtio,bridge=vmbr0,tag=20

Диагноз: включил VLAN aware в Proxmox, а ВМ без сети

Настройка VLAN на Proxmox выглядит как одна галочка в веб-интерфейсе. Поставил VLAN aware на vmbr0, вписал тег 20 в адаптер ВМ, нажал OK. ВМ не получает адрес, пинг до шлюза не идёт. Знакомо?

VLAN — это просто: тег, мост, коммутатор. Три места, где можно ошибиться. Ошибёшься ты в четвёртом.

Четвёртое место — это порядок действий. Половина потерь доступа к Proxmox случается не из-за неправильного конфига, а из-за правильного конфига, применённого не в той последовательности. Сначала хост, потом коммутатор, или наоборот, и в промежутке у тебя нет связи. Эту последовательность разберём отдельно и с автоматическим откатом.

Что получишь на выходе

  • Мост vmbr0 с фильтрацией VLAN на одном физическом порту или на bond из двух портов.
  • ВМ и LXC-контейнеры в своих VLAN, тег задаётся одним параметром.
  • Trunk с ограниченным набором VLAN в виртуальный роутер или firewall.
  • Управление хостом в отдельном тегированном VLAN, без нетегированного трафика на порту.
  • Именованные сети через SDN VLAN-зону, одинаковые на всех узлах кластера.
  • Проверку tcpdump, мониторинг состояния моста, бэкап сетевых конфигов и план отката.
  • Готовые настройки порта для MikroTik RouterOS 7 и Cisco IOS.

По времени: 20 минут на базовую схему с тегами для ВМ. Ещё 15 минут, если переносишь управление хостом в тегированный VLAN. Время на поход к серверу ногами не считаю, потому что с таймером отката он не понадобится.

Что понадобится

Управляемый коммутатор с поддержкой 802.1Q и доступ к его настройкам. Без него VLAN на Proxmox работают только внутри одного хоста. Неуправляемый свитч тегированные кадры либо пропустит как есть, либо выкинет, и угадать заранее нельзя.

Доступ к консоли хоста помимо сети: монитор с клавиатурой, IPMI, iDRAC или iLO. Root на хосте. План VLAN на бумаге или в табличке: какой номер, какая подсеть, кто шлюз.

Компонент Версия на момент публикации Минимум Комментарий
Proxmox VE 9.2, база Debian 13 7.x Команды одинаковы для 7.x, 8.x и 9.x
ifupdown2 Ставится с Proxmox по умолчанию Proxmox VE 7 Нужен для ifreload -a без перезагрузки
SDN Входит в Proxmox VE 8.1 Только для варианта с VLAN-зоной
Коммутатор MikroTik RouterOS 7.x, Cisco IOS Любой с 802.1Q Порт в режиме trunk
Сетевая карта Intel, Mellanox, Broadcom, Realtek Поддержка 802.1Q У части карт лимит аппаратных VLAN-фильтров
iproute2, tcpdump Из репозитория Debian — tcpdump ставится отдельно

На момент публикации актуальна версия Proxmox VE 9.2. Перед установкой проверь свежие релизы. Синтаксис сетевого конфига стабилен с седьмой версии, но SDN активно развивается, и пункты меню в веб-интерфейсе могут называться иначе.

Что будет в статье

  • Причины, по которым VLAN в Proxmox не работает после настройки.
  • Настройка порта коммутатора на MikroTik и Cisco.
  • VLAN-aware мост, теги для ВМ и LXC, trunk в ВМ-роутер.
  • Перенос управления хостом в тегированный VLAN с таймером отката.
  • SDN VLAN-зона для кластера и bond с LACP.
  • Проверка, одиннадцать типовых ошибок и альтернативные схемы.
  • Мониторинг, безопасность, бэкап, обновление и FAQ.

Почему VLAN в Proxmox не работает после настройки

Смотри по списку. У меня по факту восемь причин из десяти сидят в первых трёх строках таблицы.

Причина Почему ломает Симптом
Порт коммутатора в режиме access Коммутатор выбрасывает кадры с тегом или не пропускает нужный VLAN ВМ без адреса, на хосте tcpdump видит запросы без ответов
VLAN не разрешён на trunk В списке allowed vlan нет нужного номера Один VLAN работает, второй нет
Номер VLAN не входит в bridge-vids Мост не добавляет этот VLAN на физический порт Кадр не выходит за пределы хоста
Не совпадает нетегированный VLAN На хосте PVID 1, на коммутаторе native VLAN 10, или наоборот Управление хостом пропадает после ifreload
Двойной тег Тег стоит в Proxmox и ещё раз на сабинтерфейсе внутри ВМ Кадр уходит с двумя тегами, коммутатор его не понимает
Лимит VLAN-фильтров сетевой карты Карта не может принять фильтры на 4093 VLAN из диапазона 2-4094 Ошибка при ifreload, часть VLAN не работает
Разные мосты на узлах кластера На одном узле vmbr0 VLAN aware, на другом нет После миграции ВМ теряет сеть
Несовпадение MTU Jumbo frames включены на коммутаторе, но не на мосту или наоборот Пинг идёт, большие пакеты и iSCSI висят

Как это устроено: путь кадра через VLAN-aware мост

Мост в режиме VLAN aware работает как маленький управляемый коммутатор внутри хоста. У каждого порта моста есть список VLAN и PVID, то есть VLAN для нетегированных кадров. Порт ВМ с тегом 20 — это access-порт VLAN 20. Физический eno1 — это trunk наружу.

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    SW["Коммутатор, порт trunk"] --> NIC["eno1 физический порт"]
    NIC --> BR["vmbr0 VLAN aware"]
    BR --> MGMT["vmbr0.10 управление хостом"]
    BR --> VM1["ВМ web, тег 20"]
    BR --> VM2["ВМ db, тег 30"]
    BR --> CT["LXC, тег 40"]
    BR --> RT["ВМ роутер, trunk 20 и 30"]
    style SW fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style NIC fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style BR fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style MGMT fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style RT fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d

Вот путь одного кадра от ВМ с тегом 20 до шлюза. Сама ВМ ничего не знает про VLAN, она шлёт обычный нетегированный кадр. Тег добавляет мост.

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#f8fafc',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'noteBkgColor': '#fefce8',
    'noteTextColor': '#713f12',
    'noteBorderColor': '#fbbf24',
    'actorBkg': '#f8fafc',
    'actorBorder': '#94a3b8',
    'actorTextColor': '#1e293b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'sequence': {
    'mirrorActors': false,
    'messageAlign': 'center',
    'actorMargin': 120,
    'width': 160,
    'noteMargin': 12
  }
}}%%
sequenceDiagram
    participant V as ВМ web
    participant B as Мост vmbr0
    participant S as Коммутатор
    participant G as Шлюз VLAN 20
    V->>B: Кадр без тега
    Note over B: PVID порта ВМ равен 20
    B->>S: Кадр с тегом 20 через eno1
    S->>G: Кадр в VLAN 20
    G->>S: Ответ в VLAN 20
    S->>B: Ответ с тегом 20
    Note over B: Тег снят на порту ВМ
    B->>V: Кадр без тега

План VLAN для примеров

Все команды в статье используют этот план. Подставь свои номера и подсети, но держи VLAN управления отдельно от всего остального.

VLAN Назначение Подсеть Шлюз
10 Управление: Proxmox, IPMI, коммутаторы 192.168.10.0/24 192.168.10.1
20 Серверы приложений 192.168.20.0/24 192.168.20.1
30 Базы данных 192.168.30.0/24 192.168.30.1
40 DMZ, сервисы наружу 192.168.40.0/24 192.168.40.1
999 Пустой native VLAN — —

И таблица портов, чтобы понимать, где что должно быть доступно. Правило простое: всё управление только из VLAN 10.

Порт Протокол Назначение VLAN Доступен снаружи?
8006 TCP Веб-интерфейс Proxmox 10 Нет
22 TCP SSH хоста 10 Нет
3128 TCP SPICE proxy 10 Нет
5405-5412 UDP Corosync, кластер 10 или отдельный VLAN кластера Нет
60000-60050 TCP Живая миграция 10 или отдельный VLAN Нет
80, 443 TCP Сервисы в DMZ 40 Да, через роутер

Рецепт: настройка VLAN на Proxmox пошагово

Подготовка: проверь хост и сетевую карту

Зачем: узнать имена портов, убедиться, что стоит ifupdown2, и понять, умеет ли карта аппаратную фильтрацию VLAN. Имена eno1 и vmbr0 в статье условные.


# Где выполнять: хост Proxmox, shell под root
pveversion
dpkg -l ifupdown2 | grep ^ii
ip -br link
ethtool -i eno1 | grep -E 'driver|version'
ethtool -k eno1 | grep -i vlan
cat /etc/network/interfaces

Что должно получиться: pveversion показывает 7.x или новее, ifupdown2 установлен. В ethtool -k ищи rx-vlan-filter: on. Это значит, что карта фильтрует VLAN аппаратно, и у неё может быть лимит на число фильтров. Запомни драйвер, он пригодится в разделе осложнений.

Если ifupdown2 нет, а такое бывает на хостах, обновлённых с шестой версии, поставь его. На работающий хост ставь только из локальной консоли: при установке пакет перезапускает сеть.


# Где выполнять: хост Proxmox, только из локальной консоли
apt update && apt install -y ifupdown2 tcpdump

Шаг 1. Сохрани конфиги и поставь таймер отката

Зачем: дальше ты правишь сеть хоста, через которую к нему подключён. Таймер через systemd вернёт старый конфиг через пять минут, если ты не отменишь его вручную. Это приём из продакшна: удалённую сеть без отката не трогают.


# Где выполнять: хост Proxmox
cp /etc/network/interfaces /root/interfaces.bak
systemd-run --on-active=300 --unit=net-rollback \
  /bin/sh -c 'cp /root/interfaces.bak /etc/network/interfaces; ifreload -a'
systemctl list-timers net-rollback.timer

Результат: в списке таймеров есть net-rollback.timer с обратным отсчётом. Если таймер сработал, а тебе нужно ещё время, поставь его заново той же командой. Перезаписывать /root/interfaces.bak нельзя, это твоя точка возврата.

Шаг 2. Настрой порт коммутатора в trunk

Зачем: Proxmox будет отправлять кадры с тегами 20, 30 и 40, а управление пока остаётся нетегированным. Значит, порт коммутатора должен принимать теги и при этом держать VLAN 10 как native. Так переход проходит без обрыва связи.

Вариант для MikroTik RouterOS 7, где сервер подключён в ether5 моста bridge1. Если на bridge1 ещё не включён vlan-filtering, включай его последней командой и только в Safe Mode. В терминале это сочетание Ctrl+X, при обрыве сессии RouterOS откатит изменения сам.


# Где выполнять: коммутатор MikroTik, терминал RouterOS 7, Safe Mode включён
/interface bridge port set [find interface=ether5] pvid=10 frame-types=admit-all ingress-filtering=yes
/interface bridge vlan add bridge=bridge1 vlan-ids=20,30,40 tagged=bridge1,ether5
/interface bridge vlan print where vlan-ids=10
/interface bridge vlan set [find vlan-ids=10] untagged=ether5
/interface bridge set bridge1 vlan-filtering=yes

Если записи для VLAN 10 ещё нет, создай её командой add с параметрами vlan-ids=10, tagged=bridge1 и untagged=ether5. Подробно таблица VLAN моста описана в документации MikroTik по Bridge VLAN Table.

Вариант для Cisco IOS, порт GigabitEthernet1/0/5. На старых коммутаторах перед режимом trunk понадобится строка switchport trunk encapsulation dot1q.


# Где выполнять: коммутатор Cisco, режим configure terminal
interface GigabitEthernet1/0/5
 description proxmox-pve1
 switchport mode trunk
 switchport trunk native vlan 10
 switchport trunk allowed vlan 10,20,30,40
 spanning-tree portfast trunk
end
write memory

Результат: доступ к Proxmox не пропал, ведь управление по-прежнему нетегированное и попадает в VLAN 10. На Cisco проверь show interfaces trunk, на MikroTik /interface bridge vlan print. Нужный порт должен стоять в списках VLAN 20, 30 и 40 как tagged.

Шаг 3. Включи VLAN aware на мосту vmbr0

Зачем: без этого флага мост ничего не знает о тегах и пропускает кадры как есть. С флагом он фильтрует VLAN по портам и сам ставит и снимает теги.

Открой /etc/network/interfaces и приведи блок vmbr0 к такому виду. Адрес и шлюз оставь свои. Список VLAN в bridge-vids пиши явно, а не диапазоном 2-4094: так безопаснее и не упираешься в лимиты сетевой карты.


auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.10.5/24
        gateway 192.168.10.1
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 10 20 30 40
#Trunk, управление пока нетегированное

source /etc/network/interfaces.d/*

Вот тут важно. Адрес хоста остаётся прямо на vmbr0. Нетегированные кадры моста попадают в его PVID, по умолчанию это VLAN 1. Коммутатор отдаёт управление тоже без тега. Внутри хоста номер нетегированного VLAN значения не имеет, пока туда не подключено ничего, кроме самого хоста.


# Где выполнять: хост Proxmox
ifreload -a
cat /sys/class/net/vmbr0/bridge/vlan_filtering
bridge vlan show dev eno1
ping -c 3 192.168.10.1
systemctl stop net-rollback.timer

Результат: vlan_filtering равен 1. Для eno1 в списке есть VLAN 1 с флагами PVID и Egress Untagged, плюс 10, 20, 30 и 40. Пинг до шлюза идёт. Только после этого останавливай таймер.

Через веб-интерфейс то же самое: узел, System, Network, vmbr0, Edit, галка VLAN aware, Apply Configuration. Поле VLAN IDs там появляется в расширенных настройках. Разница в том, что из файла проще перенести конфиг на второй узел.

Шаг 4. Назначь VLAN виртуальным машинам

Зачем: тег на адаптере ВМ превращает её порт в access-порт нужного VLAN. Внутри гостевой системы ничего настраивать не надо: она видит обычную сеть без тегов.

Смотри, при смене параметров адаптера через qm set важно сохранить MAC-адрес. Иначе внутри ВМ поменяется имя интерфейса или привязка в DHCP. MAC возьми из текущего конфига.


# Где выполнять: хост Proxmox, номер ВМ и MAC подставь свои
qm config 101 | grep ^net
qm set 101 --net0 virtio=BC:24:11:AA:AA:01,bridge=vmbr0,tag=20
qm set 102 --net0 virtio=BC:24:11:AA:AA:02,bridge=vmbr0,tag=30
qm config 101 | grep ^net

Результат: в конфиге ВМ появился параметр tag=20. Изменение тега применяется на работающей ВМ без перезагрузки. Внутри ВМ обнови адрес: перезапусти DHCP-клиент или поменяй статический IP на подсеть нового VLAN.

В веб-интерфейсе: ВМ, Hardware, Network Device, Edit, поле VLAN Tag. Пустое поле означает отсутствие тега, и вот тут не перепутай: такая ВМ на VLAN-aware мосту получает не только нетегированный трафик. Об этом в шаге 6.

Шаг 5. Назначь VLAN LXC-контейнерам

Зачем: контейнеры подключаются к тому же мосту, тег задаётся так же. Есть подвох: pct set заменяет строку net0 целиком. Если не повторить ip и gw, контейнер останется без адреса.


# Где выполнять: хост Proxmox, номер контейнера подставь свой
pct config 201 | grep ^net
pct set 201 --net0 name=eth0,bridge=vmbr0,tag=40,hwaddr=BC:24:11:CC:CC:01,ip=192.168.40.10/24,gw=192.168.40.1
pct config 201 | grep ^net
pct exec 201 -- ping -c 3 192.168.40.1

Результат: в конфиге контейнера стоит tag=40, пинг до шлюза VLAN 40 идёт. Если контейнер получает адрес по DHCP, вместо ip и gw укажи ip=dhcp.

Шаг 6. Отдай trunk в виртуальный роутер

Зачем: роутеру или firewall в ВМ нужны несколько VLAN на одном адаптере. Тег здесь не ставится, вместо него параметр trunks ограничивает список VLAN.

ВМ без тега видит все VLAN моста
Адаптер без тега и без списка trunks на VLAN-aware мосту получает весь список из bridge-vids тегированным. Если внутри такой ВМ кто-то поднимет сабинтерфейс VLAN 10, он окажется в сети управления. Поэтому у каждой ВМ должен быть либо тег, либо явный список trunks.

# Где выполнять: хост Proxmox, точка с запятой внутри кавычек обязательна
qm set 100 --net1 "virtio=BC:24:11:BB:BB:01,bridge=vmbr0,trunks=20;30;40"
qm config 100 | grep ^net1

Кавычки тут не для красоты. Без них bash воспримет точку с запятой как конец команды и попытается выполнить 30 как отдельную программу. Результат: в конфиге видно trunks=20;30;40.

Внутри гостевой системы настрой сабинтерфейсы. Пример для Debian или Ubuntu с ifupdown, где trunk приходит на ens19. На OpenWrt то же самое делается через устройства 802.1q в LuCI или uci.


# Где выполнять: гостевая ВМ-роутер на Debian, файл /etc/network/interfaces
auto ens19.20
iface ens19.20 inet static
        address 192.168.20.1/24

auto ens19.30
iface ens19.30 inet static
        address 192.168.30.1/24

auto ens19.40
iface ens19.40 inet static
        address 192.168.40.1/24

# Где выполнять: хост Proxmox, проверка списка VLAN на порту ВМ
bridge vlan show | grep -A4 tap100i1

Результат: у порта tap100i1 видны VLAN 20, 30 и 40 без флага Egress Untagged. Это trunk. Номер tap складывается из номера ВМ и номера адаптера.

Шаг 7. Перенеси управление хостом в тегированный VLAN

Зачем: нетегированный VLAN на trunk-порту — классическая дыра для атаки VLAN hopping и источник путаницы. Правильная схема: всё ходит с тегами, native VLAN на порту пустой и неиспользуемый. Шаг необязательный, но для продакшна я его делаю всегда.

Критично: связь пропадёт, если сделать шаги не синхронно
После этого шага хост шлёт управление с тегом 10, а коммутатор должен перестать отдавать VLAN 10 без тега. Между изменением на хосте и на коммутаторе связи нет. Работай из локальной консоли хоста или IPMI, таймер отката ставь обязательно, а коммутатор меняй в Safe Mode.

# Где выполнять: хост Proxmox, из локальной консоли или IPMI
cp /etc/network/interfaces /root/interfaces.bak
systemd-run --on-active=300 --unit=net-rollback \
  /bin/sh -c 'cp /root/interfaces.bak /etc/network/interfaces; ifreload -a'

Новый конфиг. Адрес уезжает с vmbr0 на интерфейс vmbr0.10. Сам мост остаётся без адреса и работает как чистый trunk.


auto lo
iface lo inet loopback

iface eno1 inet manual

auto vmbr0
iface vmbr0 inet manual
        bridge-ports eno1
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 10 20 30 40

auto vmbr0.10
iface vmbr0.10 inet static
        address 192.168.10.5/24
        gateway 192.168.10.1
#Управление хостом, VLAN 10 с тегом

source /etc/network/interfaces.d/*

# Где выполнять: хост Proxmox
ifreload -a
ip -br addr show vmbr0.10

Сразу после этого меняй коммутатор. На MikroTik VLAN 10 становится тегированным, а PVID уезжает в пустой VLAN 999. На Cisco native VLAN переводится на 999.


# Где выполнять: коммутатор MikroTik, Safe Mode включён
/interface bridge vlan set [find vlan-ids=10] tagged=bridge1,ether5 untagged=""
/interface bridge port set [find interface=ether5] pvid=999 frame-types=admit-only-vlan-tagged

# Где выполнять: коммутатор Cisco, configure terminal
vlan 999
 name native-unused
interface GigabitEthernet1/0/5
 switchport trunk native vlan 999
end
write memory

# Где выполнять: хост Proxmox
ping -c 3 192.168.10.1
tcpdump -e -ni eno1 -c 10 vlan 10
systemctl stop net-rollback.timer

Результат: пинг идёт, tcpdump показывает кадры с vlan 10 в заголовке. Таймер остановлен. Открой веб-интерфейс Proxmox с машины в VLAN 10 и убедись, что он работает. Адрес хоста не менялся, поэтому /etc/hosts трогать не нужно.

Шаг 8. SDN VLAN-зона для кластера

Зачем: в кластере из нескольких узлов писать номера VLAN в каждую ВМ неудобно и рискованно. SDN создаёт именованные сети, например srv20, одинаковые на всех узлах. ВМ подключается к сети по имени, а номер VLAN хранится в одном месте. Подробно механизм описан в официальной документации Proxmox по SDN.

Условия: на всех узлах есть мост vmbr0 с одинаковым именем, и в /etc/network/interfaces есть строка source /etc/network/interfaces.d/*. SDN пишет свой конфиг именно туда. Имена зон и сетей ограничены восемью символами.


# Где выполнять: любой узел кластера Proxmox, конфиг общий для всех
grep 'interfaces.d' /etc/network/interfaces
pvesh create /cluster/sdn/zones --zone vlanzone --type vlan --bridge vmbr0
pvesh create /cluster/sdn/vnets --vnet srv20 --zone vlanzone --tag 20 --alias "Серверы приложений"
pvesh create /cluster/sdn/vnets --vnet db30 --zone vlanzone --tag 30 --alias "Базы данных"
pvesh set /cluster/sdn

Последняя команда применяет конфиг на всех узлах. Без неё сети существуют только в файлах /etc/pve/sdn и в интерфейсе подсвечены как ожидающие применения.


# Где выполнять: хост Proxmox, проверка и подключение ВМ
cat /etc/network/interfaces.d/sdn
ip -br link show srv20
qm set 101 --net0 virtio=BC:24:11:AA:AA:01,bridge=srv20

Результат: в файле sdn описан мост srv20, интерфейс существует, ВМ подключена к нему без параметра tag. Номер VLAN теперь меняется в одном месте для всех ВМ сети. Права на сеть srv20 можно выдать отдельному пользователю, это удобно для команд разработки.

Шаг 9. Bond из двух портов с LACP

Зачем: на сервере два порта, и хочется отказоустойчивости. Bond объединяет их, а VLAN-aware мост работает поверх bond так же, как поверх одного порта. Режим 802.3ad требует настройки LACP на коммутаторе.


auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

auto bond0
iface bond0 inet manual
        bond-slaves eno1 eno2
        bond-miimon 100
        bond-mode 802.3ad
        bond-xmit-hash-policy layer3+4

auto vmbr0
iface vmbr0 inet manual
        bridge-ports bond0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 10 20 30 40

auto vmbr0.10
iface vmbr0.10 inet static
        address 192.168.10.5/24
        gateway 192.168.10.1

source /etc/network/interfaces.d/*

# Где выполнять: коммутатор MikroTik, ether5 и ether6 в сторону сервера
/interface bonding add name=bond-pve1 slaves=ether5,ether6 mode=802.3ad transmit-hash-policy=layer-3-and-4
/interface bridge port add bridge=bridge1 interface=bond-pve1 pvid=999 frame-types=admit-only-vlan-tagged
/interface bridge vlan set [find vlan-ids=10] tagged=bridge1,bond-pve1
/interface bridge vlan set [find vlan-ids=20,30,40] tagged=bridge1,bond-pve1

Перед созданием bond на MikroTik убери ether5 и ether6 из портов моста, иначе RouterOS откажется добавлять их в bonding. На Proxmox применяй этот конфиг тоже с таймером отката.


# Где выполнять: хост Proxmox
ifreload -a
grep -E 'Bonding Mode|MII Status|Aggregator ID|Partner Mac' /proc/net/bonding/bond0

Результат: режим IEEE 802.3ad, у обоих портов MII Status up и одинаковый Aggregator ID, Partner Mac не нулевой. Нулевой MAC партнёра значит, что коммутатор не отвечает по LACP.

Как проверить, что VLAN на Proxmox работает правильно

Проверяем снизу вверх: мост, физический порт, кадры на проводе, гостевая система. Если звено зелёное, переходи к следующему.


# Где выполнять: хост Proxmox
cat /sys/class/net/vmbr0/bridge/vlan_filtering
bridge vlan show
bridge -d vlan show dev eno1
ip -d link show vmbr0 | grep -o 'vlan_filtering [0-9]'
journalctl -b -u networking --no-pager | tail -20

# Где выполнять: хост Proxmox, смотрим теги на проводе
tcpdump -e -ni eno1 -c 20 vlan
tcpdump -e -ni eno1 vlan 20 and icmp

Во втором окне запусти пинг изнутри ВМ с тегом 20 до её шлюза. В выводе tcpdump должны быть строки с vlan 20 в обе стороны. Если видишь только исходящие запросы — проблема на коммутаторе или шлюзе. Если не видишь ничего — проблема на мосту.


# Где выполнять: гостевая ВМ с тегом 20, Linux
ip -br addr
ip route | grep default
ping -c 3 192.168.20.1
ping -c 3 ya.ru
Проверка Ожидаемый результат Если не так
vlan_filtering 1 Нет строки bridge-vlan-aware yes или не выполнен ifreload
bridge vlan show dev eno1 Все VLAN из bridge-vids Лимит карты или опечатка в списке
bridge vlan show, порт tap ВМ Один VLAN с флагами PVID и Egress Untagged Тег не задан или ВМ не перезапускала адаптер
tcpdump vlan 20 Запросы и ответы с тегом 20 Только запросы: смотри коммутатор
Пинг шлюза из ВМ Ответы без потерь Адрес ВМ не в подсети VLAN
/proc/net/bonding/bond0 Оба порта up, общий Aggregator ID LACP не настроен на коммутаторе

И один тест, который делают редко. Создай временную ВМ без тега и проверь, видит ли она что-нибудь в сети. Если видит VLAN 10 — на порту коммутатора остался нетегированный VLAN управления. Это не авария, но это дыра.

Осложнения: типовые ошибки VLAN в Proxmox

Всё не так плохо, как ты думаешь. Всё намного хуже: в этих ошибках участвует ещё и коммутатор, который настраивал не ты.

Иди по дереву сверху вниз. Не прыгай сразу в настройки коммутатора, пока не проверил мост.

%%{init: {
  'theme': 'base',
  'themeVariables': {
    'primaryColor': '#ffffff',
    'primaryTextColor': '#1e293b',
    'primaryBorderColor': '#94a3b8',
    'lineColor': '#64748b',
    'fontSize': '15px',
    'fontFamily': 'ui-sans-serif, system-ui, sans-serif'
  },
  'flowchart': {'curve': 'linear', 'nodeSpacing': 50, 'rankSpacing': 50}
}}%%
flowchart TD
    A["ВМ с тегом без сети"] --> B{"vlan_filtering равен 1?"}
    B -->|Нет| C["Включить VLAN aware"]
    B -->|Да| D{"VLAN есть на eno1?"}
    D -->|Нет| E["Добавить в bridge-vids"]
    D -->|Да| F{"tcpdump видит тег?"}
    F -->|Нет| G["Проверить тег у ВМ"]
    F -->|Да| H{"Есть ответы?"}
    H -->|Нет| I["Порт коммутатора не trunk"]
    H -->|Да| J["Проверить адрес в ВМ"]
    style A fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style C fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#b91c1c
    style E fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#b91c1c
    style G fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#b91c1c
    style I fill:#f8fafc,stroke:#ef4444,stroke-width:2px,color:#b91c1c
    style J fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d

Ошибка 1. ВМ с тегом не получает адрес, tcpdump видит только запросы

Причина: порт коммутатора в режиме access или нужного VLAN нет в списке разрешённых на trunk. Кадры с тегом уходят с хоста и пропадают на коммутаторе.

Решение: проверь trunk на коммутаторе и добавь VLAN. На хосте подтверди, что запросы уходят именно с правильным тегом.


# Где выполнять: хост Proxmox
tcpdump -e -ni eno1 -c 10 vlan 20 and port 67

# Где выполнять: коммутатор Cisco
show interfaces GigabitEthernet1/0/5 trunk
configure terminal
interface GigabitEthernet1/0/5
 switchport trunk allowed vlan add 20
end

Ошибка 2. ifreload ругается на VLAN, часть VLAN не работает

Причина: сетевая карта с аппаратной фильтрацией VLAN имеет лимит фильтров, а в bridge-vids стоит диапазон 2-4094 по умолчанию. Карта принимает часть фильтров и молча отбрасывает остальные, либо ifreload падает с ошибкой вроде No space left on device.

Решение: перечисли только реально используемые VLAN. Если их много, отключи аппаратную фильтрацию на порту, но учти, что это немного нагрузит CPU.


# Где выполнять: хост Proxmox
journalctl -b -u networking --no-pager | grep -iE 'vlan|error'
ethtool -k eno1 | grep rx-vlan-filter
sed -i 's/bridge-vids 2-4094/bridge-vids 10 20 30 40/' /etc/network/interfaces
ifreload -a

# Альтернатива: отключить аппаратный фильтр, строка в блоке iface eno1 inet manual
        post-up /usr/sbin/ethtool -K eno1 rx-vlan-filter off

Ошибка 3. После ifreload пропал доступ к хосту

Причина: не совпал нетегированный VLAN. Хост перенёс адрес на vmbr0.10 и шлёт кадры с тегом, а коммутатор ждёт их без тега. Или наоборот, коммутатор уже ждёт тег, а хост ещё нет.

Сначала верни связь
Если таймер отката стоял, подожди пять минут, конфиг вернётся сам. Если не стоял, иди в локальную консоль или IPMI, верни сохранённый файл и перечитай сеть. Разбирайся в причине только после того, как связь восстановлена.

# Где выполнять: хост Proxmox, локальная консоль
cp /root/interfaces.bak /etc/network/interfaces
ifreload -a
systemctl restart pveproxy

После восстановления сравни схему: адрес на vmbr0 означает управление без тега, адрес на vmbr0.10 означает управление с тегом. Коммутатор должен ждать ровно то же самое.

Ошибка 4. Двойной тег: ВМ с сабинтерфейсом не работает

Причина: в Proxmox у адаптера стоит tag=20, а внутри ВМ ещё поднят ens18.20. Кадр уходит с двумя тегами 802.1Q, коммутатор видит внешний тег 20 и внутренний мусор.

Решение: тег ставится в одном месте. Либо tag в Proxmox и обычный интерфейс в ВМ, либо trunks в Proxmox и сабинтерфейсы в ВМ.


# Где выполнять: хост Proxmox, ловим двойные теги
tcpdump -e -ni eno1 -c 10 'vlan and vlan'

Ошибка 5. LXC-контейнер потерял адрес после смены VLAN

Причина: pct set заменяет строку net0 целиком. Если в команде не было ip, gw и hwaddr, они удалены.

Решение: всегда передавай полную строку адаптера. Проще всего взять текущую из pct config и поменять в ней только тег.


# Где выполнять: хост Proxmox
CUR=$(pct config 201 | awk -F': ' '/^net0/{print $2}')
echo "$CUR"
NEW=$(echo "$CUR" | sed 's/tag=[0-9]*/tag=40/')
pct set 201 --net0 "$NEW"
pct config 201 | grep ^net0

Ошибка 6. bash: 30: command not found при настройке trunks

Причина: список trunks содержит точку с запятой, и без кавычек shell делит строку на несколько команд. Proxmox получает trunks=20, остальное улетает в никуда.


# Где выполнять: хост Proxmox
qm set 100 --net1 "virtio=BC:24:11:BB:BB:01,bridge=vmbr0,trunks=20;30;40"

Ошибка 7. После миграции ВМ на другой узел пропала сеть

Причина: на втором узле мост называется иначе, не включён VLAN aware или в bridge-vids нет нужного VLAN. Либо порт коммутатора второго узла настроен не так, как у первого.

Решение: сравни сетевые конфиги узлов. Для кластера переходи на SDN из шага 8: он раскатывает одинаковые сети на все узлы.


# Где выполнять: любой узел кластера, имена узлов подставь свои
for n in pve1 pve2 pve3; do echo "== $n"; ssh root@$n "grep -E 'vlan-aware|vids' /etc/network/interfaces"; done

Ошибка 8. Пинг идёт, а iSCSI и большие файлы висят

Причина: MTU не совпадает на одном из звеньев. Jumbo frames нужно включить везде: на физическом порту, мосту, VLAN-интерфейсе, в ВМ и на коммутаторе.


# Фрагмент /etc/network/interfaces на хосте Proxmox
iface eno1 inet manual
        mtu 9000

auto vmbr0
iface vmbr0 inet manual
        mtu 9000
        bridge-ports eno1
        bridge-vlan-aware yes
        bridge-vids 10 20 30 40

# Где выполнять: хост Proxmox, тест без фрагментации до хранилища
ping -M do -s 8972 -c 3 192.168.40.20

Для адаптера ВМ MTU задаётся параметром mtu=9000 в строке net. Значение mtu=1 означает, что ВМ возьмёт MTU моста.

Ошибка 9. SDN-сеть создана, но в списке мостов её нет

Причина: конфиг не применён командой pvesh set /cluster/sdn, или в /etc/network/interfaces нет строки source /etc/network/interfaces.d/*.


# Где выполнять: хост Proxmox
grep -q 'source /etc/network/interfaces.d/\*' /etc/network/interfaces || echo 'source /etc/network/interfaces.d/*' >> /etc/network/interfaces
pvesh set /cluster/sdn
ls -l /etc/network/interfaces.d/

Ошибка 10. Bond в режиме 802.3ad работает на одном порту

Причина: на коммутаторе порты не объединены в LACP, или объединены в статический bond без LACP. Партнёр не отвечает, Linux использует один порт.


# Где выполнять: хост Proxmox
grep -E 'Slave Interface|Aggregator ID|Partner Mac' /proc/net/bonding/bond0

Если у портов разные Aggregator ID или Partner Mac нулевой — настраивай LACP на коммутаторе. Если коммутатор LACP не умеет, используй bond-mode active-backup: без балансировки, но с резервом.

Ошибка 11. ВМ без тега попала в сеть управления

Причина: на trunk-порту коммутатора VLAN 10 нетегированный, а у ВМ пустое поле VLAN Tag. Её нетегированный трафик идёт в PVID моста и дальше в native VLAN коммутатора, то есть в управление.


# Где выполнять: хост Proxmox, ищем ВМ без тега и без trunks
for f in /etc/pve/nodes/*/qemu-server/*.conf; do grep -H '^net' "$f" | grep -vE 'tag=|trunks='; done

Решение: проставь тег каждой ВМ из списка и переведи управление в тегированный VLAN по шагу 7.

Ошибка Причина Решение
ВМ без адреса, только запросы Порт коммутатора не trunk Trunk, VLAN в allowed list
Ошибка ifreload, часть VLAN мертва Лимит фильтров карты Явный список bridge-vids
Пропал доступ к хосту Не совпал нетегированный VLAN Откат и синхронная настройка
Ничего не работает в ВМ с сабинтерфейсом Двойной тег Тег только в одном месте
LXC без адреса после смены VLAN pct set заменил строку net0 Полная строка адаптера
command not found при trunks Точка с запятой без кавычек Строка в кавычках
Нет сети после миграции Разные мосты на узлах SDN VLAN-зона
Висят большие пакеты MTU на одном звене MTU везде одинаковый
SDN-сети нет Не применён конфиг или нет source pvesh set /cluster/sdn
LACP на одном порту Коммутатор без LACP LACP или active-backup
ВМ в сети управления Нет тега, native VLAN 10 Теги всем, управление с тегом

Альтернативы: классические мосты, Open vSwitch, SDN

VLAN-aware мост — не единственный способ сделать VLAN в Proxmox. Вот остальные и когда они уместнее.

Классическая схема: мост на каждый VLAN

Так делали до появления VLAN-aware мостов, и так до сих пор устроено много старых хостов. На каждый VLAN создаётся сабинтерфейс eno1.20 и отдельный мост vmbr20. ВМ подключается к мосту без тега.


auto eno1.20
iface eno1.20 inet manual

auto vmbr20
iface vmbr20 inet manual
        bridge-ports eno1.20
        bridge-stp off
        bridge-fd 0
#VLAN 20 серверы

auto eno1.30
iface eno1.30 inet manual

auto vmbr30
iface vmbr30 inet manual
        bridge-ports eno1.30
        bridge-stp off
        bridge-fd 0
#VLAN 30 базы данных

Плюс: наглядно, ВМ физически не может попасть в чужой VLAN. Минус: на 20 VLAN получится 40 интерфейсов, а trunk в ВМ так не отдать. Смешивать эту схему с VLAN-aware мостом на одном порту нельзя.

Open vSwitch

OVS умеет всё то же плюс зеркалирование портов, OpenFlow и более тонкую статистику. Ставится пакетом openvswitch-switch. Нужен, если у тебя уже есть экосистема на OVS или требуется SPAN-порт для IDS.


# Где выполнять: хост Proxmox, из локальной консоли
apt install -y openvswitch-switch

auto eno1
iface eno1 inet manual
        ovs_type OVSPort
        ovs_bridge vmbr0

auto vmbr0
iface vmbr0 inet manual
        ovs_type OVSBridge
        ovs_ports eno1 mgmt10

auto mgmt10
iface mgmt10 inet static
        address 192.168.10.5/24
        gateway 192.168.10.1
        ovs_type OVSIntPort
        ovs_bridge vmbr0
        ovs_options tag=10

Для ВМ тег задаётся так же, параметром tag. Диагностика идёт через ovs-vsctl show, а не через bridge vlan show. Это вторая утилита, которую надо помнить в три часа ночи. Подробнее на сайте Open vSwitch.

SDN VLAN-зона и QinQ

SDN не заменяет VLAN-aware мост, а надстраивается над ним. Для одиночного хоста это лишний слой. Для кластера от двух узлов это правильный выбор: имена сетей вместо номеров, права доступа на сети, одинаковая конфигурация везде. Зона типа QinQ пригодится провайдерам и тем, кому нужно больше 4094 сетей, она добавляет второй тег.

Отдельная сетевая карта на каждую сеть

Самый простой и самый дорогой вариант. Хранилище на одной карте, управление на второй, ВМ на третьей. Оправдан для хранилища и Corosync: им важна задержка, а не удобство. Остальное разумнее разнести VLAN.

Вариант Сложность Trunk в ВМ Масштаб Когда выбирать
VLAN-aware Linux bridge Низкая Да, trunks Один хост, малый кластер По умолчанию для большинства задач
Мост на каждый VLAN Средняя Нет Несколько VLAN Старые хосты, строгая изоляция без тегов в ВМ
Open vSwitch Средняя Да Любой Нужны SPAN, OpenFlow или уже есть OVS
SDN VLAN-зона Низкая поверх моста Через VNet без тега Кластер Несколько узлов, права на сети
SDN QinQ Средняя Да Большой Мультитенантность, больше 4094 сетей
Карта на каждую сеть Низкая Нет Ограничен портами Хранилище и Corosync

Почему в рецепте VLAN-aware мост. Это стандартный механизм ядра Linux без дополнительных пакетов, его понимает веб-интерфейс Proxmox, а диагностика делается двумя командами. Если завтра появится кластер, SDN встанет сверху без переделки.

Профилактика: мониторинг, безопасность, бэкап сети

Один порт коммутатора, переведённый в access «на пять минут» в 2019 году, живёт до сих пор. Он уронит тебе миграцию ровно в пятницу, в 18:02.

Мониторинг

Сетевые проблемы VLAN тихие: мост работает, линк есть, а нужного VLAN на порту уже нет. Скрипт на хосте раз в минуту проверяет фильтрацию, линк, наличие каждого VLAN на физическом порту и шлюз управления. Ошибки уходят в системный журнал.


# Где выполнять: хост Proxmox
cat > /usr/local/bin/vlan-watch.sh </dev/null)" = "1" ] || logger -t vlan-watch "$BR: vlan_filtering выключен"
[ "$(cat /sys/class/net/$UP/carrier 2>/dev/null)" = "1" ] || logger -t vlan-watch "$UP: нет линка"
J=$(bridge -j vlan show dev "$UP")
for v in $VIDS; do
  echo "$J" | grep -q "\"vlan\":$v[,}]" || logger -t vlan-watch "$UP: нет VLAN $v"
done
ping -c 2 -W 2 "$GW" >/dev/null 2>&1 || logger -t vlan-watch "Шлюз управления $GW недоступен"
EOF
chmod +x /usr/local/bin/vlan-watch.sh
echo '* * * * * root /usr/local/bin/vlan-watch.sh' > /etc/cron.d/vlan-watch
/usr/local/bin/vlan-watch.sh; journalctl -t vlan-watch --since "5 min ago"

Пустой вывод журнала после ручного запуска означает, что всё в порядке. Если у тебя на uplink стоит bond, укажи в переменной UP имя bond0. Если используешь Zabbix, повесь на хост шаблон Linux by Zabbix agent и добавь item на журнал с тегом vlan-watch. Плюс ICMP-проверки шлюзов каждого VLAN с машины мониторинга, которая видит их через роутер.

На коммутаторе включи SNMP или отправку syslog: смена режима порта и падение LACP должны попадать туда же, куда смотрит дежурный.

Безопасность

Firewall. UFW на хост Proxmox не ставь: у Proxmox свой pve-firewall, и два менеджера правил перетирают друг друга. Включи firewall на уровне датацентра и ограничь управление VLAN 10 через набор management.


# Файл /etc/pve/firewall/cluster.fw на хосте Proxmox
[OPTIONS]
enable: 1
policy_in: DROP
policy_out: ACCEPT

[IPSET management]
192.168.10.0/24
Firewall хоста: не запри себя
Перед включением убедись, что твой компьютер находится в подсети из набора management. Скомпилируй правила и посмотри результат до того, как они начнут действовать. При потере доступа остановить firewall можно из локальной консоли хоста.

# Где выполнять: хост Proxmox
pve-firewall compile | head -40
pve-firewall status

Изоляция VLAN. Межсетевую фильтрацию делай на роутере между VLAN, а не на мостах Proxmox. На хосте важны три правила: native VLAN на trunk-порту пустой, у каждой ВМ тег или явный список trunks, в bridge-vids только используемые VLAN. VLAN, которого нет в bridge-vids, не попадёт ни в одну ВМ даже по ошибке.

fail2ban на веб-интерфейс. На Debian 13 логи в journald, поэтому backend systemd обязателен.


# Где выполнять: хост Proxmox
apt install -y fail2ban python3-systemd
cat > /etc/fail2ban/filter.d/proxmox.conf <<'EOF'
[Definition]
failregex = pvedaemon\[.*authentication failure; rhost= user=.* msg=.*
ignoreregex =
journalmatch = _SYSTEMD_UNIT=pvedaemon.service
EOF
cat > /etc/fail2ban/jail.d/proxmox.local <<'EOF'
[DEFAULT]
backend = systemd
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true

[proxmox]
enabled = true
port = https,http,8006
filter = proxmox
maxretry = 3
findtime = 2d
bantime = 1h
EOF
systemctl enable --now fail2ban
fail2ban-client status proxmox

SSH hardening. Вход root по ключу оставь, он нужен кластеру для миграций. Пароли выключи. Сначала проверь, что твой ключ уже работает.


# Где выполнять: хост Proxmox
cat > /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF'
PermitRootLogin prohibit-password
PasswordAuthentication no
KbdInteractiveAuthentication no
MaxAuthTries 3
EOF
sshd -t && systemctl reload ssh

Отдельный пользователь. Базы данных в этой схеме нет, её роль играют учётки Proxmox. Root@pam оставь для аварий. Себе заведи пользователя с правами на ВМ, мониторингу дай роль только для чтения. Права на конкретную SDN-сеть выдаются отдельно, это удобно для команды, которой нельзя трогать чужие VLAN.


# Где выполнять: хост Proxmox
pveum user add andrey@pve --comment "Ежедневная работа"
pveum passwd andrey@pve
pveum acl modify /vms -user andrey@pve -role PVEVMAdmin
pveum user add monitor@pve --comment "Только чтение для мониторинга"
pveum acl modify / -user monitor@pve -role PVEAuditor
pveum acl modify /sdn/zones/vlanzone/srv20 -user andrey@pve -role PVESDNUser

Ограничения по IP. Порт 8006 и SSH доступны только из VLAN 10, это закрыто набором management. На коммутаторе запрети доступ к его собственному управлению из всех VLAN, кроме 10.

Резервное копирование

Что бэкапить Как часто Где хранить Как восстановить
/etc/network/interfaces и interfaces.d Ежедневно и перед изменениями Хост, затем NAS или PBS Скопировать обратно, ifreload -a
/etc/pve/sdn и /etc/pve/firewall Ежедневно Вне кластера Скопировать обратно, pvesh set /cluster/sdn
Конфиги ВМ и контейнеров Ежедневно Вне кластера Скопировать в /etc/pve/nodes/узел/
Конфиг коммутатора После каждого изменения и раз в неделю Вне коммутатора /import на MikroTik, copy на Cisco

# Где выполнять: хост Proxmox
cat > /usr/local/bin/net-backup.sh </dev/null
bridge -d vlan show > "$DST/bridge-vlan-$(date +%F).txt"
find "$DST" -mtime +30 -delete
EOF
chmod +x /usr/local/bin/net-backup.sh
echo '15 3 * * * root /usr/local/bin/net-backup.sh' > /etc/cron.d/net-backup
/usr/local/bin/net-backup.sh && ls -lh /root/backup/net/

Текстовый снимок bridge vlan show в бэкапе бесценен. Когда через полгода что-то перестанет работать, ты сравнишь текущее состояние с последним рабочим одной командой diff.


# Где выполнять: коммутатор MikroTik, бэкап конфига
/export file=sw-backup-2026-10-22

Восстановление на хосте. Распакуй архив во временный каталог, сравни файлы с текущими и верни только то, что сломалось. Затем перечитай сеть и примени SDN.


# Где выполнять: хост Proxmox, имя архива подставь своё
mkdir -p /root/restore && tar xzf /root/backup/net/net-pve1-ДАТА.tar.gz -C /root/restore
diff /root/restore/etc/network/interfaces /etc/network/interfaces
cp /root/restore/etc/network/interfaces /etc/network/interfaces
ifreload -a
pvesh set /cluster/sdn

Обновление

Обновления Proxmox затрагивают ядро, драйверы сетевых карт и ifupdown2. Именно после них чаще всего ломается то, что работало годами. Перед обновлением сохрани снимок состояния, после обновления сравни.


# Где выполнять: хост Proxmox, до обновления
bridge -d vlan show > /root/vlan-before.txt
ethtool -i eno1 > /root/nic-before.txt
apt update
apt list --upgradable | grep -E 'pve-kernel|proxmox-kernel|ifupdown2|pve-network'
apt full-upgrade

# Где выполнять: хост Proxmox, после перезагрузки
bridge -d vlan show > /root/vlan-after.txt
diff /root/vlan-before.txt /root/vlan-after.txt
/usr/local/bin/vlan-watch.sh; journalctl -t vlan-watch --since "5 min ago"

Только apt full-upgrade, никогда не apt upgrade: Proxmox меняет зависимости, и обычный upgrade оставит систему наполовину обновлённой. В кластере обновляй узлы по одному, предварительно мигрировав с узла ВМ.

Откат, если после нового ядра сломалась сеть: загрузись на предыдущем ядре и закрепи его. Версию возьми из списка, в команде ниже она условная.


# Где выполнять: хост Proxmox
proxmox-boot-tool kernel list
proxmox-boot-tool kernel pin 6.17.2-1-pve
reboot

Когда выйдет исправленное ядро, сними закрепление командой proxmox-boot-tool kernel unpin. Коммутатор обновляй отдельно и не в тот же день: если после двух обновлений что-то сломалось, ты не узнаешь, какое из них виновато.

Автозапуск

Сетевая конфигурация хоста поднимается сама при загрузке через ifupdown2, отдельного автозапуска не нужно. А вот ВМ с VLAN-роутером должна стартовать раньше остальных, иначе гости в VLAN 20 и 30 загрузятся без шлюза и DHCP.


# Где выполнять: хост Proxmox, номера ВМ подставь свои
qm set 100 --onboot 1 --startup order=1,up=30
qm set 101 --onboot 1 --startup order=2
qm set 102 --onboot 1 --startup order=2

FAQ: частые вопросы про VLAN в Proxmox

Почему VLAN на Proxmox не работает после настройки?

Чаще всего порт коммутатора остался в режиме access или нужный VLAN не разрешён на trunk. Вторая по частоте причина - номер VLAN не попал в bridge-vids, и мост не выпускает его на физический порт. Запусти tcpdump с фильтром по VLAN на eno1: если запросы уходят, а ответов нет, ищи проблему на коммутаторе.

Как проверить, что VLAN на Proxmox работает правильно?

Убедись, что в /sys/class/net/vmbr0/bridge/vlan_filtering стоит 1, а bridge vlan show показывает нужные VLAN на физическом порту и правильный PVID на порту ВМ. Затем tcpdump с ключом -e на eno1 должен показать кадры с тегом в обе стороны. Финальная проверка - пинг шлюза своего VLAN изнутри ВМ.

Что делать, если после включения VLAN aware пропал доступ к Proxmox?

Подключись через локальную консоль или IPMI и верни сохранённый /etc/network/interfaces, затем выполни ifreload -a. Обычно причина в том, что нетегированный VLAN на хосте и на коммутаторе не совпали. В следующий раз ставь таймер отката через systemd-run, он вернёт конфиг сам.

Чем VLAN-aware мост отличается от SDN VLAN в Proxmox?

VLAN-aware мост - это механизм ядра на одном хосте, номер VLAN пишется в каждую ВМ. SDN VLAN-зона работает поверх такого моста и создаёт именованные сети, одинаковые на всех узлах кластера. Для одного хоста хватает моста, для кластера удобнее SDN.

Как передать trunk со всеми VLAN в виртуальную машину Proxmox?

Оставь поле VLAN Tag пустым и укажи список VLAN в параметре trunks, например trunks=20;30;40, в командной строке обязательно в кавычках. Без trunks ВМ получит все VLAN из bridge-vids, что небезопасно. Внутри ВМ подними сабинтерфейсы для каждого VLAN.

Можно ли настроить VLAN в Proxmox с одной сетевой картой?

Да, это основной сценарий: одна карта в trunk, VLAN-aware мост и теги на ВМ. Управление хостом выносится в интерфейс vmbr0.10, а провайдер может приходить в отдельном VLAN через управляемый коммутатор. Ограничение одно: вся нагрузка идёт через один порт.

Как назначить VLAN контейнеру LXC в Proxmox?

В веб-интерфейсе: контейнер, Network, адаптер, поле VLAN Tag. В командной строке через pct set с параметром tag, но передавай строку адаптера целиком, вместе с ip, gw и hwaddr. Иначе контейнер останется без адреса.

Нужен ли Open vSwitch для VLAN в Proxmox?

Нет, стандартный Linux bridge в режиме VLAN aware закрывает почти все задачи. Open vSwitch имеет смысл для зеркалирования портов, OpenFlow или если вся инфраструктура уже на нём. Добавлять его ради одних VLAN - лишняя сложность.

Прогноз: сеть, которую можно объяснить

Мы настроили порт коммутатора в trunk, включили VLAN aware на vmbr0 с явным списком VLAN и разнесли ВМ и контейнеры по сетям одним параметром. Роутер получил trunk с ограниченным набором VLAN, управление хостом уехало в тегированный VLAN 10, native VLAN стал пустым. Каждое изменение сети шло с таймером отката, а для кластера есть SDN-зона с именованными сетями.

Теперь сеть хоста описывается одной таблицей VLAN и проверяется двумя командами. Скрипт каждую минуту следит, что VLAN на месте, бэкап каждую ночь сохраняет конфиги и снимок моста. Следующий шаг - правила между VLAN на роутере: базы данных должны быть доступны только из VLAN приложений. Высокие технологии, корпоративная сегментация, enterprise-подход. По факту - четыре строки в конфиге и одна галочка, которую раньше никто не ставил.

Не заработало?
Если не заработало — пиши в комментарии, разберёмся. Приложи вывод bridge vlan show с хоста, строку адаптера из конфига ВМ и настройки порта коммутатора. По этим трём кускам причина обычно находится с первого сообщения.

Андрей А.
Author: Андрей А.

25 years in IT — from a field engineer at MegaFon to head of department. I rebuild IT infrastructure that’s falling apart and turn it into something predictable. I know what chaos costs. I help businesses get out of a crisis: cleaning up legacy systems, stabilizing what’s breaking, and setting up processes you can actually plan around.

Оставайтесь на связи

Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.

Подписаться на IT-Аптеку →
Поделитесь:

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх