Установка OpenWrt на Proxmox: виртуальный роутер в ВМ за 30 минут

Установка OpenWrt на Proxmox VE 9: пошаговая инструкция

Установка OpenWrt на Proxmox сводится к четырём действиям: правильный образ, два моста, ВМ с отключённым Secure Boot и аккуратный перенос IP хоста за новый роутер. Ниже рецепт целиком, с проверками и откатом.

Быстрый ответ
  1. Скачай на хост Proxmox образ OpenWrt x86-64 generic-ext4-combined-efi и распакуй его.
  2. Подготовь два моста: vmbr0 смотрит в провайдера и не имеет IP хоста, vmbr1 становится локальной сетью.
  3. Создай ВМ q35 с OVMF, отключи предзагруженные ключи Secure Boot, импортируй образ как диск, первый сетевой адаптер подключи к LAN, второй к WAN.
  4. Запусти ВМ, задай пароль root и адрес LAN, поставь qemu-ga, включи автозапуск с порядком 1 и только потом переноси адрес хоста в vmbr1.

Если времени нет совсем — вот весь путь в командах. Выполняй на хосте Proxmox, в shell под root. Ниже каждый шаг разобран отдельно, с объяснением зачем и что может сломаться.


# Где выполнять: хост Proxmox, shell под root
VER=25.12.5
BASE=https://downloads.openwrt.org/releases/${VER}/targets/x86/64
IMG=openwrt-${VER}-x86-64-generic-ext4-combined-efi.img
mkdir -p /root/openwrt && cd /root/openwrt
wget ${BASE}/${IMG}.gz ${BASE}/sha256sums
sha256sum -c --ignore-missing sha256sums
gunzip -k ${IMG}.gz
qm create 100 --name openwrt --ostype l26 --machine q35 --bios ovmf \
  --efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=0 \
  --cpu host --cores 2 --memory 512 --balloon 0 \
  --scsihw virtio-scsi-single \
  --scsi0 local-lvm:0,import-from=/root/openwrt/${IMG},discard=on,ssd=1 \
  --boot order=scsi0 \
  --net0 virtio,bridge=vmbr1 --net1 virtio,bridge=vmbr0 \
  --serial0 socket --vga serial0 --agent enabled=1 \
  --onboot 1 --startup order=1,up=30
qm start 100 && qm terminal 100

Диагноз: OpenWrt на Proxmox поднят, а интернета нет

Ставишь OpenWrt на Proxmox, чтобы домашний сервер заодно стал роутером. ВМ создана, лампочки зелёные, а интернета нет. Или он есть, но пропал доступ к веб-интерфейсу Proxmox. Знакомо?

OpenWrt на Proxmox ставится за 15 минут. Ещё два часа уходит на то, чтобы понять, куда делся доступ к самому Proxmox.

Проблема почти никогда не в OpenWrt. Он делает ровно то, что написано в конфиге. Ломается стык: какой виртуальный адаптер стал eth0, на каком мосту живёт IP хоста, кто кому раздаёт DHCP и кто первым стартует после перезагрузки. Этот стык и разберём.

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

  • ВМ с OpenWrt 25.12, которая маршрутизирует трафик из локальной сети в интернет через отдельный WAN-мост.
  • Хост Proxmox, который сидит в LAN за OpenWrt и не торчит веб-интерфейсом наружу.
  • Автозапуск роутера первым после ребута хоста, остальные ВМ стартуют следом.
  • Ежедневный бэкап конфига OpenWrt, еженедельный vzdump всей ВМ и снапшот перед каждым обновлением.
  • Скрипт мониторинга, fail2ban на веб-интерфейс Proxmox и план отката для каждого рискованного шага.

По времени: 30-40 минут, если делаешь первый раз и читаешь объяснения. Из них минут пять уходит на скачивание, остальное на проверки. Проверки не пропускай. Именно они экономят ночь.

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

Физический сервер или мини-ПК с Proxmox VE и поддержкой аппаратной виртуализации. Желательно две сетевые карты: одна смотрит в провайдера, вторая в локальную сеть. С одной картой тоже можно, это разобрано в альтернативах через VLAN.

Обязателен доступ к консоли хоста помимо сети: монитор с клавиатурой, IPMI, iDRAC или iLO. В какой-то момент ты будешь переносить адрес хоста с одного моста на другой. Если ошибёшься без консоли — поедешь к серверу ногами.

Компонент Версия на момент публикации Минимум Комментарий
Proxmox VE 9.2, база Debian 13 8.x Команды подходят для 8.x и 9.x
OpenWrt 25.12.5, ветка 25.12 24.10 С 25.12 пакетный менеджер apk вместо opkg
Образ OpenWrt x86/64 generic-ext4-combined-efi — Для SeaBIOS бери вариант без efi
CPU хоста Intel VT-x или AMD-V 2 ядра Без виртуализации KVM не стартует
RAM для ВМ 512 МБ 256 МБ Больше нужно только под adblock и VPN
Диск для ВМ 1 ГБ около 120 МБ Корневой раздел по умолчанию около 104 МБ
Сетевые карты 2 порта 1 порт С одним портом нужен управляемый коммутатор и VLAN
QEMU Guest Agent пакет qemu-ga в OpenWrt — Нужен для корректного бэкапа и мониторинга

На момент публикации актуальны Proxmox VE 9.2 и OpenWrt 25.12.5. Перед установкой проверь свежие релизы: OpenWrt выпускает сервисные обновления каждые пару месяцев, и номер в переменной VER надо поменять на актуальный.

Ветка 24.10 перестала получать исправления безопасности с сентября 2026 года. Если у тебя где-то крутится она — это повод обновиться, а не повод ставить её заново.

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

  • Причины, по которым OpenWrt в Proxmox не работает с первого раза.
  • Пошаговый рецепт: мосты, образ, ВМ, первый запуск, перенос хоста за роутер.
  • Проверка: команды и ожидаемый вывод.
  • Осложнения: одиннадцать типовых ошибок с причиной и решением.
  • Альтернативы: одна сетевая карта, проброс PCI, LXC, OPNsense, RouterOS CHR.
  • Профилактика: мониторинг, безопасность, бэкап, обновление и откат.
  • FAQ под вопросы, которые реально задают в поиске.

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

Хорошая новость: почти все проблемы тут из одного короткого списка. Плохая: за первую установку ты наступишь минимум на два пункта из него.

Причина Почему ломает Симптом
Включён Secure Boot в OVMF Загрузчик OpenWrt не подписан ключами Microsoft, прошивка ВМ его отвергает Access Denied, ВМ уходит в UEFI Shell
Перепутаны сетевые адаптеры OpenWrt на x86 считает первый адаптер eth0 локальной сетью, второй eth1 провайдером WAN без адреса, DHCP раздаётся в сторону провайдера
Одинаковые подсети LAN и WAN Домашний роутер провайдера тоже выдаёт 192.168.1.0/24, маршрутизация путается Пинги ходят через раз, интернета нет
IP хоста остался на WAN-мосту Хост с белым адресом на vmbr0 открывает порт 8006 и SSH в интернет Работает, но небезопасно. Сканеры найдут за сутки
Нет автозапуска и порядка старта После ребута хоста остальные ВМ стартуют раньше роутера и не получают адреса Утром половина сервисов без сети
Не тот образ rootfs.tar.gz предназначен для контейнеров, образ без efi не грузится на OVMF No bootable device, пустой диск
Эмуляция e1000 вместо virtio Эмулируемая карта нагружает CPU хоста на каждом пакете Скорость упирается в 300-500 Мбит/с, ядро хоста в полке

Теперь посмотри на схему. На ней всё, что мы соберём. Запомни главное правило: у хоста Proxmox нет адреса на WAN-мосте. Хост живёт в LAN, как обычный клиент роутера.

%%{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
    ISP["Провайдер или роутер провайдера"] --> NIC1["enp1s0 физический порт WAN"]
    NIC1 --> VMBR0["vmbr0 мост WAN без IP хоста"]
    VMBR0 --> ETH1["net1 в ВМ, внутри это eth1"]
    ETH1 --> OWRT["ВМ 100 OpenWrt"]
    OWRT --> ETH0["net0 в ВМ, внутри это eth0"]
    ETH0 --> VMBR1["vmbr1 мост LAN"]
    VMBR1 --> HOST["Хост Proxmox 192.168.10.2"]
    VMBR1 --> VMS["Другие ВМ и контейнеры"]
    VMBR1 --> NIC2["enp2s0 физический порт LAN"]
    NIC2 --> SW["Коммутатор и клиенты"]
    style ISP fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style VMBR0 fill:#f8fafc,stroke:#f97316,stroke-width:2px,color:#9a3412
    style OWRT fill:#f8fafc,stroke:#22c55e,stroke-width:2px,color:#15803d
    style VMBR1 fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style HOST fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af
    style SW fill:#f8fafc,stroke:#3b82f6,stroke-width:2px,color:#1e40af

Адресный план в статье такой. Подставь свои значения, но держи подсеть LAN отличной от той, что выдаёт провайдер или его роутер.

Узел Интерфейс Адрес
OpenWrt eth1, WAN DHCP от провайдера или статика
OpenWrt br-lan, LAN 192.168.10.1/24
Хост Proxmox vmbr1 192.168.10.2/24, шлюз 192.168.10.1
Клиенты LAN — DHCP от OpenWrt, пул 192.168.10.100-250

Рецепт: установка OpenWrt на Proxmox пошагово

Порты, которые будут работать

Сначала разберись, что и где слушает. Это пригодится на шаге с firewall и при отладке, когда непонятно, кто именно отвечает на запрос.

Порт Протокол Сервис Где слушает Доступен снаружи?
8006 TCP Веб-интерфейс Proxmox Хост, 192.168.10.2 Нет, только LAN
22 TCP SSH хоста Proxmox Хост, 192.168.10.2 Нет, только LAN
3128 TCP SPICE proxy Proxmox Хост Нет
80, 443 TCP LuCI, веб-интерфейс OpenWrt OpenWrt, 192.168.10.1 Нет, firewall OpenWrt режет вход с WAN
22 TCP Dropbear, SSH OpenWrt OpenWrt, только LAN Нет
53 TCP, UDP DNS, dnsmasq OpenWrt, LAN Нет
67, 68 UDP DHCP OpenWrt: сервер в LAN, клиент на WAN Только клиент на WAN
51820 UDP WireGuard, если поднимешь OpenWrt, WAN Да, если откроешь правилом

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

Зачем: убедиться, что KVM доступен, понять имена сетевых карт и хранилищ. Имена enp1s0 и local-lvm в статье условные. У тебя они почти наверняка другие.


# Где выполнять: хост Proxmox, shell под root
pveversion
grep -Ec '(vmx|svm)' /proc/cpuinfo
ip -br link
pvesm status
cat /etc/network/interfaces

Что должно получиться: pveversion показывает pve-manager 9.x или 8.x. Счётчик vmx или svm больше нуля, иначе включи виртуализацию в BIOS. В выводе ip -br link найди физические порты, обычно enp-что-то или eno-что-то. В pvesm status запомни хранилище с типом lvmthin или zfspool, туда ляжет диск ВМ.

Посмотри внимательно на /etc/network/interfaces. После стандартной установки там есть vmbr0 с IP хоста и одним физическим портом. Этот vmbr0 мы сделаем WAN-мостом. Порт, который в нём, должен смотреть в провайдера или в роутер провайдера.

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

Зачем: дальше ты дважды правишь сеть хоста. Копия конфига — это откат одной командой вместо поездки к серверу.


# Где выполнять: хост Proxmox
cp /etc/network/interfaces /root/interfaces.bak
cp /etc/hosts /root/hosts.bak
ls -l /root/*.bak

Результат: два файла с расширением bak в /root. Не перезаписывай их на следующих шагах, это твоя точка возврата.

Шаг 2. Создай LAN-мост vmbr1

Зачем: OpenWrt нужен мост, куда он будет раздавать адреса. Пока мы не трогаем IP хоста, он остаётся на vmbr0, и ты не теряешь доступ. Мост создаём без адреса.

Открой /etc/network/interfaces и добавь в конец блок. Вместо enp2s0 впиши свой второй физический порт. Если второго порта нет и LAN нужен только для ВМ внутри хоста, напиши bridge-ports none.


auto vmbr1
iface vmbr1 inet manual
        bridge-ports enp2s0
        bridge-stp off
        bridge-fd 0
#LAN за OpenWrt

Примени конфиг. В Proxmox стоит ifupdown2, он умеет перечитывать сеть без перезагрузки и без обрыва существующих интерфейсов.


# Где выполнять: хост Proxmox
ifreload -a
ip -br link show vmbr1
bridge link show | grep vmbr1

Результат: vmbr1 в состоянии UP, если в порт воткнут кабель, или UNKNOWN без кабеля. Во втором выводе видно, что enp2s0 стал портом моста. Доступ к Proxmox при этом не пропал, потому что vmbr0 мы не трогали.

То же самое можно сделать в веб-интерфейсе: узел, System, Network, Create, Linux Bridge. Результат одинаковый, разница в том, что команды проще повторить на втором сервере.

Шаг 3. Скачай образ OpenWrt и проверь контрольную сумму

Зачем: нужен образ под x86/64 с разметкой под UEFI. Вариант ext4 проще расширять и чинить, squashfs даёт откат к заводским настройкам. В ВМ откат делает снапшот Proxmox, поэтому ext4 удобнее.

Файл в каталоге targets/x86/64 Для чего Берём?
generic-ext4-combined-efi.img.gz ВМ с OVMF, UEFI Да, основной вариант
generic-ext4-combined.img.gz ВМ с SeaBIOS Если выбираешь BIOS вместо UEFI
generic-squashfs-combined-efi.img.gz Железо, где нужен factory reset Можно, но расширять диск сложнее
rootfs.tar.gz LXC-контейнер Нет, это для контейнеров

Все образы лежат на официальном сервере загрузок OpenWrt. Качай прямо на хост, без промежуточного ПК.


# Где выполнять: хост Proxmox
VER=25.12.5
BASE=https://downloads.openwrt.org/releases/${VER}/targets/x86/64
IMG=openwrt-${VER}-x86-64-generic-ext4-combined-efi.img
mkdir -p /root/openwrt && cd /root/openwrt
wget ${BASE}/${IMG}.gz
wget ${BASE}/sha256sums
sha256sum -c --ignore-missing sha256sums

Результат: строка с именем образа и словом OK. Если видишь FAILED — образ битый или подменён, качай заново. Не ставь роутер из файла, который не прошёл проверку. Это единственное устройство в сети, через которое ходит весь трафик.


# Где выполнять: хост Proxmox, каталог /root/openwrt
gunzip -k ${IMG}.gz
ls -lh /root/openwrt/

Вот тут не пугайся. gunzip почти наверняка напишет про trailing garbage ignored. Это нормально: в конец образа OpenWrt дописана подпись, gunzip её не понимает и честно об этом говорит. Файл .img при этом распакован целиком, размер около 120 МБ.

Шаг 4. Создай ВМ одной командой

Зачем: веб-мастер создания ВМ требует ISO и предлагает лишнее. Одна команда qm create создаёт ВМ, сразу импортирует образ как диск и выставляет всё, что нужно роутеру. Параметр import-from работает с Proxmox VE 7.2 и выше.


# Где выполнять: хост Proxmox
VER=25.12.5
IMG=openwrt-${VER}-x86-64-generic-ext4-combined-efi.img
qm create 100 \
  --name openwrt \
  --ostype l26 \
  --machine q35 \
  --bios ovmf \
  --efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=0 \
  --cpu host \
  --cores 2 \
  --memory 512 \
  --balloon 0 \
  --scsihw virtio-scsi-single \
  --scsi0 local-lvm:0,import-from=/root/openwrt/${IMG},discard=on,ssd=1 \
  --boot order=scsi0 \
  --net0 virtio,bridge=vmbr1 \
  --net1 virtio,bridge=vmbr0 \
  --serial0 socket \
  --vga serial0 \
  --agent enabled=1 \
  --onboot 1 \
  --startup order=1,up=30

Разберу параметры, которые реально влияют на результат. Остальное можно оставить как есть.

Параметр Значение Зачем
pre-enrolled-keys=0 Пустая база ключей Secure Boot Без этого OVMF не пустит неподписанный загрузчик OpenWrt
net0 на vmbr1 Первый адаптер, внутри eth0 OpenWrt на x86 делает eth0 локальной сетью
net1 на vmbr0 Второй адаптер, внутри eth1 eth1 по умолчанию становится WAN с DHCP-клиентом
cpu host Все инструкции процессора хоста Быстрее шифрование для VPN. В кластере с миграцией ставь x86-64-v2-AES
balloon 0 Без динамической памяти Роутеру не нужно, чтобы у него отбирали RAM под нагрузкой
serial0 и vga serial0 Последовательная консоль Работает qm terminal и копипаст в консоли
agent enabled=1 Канал для QEMU Guest Agent Корректное выключение, снапшоты, мониторинг
onboot и startup order=1,up=30 Автозапуск первым, пауза 30 секунд Остальные ВМ стартуют, когда роутер уже раздаёт DHCP

Если 100 у тебя занят, возьми свободный номер. Узнать его можно командой pvesh get /cluster/nextid. Хранилище local-lvm замени на своё из вывода pvesm status. Для ZFS это обычно local-zfs.


# Где выполнять: хост Proxmox
qm config 100

Результат: в конфиге есть scsi0 размером около 120 МБ, efidisk0, два сетевых адаптера с разными мостами и строка onboot: 1. Запиши MAC-адреса net0 и net1 из этого вывода. Они понадобятся, если адаптеры придётся поменять местами.

Шаг 5. Увеличь диск, если нужно место под пакеты

Зачем: корневой раздел образа около 104 МБ. Для роутера с LuCI и парой пакетов этого хватает с запасом. Если планируешь adblock со списками, Zabbix-агент и WireGuard с логами, дай гигабайт.

Шаг необязательный. Пропусти его, если не уверен, что место понадобится. Есть нюанс: обычный sysupgrade образом перезаписывает таблицу разделов и возвращает размер к исходному. Расширение придётся повторять после каждого обновления.


# Где выполнять: хост Proxmox, ВМ выключена
qm disk resize 100 scsi0 1G

Диск вырос, но раздел внутри остался прежним. Его растянем на шаге 8, когда в OpenWrt будет интернет и можно будет поставить parted.

Шаг 6. Первый запуск и консоль

Зачем: на первом старте у OpenWrt нет пароля, LAN висит на 192.168.1.1, а доступ из сети к нему есть только из vmbr1. Самый надёжный путь — последовательная консоль прямо с хоста.


# Где выполнять: хост Proxmox
qm start 100
qm terminal 100

Нажми Enter, появится приглашение root@OpenWrt. Выйти из консоли можно сочетанием Ctrl+O. В веб-интерфейсе та же консоль открывается кнопкой Console, режим xterm.js.

Первым делом проверь, что адаптеры встали так, как мы задумали. Это главная точка, где установка OpenWrt на Proxmox идёт не туда.


# Где выполнять: консоль OpenWrt, qm terminal 100
ip -br link
uci show network | grep -E "device|proto"

Результат: eth0 состоит в br-lan, интерфейс wan использует eth1 с proto dhcp. Если наоборот — выходи из консоли и смотри раздел про осложнения, там есть команда для обмена адаптеров на стороне Proxmox.

Шаг 7. Пароль root и адрес LAN

Зачем: без пароля LuCI и SSH пускают любого из LAN. Адрес LAN меняем, потому что роутер провайдера почти всегда сидит в 192.168.1.0/24, а одинаковые подсети на WAN и LAN ломают маршрутизацию.


# Где выполнять: консоль OpenWrt
passwd
uci set network.lan.ipaddr='192.168.10.1'
uci set network.lan.netmask='255.255.255.0'
uci set system.@system[0].hostname='openwrt-pve'
uci commit network
uci commit system
service network restart

Результат: команда ip -br addr show br-lan показывает 192.168.10.1/24. Пул DHCP в OpenWrt задаётся смещением от адреса сети, поэтому после смены подсети он сам переедет в 192.168.10.100-250.

Если провайдер отдаёт статический адрес или нужен PPPoE, настрой WAN сейчас. Для PPPoE команды такие, логин и пароль подставь свои.


# Где выполнять: консоль OpenWrt, только если у провайдера PPPoE
uci set network.wan.proto='pppoe'
uci set network.wan.username='логин_от_провайдера'
uci set network.wan.password='пароль_от_провайдера'
uci commit network
service network restart

Шаг 8. Проверь WAN и поставь QEMU Guest Agent

Зачем: убедиться, что роутер видит интернет, пока хост ещё сидит на старом адресе. Если тут что-то не так, ты чинишь это без риска потерять доступ к Proxmox.


# Где выполнять: консоль OpenWrt
ifstatus wan | grep -A3 '"ipv4-address"'
ping -c 3 1.1.1.1
ping -c 3 openwrt.org

Результат: у WAN есть адрес, оба пинга проходят. Если первый пинг идёт, а второй нет — проблема в DNS, смотри осложнения.

Теперь агент. В 25.12 пакеты ставятся через apk, команды opkg больше нет. Это частая причина, почему старые инструкции не работают дословно.


# Где выполнять: консоль OpenWrt
apk update
apk add qemu-ga
service qemu-ga enable
service qemu-ga start

Вот тут важно. Канал агента появляется в ВМ только после полного выключения и включения с хоста. Перезагрузка изнутри OpenWrt не считается. Сделай это сейчас.


# Где выполнять: хост Proxmox
qm shutdown 100 && qm start 100
sleep 20
qm agent 100 ping && echo "agent OK"
qm guest cmd 100 network-get-interfaces | grep -E '"name"|"ip-address"'

Результат: agent OK и список интерфейсов с адресами, включая WAN. Теперь Proxmox видит адреса ВМ в сводке, умеет корректно её гасить и замораживать файловую систему перед бэкапом.

Если на шаге 5 ты увеличил диск, растяни раздел сейчас. Метод взят из официальной инструкции OpenWrt по расширению корня. Второй раздел в образе combined-efi — корневой.


# Где выполнять: консоль OpenWrt, только если делал шаг 5
apk add parted losetup resize2fs e2fsprogs
parted -f -s /dev/sda resizepart 2 100%
reboot

# Где выполнять: консоль OpenWrt, после перезагрузки
LOOP="$(losetup -f)"
losetup ${LOOP} /dev/sda2
fsck.ext4 -y ${LOOP}
resize2fs ${LOOP}
reboot

После второй перезагрузки команда df -h / покажет около гигабайта. Если раздел не вырос — проверь, что диск в Proxmox действительно увеличен: lsblk внутри OpenWrt покажет размер sda.

Шаг 9. Перенеси хост Proxmox за OpenWrt

Это самый рискованный шаг. Сейчас хост сидит на vmbr0 рядом с WAN роутера. Мы убираем с vmbr0 его адрес и даём ему адрес в LAN, где шлюзом станет OpenWrt.

Критично: можно потерять доступ к серверу
Делай этот шаг из консоли хоста: монитор с клавиатурой, IPMI, iDRAC или iLO. Сначала поставь таймер автоотката, он вернёт старый конфиг через пять минут, если ты не отменишь его вручную. Не начинай, пока шаг 8 не прошёл полностью: у OpenWrt должен быть интернет и пароль root.

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

Таймер стоит. Это приём из продакшна: сетевые изменения на удалённой железке всегда делай с автоматическим откатом. Если связь пропадёт, через пять минут всё вернётся само.

Теперь итоговый /etc/network/interfaces. Замени файл целиком, подставив свои имена портов. На vmbr0 больше нет адреса, только порт к провайдеру.


auto lo
iface lo inet loopback

iface enp1s0 inet manual

iface enp2s0 inet manual

auto vmbr0
iface vmbr0 inet manual
        bridge-ports enp1s0
        bridge-stp off
        bridge-fd 0
#WAN, у хоста адреса нет

auto vmbr1
iface vmbr1 inet static
        address 192.168.10.2/24
        gateway 192.168.10.1
        bridge-ports enp2s0
        bridge-stp off
        bridge-fd 0
#LAN за OpenWrt

source /etc/network/interfaces.d/*

Proxmox требует, чтобы имя узла резолвилось в его реальный адрес через /etc/hosts. Если оставить старый IP, отвалится веб-интерфейс и сломается pve-cluster. Поправь строку с именем узла и DNS.


# Где выполнять: хост Proxmox
OLDIP=$(hostname -i | awk '{print $1}')
sed -i "s/^${OLDIP}\b/192.168.10.2/" /etc/hosts
grep "$(hostname)" /etc/hosts
echo "nameserver 192.168.10.1" > /etc/resolv.conf
ifreload -a

Проверь, что всё живое, и только потом отменяй откат.


# Где выполнять: хост Proxmox
ip -br addr show vmbr1
ip route | grep default
ping -c 3 192.168.10.1
ping -c 3 1.1.1.1
systemctl stop net-rollback.timer

Результат: у vmbr1 адрес 192.168.10.2/24, маршрут по умолчанию через 192.168.10.1, оба пинга проходят. Таймер остановлен. Подключи ноутбук в коммутатор за enp2s0. Он получит адрес из 192.168.10.100-250, а Proxmox откроется по адресу https://192.168.10.2:8006, LuCI по http://192.168.10.1.

Если что-то пошло не так и таймер уже отработал, ты снова на старом адресе. Разбери, что сломалось, и повтори шаг заново с новым таймером.

Шаг 10. Закрой SSH в OpenWrt ключами

Зачем: пароль root для LuCI нужен, а SSH по паролю — лишняя дыра даже внутри LAN. Ключ хоста Proxmox пригодится для автоматического бэкапа конфига.


# Где выполнять: хост Proxmox, затем повтори со своего ПК
test -f /root/.ssh/id_ed25519 || ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519
cat /root/.ssh/id_ed25519.pub | ssh root@192.168.10.1 "cat >> /etc/dropbear/authorized_keys"
ssh root@192.168.10.1 "uname -a"

Обычный ssh-copy-id тут не подходит: он кладёт ключ в домашний каталог, а Dropbear читает /etc/dropbear/authorized_keys. Когда вход по ключу заработал со всех нужных машин, запрети пароли и привяжи SSH только к LAN.


# Где выполнять: консоль или SSH в OpenWrt
uci set dropbear.@dropbear[0].PasswordAuth='off'
uci set dropbear.@dropbear[0].RootPasswordAuth='off'
uci set dropbear.@dropbear[0].Interface='lan'
uci commit dropbear
service dropbear restart

Не закрывай текущую сессию. Открой новую и проверь вход по ключу. Если не пускает — в старой сессии верни PasswordAuth в on и разбирайся.

Шаг 11. Порядок старта остальных ВМ

Зачем: роутер стартует первым и ждёт 30 секунд. Остальным гостям ставим порядок 2 и дальше, чтобы они не загрузились раньше DHCP и DNS.


# Где выполнять: хост Proxmox, номера ВМ подставь свои
qm set 101 --onboot 1 --startup order=2,up=10
pct set 200 --onboot 1 --startup order=2
qm config 100 | grep -E 'onboot|startup'

Результат: у ВМ 100 onboot 1 и order=1. Перезагрузи хост в удобное окно и посмотри, что все гости поднялись с адресами. Это единственный честный тест автозапуска.

Вот как выглядит старт после ребута хоста. Если у какой-то ВМ нет адреса после загрузки, ищи ошибку в этой цепочке.

%%{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 H as Хост Proxmox
    participant O as OpenWrt ВМ 100
    participant P as Провайдер
    participant V as Остальные ВМ
    H->>O: Старт, order 1
    O->>P: DHCP запрос на WAN
    P->>O: Адрес WAN и шлюз
    Note over O: dnsmasq раздаёт адреса в LAN
    H->>H: Ожидание 30 секунд
    H->>V: Старт, order 2
    V->>O: DHCP запрос в LAN
    O->>V: Адрес из 192.168.10.0/24

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

Проверка идёт с трёх сторон: хост видит ВМ и агент, роутер видит интернет, клиент в LAN получает адрес и ходит наружу. Если все три зелёные — готово.


# Где выполнять: хост Proxmox
qm status 100 --verbose | grep -E '^status|^uptime|^qmpstatus'
qm agent 100 ping && echo "agent OK"
ip route | grep default
ping -c 3 192.168.10.1
ping -c 3 1.1.1.1
getent hosts proxmox.com

# Где выполнять: SSH в OpenWrt
ifstatus wan | grep -E '"up"|"address"'
logread | grep -E 'dnsmasq-dhcp|netifd' | tail -20
cat /tmp/dhcp.leases
fw4 print | grep -c chain
df -h /
free -m

# Где выполнять: Linux-клиент в LAN, например ноутбук
ip -br addr
ip route | grep default
ping -c 3 192.168.10.1
ping -c 3 ya.ru
Проверка Ожидаемый результат Если не так
qm status 100 status: running, qmpstatus: running Смотри журнал запуска: journalctl -u pve-guests
qm agent 100 ping Пустой вывод и agent OK Агент не стоит или ВМ не перезапускалась с хоста
ifstatus wan «up»: true и адрес провайдера Перепутаны адаптеры или провайдер привязан к MAC
/tmp/dhcp.leases Строки с MAC и адресами клиентов Порт LAN не в vmbr1 или в сети второй DHCP
df -h / Свободно больше 50% Расширь диск по шагам 5 и 8
ping ya.ru с клиента Ответы без потерь Проблема в DNS или NAT, смотри осложнения

И ещё один тест, который почти никто не делает. С внешней машины, например с телефона через мобильный интернет, попробуй открыть белый адрес на порту 8006. Должен быть таймаут. Если открылось — у хоста остался адрес на WAN-мосте.

Осложнения: типовые ошибки OpenWrt на 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["Нет интернета за OpenWrt"] --> B{"ВМ загрузилась?"}
    B -->|Нет| C["Secure Boot или не тот образ"]
    B -->|Да| D{"У WAN есть адрес?"}
    D -->|Нет| E["Перепутаны net0 и net1"]
    D -->|Да| F{"Пинг 1.1.1.1 с роутера?"}
    F -->|Нет| G["Конфликт подсетей или шлюз"]
    F -->|Да| H{"Клиент получил адрес?"}
    H -->|Нет| I["Порт LAN не в vmbr1"]
    H -->|Да| J["Проверь DNS на клиенте"]
    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. Access Denied при загрузке, ВМ падает в UEFI Shell

Причина: ВМ создана через веб-интерфейс с галкой Pre-Enroll keys. OVMF включает Secure Boot и отвергает неподписанный загрузчик OpenWrt.

Решение: пересоздай EFI-диск без предзагруженных ключей. Сам диск с OpenWrt не трогаем, данные не пострадают.


# Где выполнять: хост Proxmox
qm stop 100
qm set 100 --delete efidisk0
qm set 100 --efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=0
qm start 100

Ошибка 2. No bootable device или вечная перезагрузка

Причина: не выставлен порядок загрузки, либо образ без efi подключён к ВМ с OVMF. Бывает и обратное: образ efi на SeaBIOS грузится, но не всегда.

Решение: проверь boot order. Если образ без efi, переключи ВМ на SeaBIOS.


# Где выполнять: хост Proxmox
qm config 100 | grep -E 'boot|bios|scsi0'
qm set 100 --boot order=scsi0
# только если образ без efi:
qm set 100 --bios seabios

Ошибка 3. У WAN нет адреса, DHCP уходит к провайдеру

Причина: net0 подключён к WAN-мосту, net1 к LAN. OpenWrt честно поднимает DHCP-сервер на eth0 и раздаёт адреса в сеть провайдера. Иногда провайдер за такое блокирует порт.

Решение: поменяй мосты местами на стороне Proxmox, сохранив MAC-адреса. Внутри OpenWrt ничего трогать не нужно. MAC возьми из qm config 100.


# Где выполнять: хост Proxmox, MAC подставь из qm config 100
qm config 100 | grep ^net
qm set 100 --net0 virtio=BC:24:11:AA:AA:AA,bridge=vmbr1
qm set 100 --net1 virtio=BC:24:11:BB:BB:BB,bridge=vmbr0
qm reboot 100

Ошибка 4. Провайдер не выдаёт адрес новому роутеру

Причина: провайдер привязал услугу к MAC старого роутера. У виртуального адаптера MAC случайный, из диапазона Proxmox.

Решение: задай WAN-адаптеру MAC старого роутера. Делай это на стороне Proxmox, тогда MAC переживёт любые переустановки OpenWrt. Старый роутер из сети убери, два одинаковых MAC в одном сегменте дадут хаос.


# Где выполнять: хост Proxmox, MAC старого роутера подставь свой
qm set 100 --net1 virtio=AA:BB:CC:DD:EE:FF,bridge=vmbr0
qm reboot 100

Ошибка 5. Пинги ходят через раз, интернет то есть, то нет

Причина: конфликт подсетей. Роутер провайдера выдал WAN адрес из 192.168.1.0/24, а LAN у OpenWrt остался на 192.168.1.1. Ядро не понимает, куда слать ответы.

Решение: смени подсеть LAN на любую другую. После этого не забудь, что адрес хоста Proxmox тоже должен переехать.


# Где выполнять: консоль OpenWrt, qm terminal 100
ifstatus wan | grep '"address"'
uci get network.lan.ipaddr
uci set network.lan.ipaddr='192.168.10.1'
uci commit network
service network restart

Ошибка 6. После переноса адреса пропал веб-интерфейс Proxmox

Причина: в /etc/hosts остался старый адрес узла, либо у vmbr1 нет порта, через который ты подключаешься, либо ноутбук сидит в старой подсети.

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

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

Когда доступ вернулся, проверь три вещи: имя узла в /etc/hosts указывает на новый адрес, у vmbr1 правильный физический порт, ноутбук подключён именно в этот порт или в коммутатор за ним.

Ошибка 7. Клиенты в LAN не получают адрес

Причина: физический порт не добавлен в vmbr1, в сети работает второй DHCP-сервер, или на сетевом адаптере ВМ включён firewall Proxmox и режет широковещательный трафик.

Решение: послушай DHCP прямо на мосту хоста. Если запросы клиента видны, а ответов нет — проблема в OpenWrt. Если запросов не видно — в физике или мосте.


# Где выполнять: хост Proxmox
bridge link show | grep vmbr1
apt install -y tcpdump
tcpdump -ni vmbr1 -c 20 port 67 or port 68
qm config 100 | grep ^net

В выводе qm config у net0 и net1 не должно быть firewall=1. Фильтрацией занимается OpenWrt, двойной firewall на одном пути добавляет только загадок.

Ошибка 8. Интернет есть по IP, но сайты не открываются

Причина: не работает DNS. Либо провайдер не выдал DNS по DHCP, либо dnsmasq упал, либо у хоста в /etc/resolv.conf остался старый сервер.


# Где выполнять: SSH в OpenWrt
nslookup ya.ru 127.0.0.1
cat /tmp/resolv.conf.d/resolv.conf.auto
service dnsmasq restart
logread -e dnsmasq | tail -20

Если провайдер не отдаёт DNS, пропиши серверы вручную на WAN. Затем проверь resolv.conf на хосте Proxmox, там должен быть 192.168.10.1.


# Где выполнять: SSH в OpenWrt
uci set network.wan.peerdns='0'
uci add_list network.wan.dns='77.88.8.8'
uci add_list network.wan.dns='1.1.1.1'
uci commit network
service network restart

Ошибка 9. Низкая скорость и загрузка CPU хоста

Причина: выбрана модель адаптера e1000 или rtl8139, работает одна очередь на гигабитном и выше канале, для PPPoE не настроен MTU.

Решение: virtio с несколькими очередями, по числу ядер ВМ. В OpenWrt включи packet steering, он раскидывает обработку пакетов по ядрам.


# Где выполнять: хост Proxmox, MAC оставь прежние
qm set 100 --net0 virtio=BC:24:11:AA:AA:AA,bridge=vmbr1,queues=2
qm set 100 --net1 virtio=BC:24:11:BB:BB:BB,bridge=vmbr0,queues=2

# Где выполнять: SSH в OpenWrt
uci set network.globals.packet_steering='1'
uci commit network
service network restart

Замеряй до и после. iperf3 между клиентом в LAN и сервером снаружи покажет реальную цифру. Не верь ощущениям, верь графикам.

Ошибка 10. QEMU guest agent is not running

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


# Где выполнять: SSH в OpenWrt
apk info -e qemu-ga && service qemu-ga status

# Где выполнять: хост Proxmox
qm set 100 --agent enabled=1
qm shutdown 100 && qm start 100
qm agent 100 ping && echo "agent OK"

Ошибка 11. После обновления пропали пакеты или уменьшился диск

Причина: sysupgrade образом ставит чистую систему и переносит только конфиги. Пакеты, поставленные вручную, надо ставить заново. Таблица разделов тоже приходит из образа.

Решение: перед обновлением сохрани список пакетов, после обновления поставь их одной командой. Для минорных обновлений внутри ветки удобнее Attended Sysupgrade, он собирает образ сразу с твоими пакетами.


# Где выполнять: SSH в OpenWrt, до обновления
apk info > /etc/backup-packages.txt
echo /etc/backup-packages.txt >> /etc/sysupgrade.conf
Ошибка Причина Решение
Access Denied, UEFI Shell Secure Boot с ключами Microsoft Пересоздать efidisk0 с pre-enrolled-keys=0
No bootable device Порядок загрузки или не тот образ boot order=scsi0, образ под свой BIOS
WAN без адреса Перепутаны net0 и net1 Поменять мосты с сохранением MAC
Провайдер не выдаёт адрес Привязка к MAC MAC старого роутера на net1
Интернет через раз Одинаковые подсети WAN и LAN LAN в 192.168.10.0/24
Пропал доступ к Proxmox /etc/hosts, порт моста, подсеть ноутбука Откат и повтор с таймером
Клиенты без адреса Порт не в мосту, второй DHCP, firewall на NIC tcpdump на vmbr1, убрать firewall=1
Сайты не открываются DNS Ручные DNS на WAN, resolv.conf хоста
Низкая скорость e1000, одна очередь virtio, queues, packet steering
Агент не отвечает Нет холодного старта qm shutdown и qm start
Пакеты пропали после обновления sysupgrade ставит чистую систему Список пакетов в бэкап, ASU

Альтернативы: OpenWrt в LXC, проброс сетевой карты, другие роутеры

ВМ с virtio — это компромисс между скоростью, изоляцией и простотой. Он закрывает большинство домашних и офисных задач до гигабита. Но вариантов больше, и в некоторых случаях другой подход честнее.

Одна сетевая карта: VLAN-aware мост

У мини-ПК часто один порт. Тогда WAN и LAN разносятся по VLAN, а разбирает их управляемый коммутатор. Кабель провайдера идёт в access-порт VLAN 20, сервер подключён в trunk с VLAN 10 и 20.

Без управляемого коммутатора эта схема не работает. Тегированный трафик просто некому разобрать. Неуправляемый свитч за 800 рублей тут не помощник.


auto lo
iface lo inet loopback

iface enp1s0 inet manual

auto vmbr0
iface vmbr0 inet manual
        bridge-ports enp1s0
        bridge-stp off
        bridge-fd 0
        bridge-vlan-aware yes
        bridge-vids 2-4094

auto vmbr0.10
iface vmbr0.10 inet static
        address 192.168.10.2/24
        gateway 192.168.10.1
#Хост в LAN, VLAN 10

# Где выполнять: хост Proxmox, MAC оставь прежние
qm set 100 --net0 virtio=BC:24:11:AA:AA:AA,bridge=vmbr0,tag=10
qm set 100 --net1 virtio=BC:24:11:BB:BB:BB,bridge=vmbr0,tag=20

Внутри OpenWrt ничего не меняется: он по-прежнему видит eth0 и eth1 без тегов. Теги снимает мост Proxmox.

Проброс сетевой карты в ВМ

Если канал 2.5 или 10 Гбит/с и virtio не вытягивает, отдай физическую карту ВМ целиком через PCI passthrough. Хост эту карту больше не видит. Пакеты идут мимо его сетевого стека, задержка и нагрузка падают.


# Где выполнять: хост Proxmox
dmesg | grep -e DMAR -e IOMMU | head
lspci -nn | grep -i ethernet
find /sys/kernel/iommu_groups/ -type l | grep 03:00
qm set 100 --hostpci0 0000:03:00.0,pcie=1

Минусы: ВМ нельзя мигрировать на другой узел, карта должна сидеть в своей IOMMU-группе, а при сбое ВМ порт мёртв до её перезапуска. На свежих ядрах Proxmox IOMMU для Intel включён по умолчанию, для AMD тоже обычно работает из коробки. Проверяй вывод dmesg, а не форумы пятилетней давности.

OpenWrt в LXC-контейнере

Работает, но это вариант для экспериментов. Контейнер делит ядро с хостом, поэтому модули ядра OpenWrt не загрузить, а часть функций вроде некоторых VPN и SQM упирается в ядро Proxmox. Плюс почти нулевой расход ресурсов.


# Где выполнять: хост Proxmox, только для тестов
VER=25.12.5
cd /var/lib/vz/template/cache
wget https://downloads.openwrt.org/releases/${VER}/targets/x86/64/openwrt-${VER}-x86-64-rootfs.tar.gz
pct create 200 local:vztmpl/openwrt-${VER}-x86-64-rootfs.tar.gz \
  --ostype unmanaged --arch amd64 --hostname openwrt-lxc \
  --cores 1 --memory 256 --swap 0 --rootfs local-lvm:1 \
  --net0 name=eth0,bridge=vmbr1 --net1 name=eth1,bridge=vmbr0

Для основного роутера сети я LXC не беру. Обновление ядра хоста здесь может молча поменять поведение роутера, и узнаешь ты об этом от пользователей.

Сравнение вариантов

Вариант Скорость Сложность Изоляция Когда выбирать
OpenWrt в ВМ, virtio До 1-2 Гбит/с Низкая Полная Дом, офис до 50 человек, домашняя лаборатория
OpenWrt в ВМ, PCI passthrough Линейная на 2.5-10G Средняя Полная Быстрый канал, отдельная сетевая карта
OpenWrt в LXC Высокая Средняя Слабая Тесты, изолированные подсети внутри хоста
OPNsense в ВМ До 1-2 Гбит/с Средняя Полная Нужны IDS, отчёты и веб-интерфейс уровня enterprise
MikroTik RouterOS CHR Зависит от лицензии Средняя Полная Вся сеть уже на MikroTik, нужен единый стиль конфигов
Сам Proxmox как роутер, nftables Максимальная Высокая Нет Минимализм и понимание nftables. Хост становится пограничным
Отдельный железный роутер По железу Низкая Физическая Интернет должен жить, даже когда сервер на обслуживании

Почему в статье ВМ с virtio. Она переживает обновления хоста без сюрпризов, снапшотится перед каждым изменением и переносится на другой узел. Скорости хватает для типичного канала. Когда канал вырастет — переход на passthrough занимает одну команду.

Отдельно скажу про последний пункт таблицы. Виртуальный роутер означает, что перезагрузка хоста равна перезагрузке интернета. Если это неприемлемо, держи железный роутер, а OpenWrt в Proxmox используй для лабораторных сегментов.

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

Роутер, который никто не мониторит, ломается в пятницу вечером. Это не закон природы, это просто статистика моих инцидентов.

Мониторинг

Минимум, который стоит сделать сразу: скрипт на хосте раз в минуту проверяет агент, LAN-адрес роутера и выход в интернет. Ошибки пишет в системный журнал. Оттуда их заберёт Zabbix, Prometheus или любой сборщик логов.


# Где выполнять: хост Proxmox
cat > /usr/local/bin/openwrt-watch.sh </dev/null 2>&1 || logger -t openwrt-watch "VM $VMID: guest agent не отвечает"
ping -c 2 -W 2 "$GW" >/dev/null 2>&1 || logger -t openwrt-watch "OpenWrt $GW недоступен из LAN"
ping -c 2 -W 2 "$EXT" >/dev/null 2>&1 || logger -t openwrt-watch "Нет выхода в интернет через OpenWrt"
EOF
chmod +x /usr/local/bin/openwrt-watch.sh
echo '* * * * * root /usr/local/bin/openwrt-watch.sh' > /etc/cron.d/openwrt-watch
journalctl -t openwrt-watch --since "10 min ago"

Автоматический qm reset по результатам проверки я специально не добавляю. Роутер, который перезапускается сам каждые пять минут из-за упавшего провайдера, хуже роутера, который просто лежит. Сначала алерт, потом решение человека.

Если у тебя есть Zabbix, повесь на 192.168.10.1 шаблон ICMP Ping и добавь триггер на потерю пакетов до внешнего адреса. Для метрик изнутри в OpenWrt есть пакет zabbix-agentd, ставится через apk add. Не забудь открыть его порт только с адреса Zabbix-сервера.

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

Firewall. UFW на хост Proxmox не ставь. У Proxmox свой pve-firewall на nftables или iptables, и два менеджера правил на одной машине перетирают друг друга. На OpenWrt работает fw4 с политикой по умолчанию: всё входящее с WAN отклоняется, LAN доверенный.

На хосте включи firewall уровня датацентра и ограничь управление подсетью LAN. Набор IP с именем management Proxmox использует специально: доступ к 8006 и 22 из него разрешается автоматически.


# Файл /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
# откат из локальной консоли, если заперся:
# pve-firewall stop

Не включай firewall Proxmox на сетевых адаптерах самой ВМ OpenWrt. Роутер фильтрует трафик сам, а лишний слой conntrack на мосту ломает асимметричные потоки и добавляет задержку.

fail2ban на веб-интерфейс. На Debian 13 логи живут в journald, поэтому backend обязательно systemd. Фильтр ловит неудачные входы в pvedaemon.


# Где выполнять: хост 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

Проверка: введи неверный пароль в веб-интерфейсе три раза с тестовой машины. В выводе fail2ban-client status proxmox появится её адрес. Разбань его командой fail2ban-client set proxmox unbanip и адресом.

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


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

Отдельный пользователь. Базы данных в этой схеме нет, поэтому роль отдельной учётки БД играет отдельный пользователь Proxmox для ежедневной работы. root@pam оставь для аварий, а себе заведи пользователя с ограниченной ролью и включи ему TOTP в веб-интерфейсе.


# Где выполнять: хост Proxmox
pveum user add andrey@pve --comment "Ежедневная работа"
pveum passwd andrey@pve
pveum acl modify /vms -user andrey@pve -role PVEVMAdmin
pveum user permissions andrey@pve

Ограничения по IP. Веб-интерфейс Proxmox и LuCI доступны только из LAN, это уже обеспечено схемой: у хоста нет адреса на WAN, а fw4 режет вход на роутер. Если нужен удалённый доступ - поднимай WireGuard на OpenWrt и заходи через туннель. Проброс 8006 наружу не делай никогда.

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

Один роутер без бэкапа конфига - это 43 правила firewall, которые ты восстанавливаешь по памяти в три ночи. Вспомнишь 41. Оставшиеся два всплывут через месяц.

Что бэкапить Как часто Где хранить Как восстановить
Конфиг OpenWrt, sysupgrade -b Ежедневно и перед изменениями Хост, затем NAS или PBS sysupgrade -r с архивом и перезагрузка
ВМ 100 целиком, vzdump Раз в неделю Proxmox Backup Server или отдельный диск qmrestore поверх или в новую ВМ
Снапшот ВМ Перед каждым обновлением То же хранилище, где диск qm rollback
/etc/network/interfaces, /etc/hosts, /etc/pve При каждом изменении сети Вне хоста Копирование файлов обратно и ifreload

Скрипт ежедневного бэкапа конфига OpenWrt на хост. Ключ хоста мы положили в Dropbear на шаге 10. Флаг -O у scp нужен потому, что современный OpenSSH по умолчанию ходит через SFTP, а у Dropbear SFTP-сервера нет.


# Где выполнять: хост Proxmox
cat > /usr/local/bin/openwrt-backup.sh < /etc/backup-packages.txt; sysupgrade -b /tmp/$F"
scp -O -o BatchMode=yes "$OWRT:/tmp/$F" "$DST/"
ssh -o BatchMode=yes "$OWRT" "rm -f /tmp/$F"
find "$DST" -name 'owrt-*.tar.gz' -mtime +30 -delete
EOF
chmod +x /usr/local/bin/openwrt-backup.sh
echo '30 3 * * * root /usr/local/bin/openwrt-backup.sh' > /etc/cron.d/openwrt-backup
/usr/local/bin/openwrt-backup.sh && ls -lh /root/backup/openwrt/

Еженедельный vzdump через задание в датацентре. Режим snapshot с работающим агентом замораживает файловую систему ВМ на долю секунды, роутер при этом не перезагружается.


# Где выполнять: хост Proxmox, хранилище замени на своё
pvesh create /cluster/backup --schedule "sun 03:00" --vmid 100 \
  --storage local --mode snapshot --compress zstd \
  --prune-backups keep-last=4 --comment "OpenWrt weekly"
pvesh get /cluster/backup
vzdump 100 --storage local --mode snapshot --compress zstd

Последняя команда делает внеочередной бэкап прямо сейчас. Сделай его, чтобы убедиться, что задание вообще работает.

Восстановление. Бэкап, который ни разу не восстанавливали, это не бэкап, а надежда. Раз в квартал разворачивай копию в отдельную ВМ с номером 900 без сети и проверяй, что она грузится.


# Где выполнять: хост Proxmox
ls /var/lib/vz/dump/ | grep qemu-100
qmrestore /var/lib/vz/dump/vzdump-qemu-100-ДАТА.vma.zst 900 --unique 1
qm set 900 --net0 virtio,bridge=vmbr1,link_down=1 --net1 virtio,bridge=vmbr0,link_down=1 --onboot 0
qm start 900 && qm terminal 900

# Где выполнять: SSH в OpenWrt, восстановление только конфига
sysupgrade -r /tmp/owrt-ДАТА.tar.gz
reboot

Обновление

Обновление OpenWrt внутри ветки 25.12. Перед любым обновлением снапшот. Это 2 секунды, которые экономят вечер.


# Где выполнять: хост Proxmox
qm snapshot 100 pre-upgrade --description "Перед обновлением OpenWrt"
qm listsnapshot 100

Самый удобный путь - Attended Sysupgrade. В 25.12 он стоит по умолчанию: в LuCI есть пункт System, Attended Sysupgrade, а в консоли утилита owut. Сервер сборки сам соберёт образ с твоими пакетами.


# Где выполнять: SSH в OpenWrt
apk add owut
owut check
owut upgrade

Ручной путь, если ASU недоступен. Скачай новый combined-efi образ прямо в /tmp роутера, там файловая система в RAM, и 512 МБ памяти хватает. Ключ -v показывает, какие файлы конфигурации переносятся.


# Где выполнять: SSH в OpenWrt, номер версии замени на новый
cd /tmp
wget https://downloads.openwrt.org/releases/25.12.6/targets/x86/64/openwrt-25.12.6-x86-64-generic-ext4-combined-efi.img.gz
sysupgrade -v /tmp/openwrt-25.12.6-x86-64-generic-ext4-combined-efi.img.gz

После перезагрузки поставь пакеты из сохранённого списка, проверь интернет и агент. Не обновляй все пакеты разом через apk upgrade. В OpenWrt система и пакеты собираются как единое целое, и массовое обновление на живом роутере - классический способ получить несовместимые библиотеки.

Переход между мажорными ветками, например с 24.10 на 25.12, я делаю по схеме сине-зелёного развёртывания. Новая ВМ из свежего образа, конфиг из бэкапа через sysupgrade -r, переключение мостов, старую ВМ держу выключенной неделю. Откат в этом случае занимает 20 секунд.

Откат минорного обновления, если что-то сломалось.


# Где выполнять: хост Proxmox
qm rollback 100 pre-upgrade
qm start 100
# когда всё работает несколько дней:
qm delsnapshot 100 pre-upgrade

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


# Где выполнять: хост Proxmox
vzdump 100 --storage local --mode snapshot --compress zstd
apt update
apt list --upgradable
apt full-upgrade
pveversion -v | head -5
proxmox-boot-tool kernel list

Если после обновления ядра что-то сломалось в сети или пробросе, вернись на предыдущее ядро без переустановки. Закрепи его и перезагрузись.


# Где выполнять: хост Proxmox, версию возьми из kernel list
proxmox-boot-tool kernel pin 6.17.2-1-pve
reboot
# когда исправленное ядро выйдет:
# proxmox-boot-tool kernel unpin

Для переходов между мажорными версиями Proxmox есть отдельные утилиты проверки, например pve8to9 для перехода с 8 на 9. Запускай её с ключом --full до обновления и чини всё, что она нашла. Предупреждения там пишут не для красоты.

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

Почему OpenWrt на Proxmox не раздаёт интернет после настройки?

В девяти случаях из десяти перепутаны сетевые адаптеры или совпали подсети LAN и WAN. Проверь, что net0 подключён к LAN-мосту, net1 к WAN-мосту, и что LAN роутера не в 192.168.1.0/24, если роутер провайдера там же. Оставшийся десятый случай обычно DNS: пинг по IP проходит, сайты не открываются.

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

С хоста выполни qm agent 100 ping и пинг до 1.1.1.1, внутри OpenWrt посмотри ifstatus wan и /tmp/dhcp.leases. С клиента в LAN проверь, что он получил адрес из пула роутера и открывает сайты по имени. Последний тест - попытка открыть порт 8006 на белом адресе снаружи, она должна закончиться таймаутом.

Что делать, если OpenWrt на Proxmox не загружается с UEFI?

Почти всегда виноват Secure Boot: при создании ВМ через веб-интерфейс по умолчанию стоят предзагруженные ключи. Удали efidisk0 и создай его заново с параметром pre-enrolled-keys=0. Если не помогло, проверь, что образ именно combined-efi, а порядок загрузки указывает на scsi0.

Чем OpenWrt в виртуальной машине отличается от OpenWrt в LXC-контейнере?

ВМ запускает собственное ядро OpenWrt со всеми модулями, изолирована от хоста и снапшотится вместе с состоянием. Контейнер использует ядро Proxmox, поэтому часть сетевых функций недоступна, а обновление ядра хоста может изменить поведение роутера. Для основного роутера сети бери ВМ, контейнер оставь для тестов.

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

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

Сколько памяти и ядер нужно OpenWrt на Proxmox?

Для обычного роутера хватает одного-двух ядер и 256-512 МБ памяти. Больше нужно под adblock с большими списками, WireGuard на гигабитном канале или SQM. Динамическую память для этой ВМ лучше отключить.

Какой образ OpenWrt выбрать для Proxmox: ext4 или squashfs?

Для ВМ удобнее ext4: раздел проще расширить и починить, а откат к рабочему состоянию даёт снапшот Proxmox. Squashfs полезен на железе, где нужен сброс к заводским настройкам без внешних инструментов. Для OVMF бери вариант с efi в имени, для SeaBIOS без него.

Как обновить OpenWrt в Proxmox без потери настроек?

Сделай снапшот ВМ, сохрани конфиг через sysupgrade -b и обнови через Attended Sysupgrade, он соберёт образ с твоими пакетами. Ручной sysupgrade тоже сохраняет конфиги, но пакеты придётся поставить заново. Если что-то сломалось, qm rollback вернёт ВМ в состояние до обновления за секунды.

Прогноз: что у тебя теперь работает

Мы собрали роутер на OpenWrt 25.12 внутри Proxmox: два моста с понятным назначением, ВМ на virtio без Secure Boot, агент для корректных бэкапов и автозапуск первым номером. Хост переехал за роутер с таймером автоотката и больше не светит веб-интерфейсом в интернет. Сверху легли fail2ban, ключи вместо паролей, ограничение управления подсетью LAN.

Дальше роутер живёт сам: конфиг уезжает в бэкап каждую ночь, ВМ раз в неделю, а перед любым обновлением есть снапшот и одна команда отката. Следующий логичный шаг - WireGuard на OpenWrt для удалённого доступа к домашней сети и к тому же Proxmox. Без проброса портов и без нервов. Роутер виртуальный, а инциденты у него вполне настоящие. Просто теперь они закрываются за минуту.

Не заработало?
Если не заработало — пиши в комментарии, разберёмся. Приложи вывод qm config 100 с хоста, ifstatus wan из OpenWrt и описание, на каком шаге всё пошло не так. С этими данными найти причину обычно получается за пару сообщений.

Андрей А.
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 не будет опубликован. Обязательные поля помечены *

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